Example #1
0
        public void SecondReadStillReturnTheResultOfFirstDespiteCacheExpiredBecauseItWasLocked()
        {
            var    LocksCollection = new TestLocksCollection <string, InMemoryCache.CachedObjectLock>();
            ICache cache           = new InMemoryCacheAllow0Expiry(LocksCollection);

            var thread1CacheController = new UnitTestThreadCacheController();

            thread1CacheController.hold          = true;
            thread1CacheController.expirySeconds = 0;
            var resultFromThread1 = new object();

            var thread2CacheController = new UnitTestThreadCacheController();

            thread2CacheController.cacheKey = thread1CacheController.cacheKey;
            var resultFromThread2 = new object();

            FireReadingFromCache(cache, thread1CacheController, resultFromThread1);

            WaitUntilThreadStartsPopulating(thread1CacheController);

            FireReadingFromCache(cache, thread2CacheController, resultFromThread2);

            WaitUntilTwoThreadsPickedLockObjectsUp(LocksCollection);

            thread1CacheController.hold = false;

            EnsureReadingFinished(thread1CacheController);

            EnsureReadingFinished(thread2CacheController);

            Assert.Equal(resultFromThread1, thread1CacheController.result);
            Assert.Equal(resultFromThread1, thread2CacheController.result);
        }
Example #2
0
        public void Cache_returns_newly_stored_item_after_previous_item_expired()
        {
            // Arrange
            ICache cache = new InMemoryCacheAllow0Expiry();
            var    obj1  = new object();
            var    obj2  = new object();
            var    key   = GenerateUniqueCacheKey();

            cache.Get(key, TimeSpan.FromSeconds(0), () => obj1);

            // Act
            var cacheItem = cache.Get(key, TimeSpan.FromTicks(100), () => obj2);

            // Assert
            Assert.Equal(obj2, cacheItem);
        }