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 IfExceptionThrown_LockedCallsShouldAlsoThrow_NotReturnNull() { var locksCollection = new TestLocksCollection <string, InMemoryCache.CachedObjectLock>(); ICache cache = new InMemoryCache(locksCollection); var thread1CacheController = new UnitTestThreadCacheController(); thread1CacheController.hold = true; thread1CacheController.throwException = true; 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); Assert.True(thread1CacheController.exceptionThrown); EnsureReadingFinished(thread2CacheController); Assert.True(thread2CacheController.exceptionThrown); }
public void Cache_KeyShouldBeRemovedFromTheCollectionToAvoidMemoryLeak_TwoThreadsOnTheSameKey() { var locksCollection = new TestLocksCollection <string, InMemoryCache.CachedObjectLock>(); ICache cache = new InMemoryCache(locksCollection); var thread1CacheController = new UnitTestThreadCacheController(); thread1CacheController.hold = true; 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); Assert.True(locksCollection.ContainsKey(thread1CacheController.cacheKey)); thread1CacheController.hold = false; EnsureReadingFinished(thread1CacheController); EnsureReadingFinished(thread2CacheController); Assert.False(locksCollection.ContainsKey(thread1CacheController.cacheKey)); Assert.False(thread1CacheController.exceptionThrown); Assert.False(thread2CacheController.exceptionThrown); }
public void Cache_IsBlockedIfTheSameKeyIsBeingRefreshed() { var locksCollection = new TestLocksCollection <string, InMemoryCache.CachedObjectLock>(); ICache cache = new InMemoryCache(locksCollection); var thread1CacheController = new UnitTestThreadCacheController(); thread1CacheController.hold = true; 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); Assert.False(thread2CacheController.finished); Assert.False(thread1CacheController.finished); thread1CacheController.hold = false; EnsureReadingFinished(thread1CacheController); EnsureReadingFinished(thread2CacheController); Assert.Equal(resultFromThread1, thread1CacheController.result); Assert.Equal(resultFromThread1, thread2CacheController.result); }
public void Cache_KeyShouldBeRemovedFromTheCollectionToAvoidMemoryLeak() { ILocksCollection <string, InMemoryCache.CachedObjectLock> testLocksCollection = new TestLocksCollection <string, InMemoryCache.CachedObjectLock>(); ICache cache = new InMemoryCache(testLocksCollection); var thread1CacheController = new UnitTestThreadCacheController(); thread1CacheController.hold = true; var resultFromThread1 = new object(); FireReadingFromCache(cache, thread1CacheController, resultFromThread1); WaitUntilThreadStartsPopulating(thread1CacheController); Assert.True(testLocksCollection.ContainsKey(thread1CacheController.cacheKey)); thread1CacheController.hold = false; EnsureReadingFinished(thread1CacheController); Assert.False(testLocksCollection.ContainsKey(thread1CacheController.cacheKey)); }
private void WaitUntilTwoThreadsPickedLockObjectsUp(TestLocksCollection <string, InMemoryCache.CachedObjectLock> dic) { WaitUntil(() => dic.numberOfCalls == 2); }