Exemplo n.º 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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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));
        }
Exemplo n.º 6
0
 private void WaitUntilTwoThreadsPickedLockObjectsUp(TestLocksCollection <string, InMemoryCache.CachedObjectLock> dic)
 {
     WaitUntil(() => dic.numberOfCalls == 2);
 }