public void BasicCreateAndClean() { Config config = ObjectTestHelper.GetConfigWithCaching(); ObjectMetadataStore metadata = new ObjectMetadataStore(config); ObjectVersionStore versions = new ObjectVersionStore(config, metadata); ObjectIndexerCache cache = new ObjectIndexerCache(metadata, versions); string objectName = "TestObj"; try { // Load up the cache - first we will test that it is not cleaned when it shouldn't be for (int i = 0; i < 20; i++) // generate 20 queries and 80 object Ids { cache.Set( new int[] { 1, 2, 3, 4 }, new object[] { objectName, "Idx" + i + "=2" }); } // Verify the totals Assert.AreEqual(20, cache.EnumerateCache().Count()); CacheTotals totals = cache.Totals; Assert.AreEqual(20, totals.TotalQueries); Assert.AreEqual(80, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); using (var cleaner = new HardPruneCacheCleaner(cache, 50, 200, 2, 500)) // run every half second { // verify properties Assert.AreEqual(50, cleaner.MaxQueries); Assert.AreEqual(200, cleaner.MaxValues); Assert.AreEqual(2, cleaner.ReductionFactor); Assert.AreEqual(500, cleaner.CleanFrequency); Thread.Sleep(700); } // Check that no changes occurred Assert.AreEqual(20, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(20, totals.TotalQueries); Assert.AreEqual(80, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); // Fill to max for (int i = 20; i < 50; i++) { cache.Set( new int[] { 1, 2, 3, 4 }, new object[] { objectName, "Idx" + i + "=2" }); } Assert.AreEqual(50, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(50, totals.TotalQueries); Assert.AreEqual(200, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); using (var cleaner = new HardPruneCacheCleaner(cache, 50, 200, 2, 500)) // run every half second { Thread.Sleep(700); } Assert.AreEqual(50, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(50, totals.TotalQueries); Assert.AreEqual(200, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); // fill to 60 queries - with a cleanFactor of 2 the amount should be cut in half for (int i = 50; i < 60; i++) { cache.Set( new int[] { 1, 2, 3, 4 }, new object[] { objectName, "Idx" + i + "=2" }); } Assert.AreEqual(60, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(60, totals.TotalQueries); Assert.AreEqual(240, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); using (var cleaner = new HardPruneCacheCleaner(cache, 50, 200, 2, 500)) // run every half second { Thread.Sleep(700); } // half of the queries should be gone Assert.AreEqual(30, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(30, totals.TotalQueries); Assert.AreEqual(120, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); // Now overfill for (int i = 100; i < 600; i++) { cache.Set( new int[] { 1, 2, 3, 4 }, new object[] { objectName, "Idx" + i + "=2" }); } Assert.AreEqual(530, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(530, totals.TotalQueries); Assert.AreEqual(2120, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); // this should cut out half using (var cleaner = new HardPruneCacheCleaner(cache, 50, 200, 2, 500)) // run every half second { Thread.Sleep(700); } Assert.AreEqual(265, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(265, totals.TotalQueries); Assert.AreEqual(1060, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); // this should cut out another half using (var cleaner = new HardPruneCacheCleaner(cache, 50, 200, 2, 500)) // run every half second { Thread.Sleep(700); } Assert.AreEqual(133, cache.EnumerateCache().Count()); totals = cache.Totals; Assert.AreEqual(133, totals.TotalQueries); Assert.AreEqual(532, totals.TotalValues); Assert.IsNotNull(cache.Get(new object[] { objectName, "Idx1=2" })); } finally { cache.Dispose(); versions.Dispose(); metadata.Dispose(); } }
public void CreateDefault() { Config config = ObjectTestHelper.GetConfigWithCaching(); ObjectMetadataStore metadata = new ObjectMetadataStore(config); ObjectVersionStore versions = new ObjectVersionStore(config, metadata); ObjectIndexerCache cache = new ObjectIndexerCache(metadata, versions); using (var cleaner = new HardPruneCacheCleaner(cache)) { try { Assert.AreEqual(HardPruneCacheCleaner.DefaultMaxQueries, cleaner.MaxQueries); Assert.AreEqual(HardPruneCacheCleaner.DefaultMaxValues, cleaner.MaxValues); Assert.AreEqual(HardPruneCacheCleaner.DefaultReductionFactor, cleaner.ReductionFactor); Assert.AreEqual(HardPruneCacheCleaner.DefaultCleanFrequency, cleaner.CleanFrequency); } finally { cache.Dispose(); versions.Dispose(); metadata.Dispose(); } } }