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); }
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); }