public void DoesNotCallbackIfRemoveFromCacheThrowsException()
        {
            CacheItem exceptionThrowingCacheItem = new CacheItem("ThrowException", "value", CacheItemPriority.Normal, new MockRefreshAction(), null);
            exceptionThrowingCacheItem.WillBeExpired = true;
            AddCacheItem("ThrowException", exceptionThrowingCacheItem);

            ExpirationTask expirer = new ExpirationTask(this);
            expirer.SweepExpiredItemsFromCache(inMemoryCache);

            Thread.Sleep(250);

            Assert.AreEqual(0, callbackCount);
        }
        public void RemovalFailureDuringCacheExpirationDoesFireEvents()
        {
            ICacheOperations cacheOperations = new FailingOnRemovalCacheOperations();
            ExpirationTask   expiration      = new ExpirationTask(cacheOperations, instrumentationProvider);

            CacheItem expiredItem1 = new CacheItem(key1, new object(), CacheItemPriority.NotRemovable, new ExceptionThrowingCallback(), new AlwaysExpired());

            cacheOperations.CurrentCacheState.Add(key1, expiredItem1);
            expiredItem1.WillBeExpired = true;

            expiration.SweepExpiredItemsFromCache(cacheOperations.CurrentCacheState);

            Assert.AreEqual(1, instrumentationListener.eventArgs.Count);
            Assert.AreSame(typeof(CacheFailureEventArgs), instrumentationListener.eventArgs[0].GetType());
        }
        public void DoesNotCallbackIfRemoveFromCacheThrowsException()
        {
            CacheItem exceptionThrowingCacheItem = new CacheItem("ThrowException", "value", CacheItemPriority.Normal, new MockRefreshAction(), null);

            exceptionThrowingCacheItem.WillBeExpired = true;
            AddCacheItem("ThrowException", exceptionThrowingCacheItem);

            ExpirationTask expirer           = new ExpirationTask(this, instrumentationProvider);
            int            expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

            Thread.Sleep(250);

            Assert.AreEqual(0, callbackCount);
            Assert.AreEqual(1, expiredItemsCount);
        }
        public void RemovalAfterMarkingDoesNotTriggerSweepForItem()
        {
            CacheItem removedItem = CreateNeverExpiredCacheItem("key", "value");

            removedItem.WillBeExpired = true;
            removedItem.TouchedByUserAction(true);
            AddCacheItem("key", removedItem);

            ExpirationTask expirer           = new ExpirationTask(this, instrumentationProvider);
            int            expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

            Assert.AreEqual("", expiredItemKeys, "Items removed through user action during expiration should not be further expired.");
            Assert.IsFalse(removedItem.WillBeExpired, "User removal of this object should reset its expiration flag");
            Assert.AreEqual(0, expiredItemsCount);
        }
        public void WillDoCallbackAtExpiration()
        {
            CacheItem removedItem = new CacheItem("1", "value", CacheItemPriority.Normal, new MockRefreshAction(), new AlwaysExpired());

            removedItem.WillBeExpired = true;
            AddCacheItem("1", removedItem);

            ExpirationTask expirer           = new ExpirationTask(this, instrumentationProvider);
            int            expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

            Thread.Sleep(250);

            Assert.AreEqual(1, callbackCount, "Refresh action should be taken for expired items if it exists");
            Assert.AreEqual(CacheItemRemovedReason.Expired, callbackReason);
            Assert.AreEqual(1, expiredItemsCount);
        }
        public void ExceptionThrownInCallbackDoesNotStopOtherCallbacksFromExecuting()
        {
            CacheItem exceptionThrowingCacheItem = new CacheItem("ThrowException", "value", CacheItemPriority.Normal, new ExceptionThrowingMockRefreshAction(), null);
            CacheItem normalCacheItem            = new CacheItem("normal", "value2", CacheItemPriority.Normal, new MockRefreshAction(), null);

            exceptionThrowingCacheItem.WillBeExpired = true;
            normalCacheItem.WillBeExpired            = true;
            AddCacheItem("ThrowException", exceptionThrowingCacheItem);
            AddCacheItem("normal", normalCacheItem);

            ExpirationTask expirer           = new ExpirationTask(this, instrumentationProvider);
            int            expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

            Thread.Sleep(250);

            Assert.AreEqual(1, callbackCount, "Second item was still refreshed despite first refresh action throwing exception");
            Assert.AreEqual(CacheItemRemovedReason.Expired, callbackReason);
            Assert.AreEqual(2, expiredItemsCount);
        }
		public void ExceptionThrownInCallbackDoesNotStopOtherCallbacksFromExecuting()
		{
			CacheItem exceptionThrowingCacheItem = new CacheItem("ThrowException", "value", CacheItemPriority.Normal, new ExceptionThrowingMockRefreshAction(), null);
			CacheItem normalCacheItem = new CacheItem("normal", "value2", CacheItemPriority.Normal, new MockRefreshAction(), null);
			exceptionThrowingCacheItem.WillBeExpired = true;
			normalCacheItem.WillBeExpired = true;
			AddCacheItem("ThrowException", exceptionThrowingCacheItem);
			AddCacheItem("normal", normalCacheItem);

			ExpirationTask expirer = new ExpirationTask(this, instrumentationProvider);
			int expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

			Thread.Sleep(250);

			Assert.AreEqual(1, callbackCount, "Second item was still refreshed despite first refresh action throwing exception");
			Assert.AreEqual(CacheItemRemovedReason.Expired, callbackReason);
			Assert.AreEqual(2, expiredItemsCount);
		}
		public void WillDoCallbackAtExpiration()
		{
			CacheItem removedItem = new CacheItem("1", "value", CacheItemPriority.Normal, new MockRefreshAction(), new AlwaysExpired());
			removedItem.WillBeExpired = true;
			AddCacheItem("1", removedItem);

			ExpirationTask expirer = new ExpirationTask(this, instrumentationProvider);
			int expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

			Thread.Sleep(250);

			Assert.AreEqual(1, callbackCount, "Refresh action should be taken for expired items if it exists");
			Assert.AreEqual(CacheItemRemovedReason.Expired, callbackReason);
			Assert.AreEqual(1, expiredItemsCount);
		}
		public void RemovalAfterMarkingDoesNotTriggerSweepForItem()
		{
			CacheItem removedItem = CreateNeverExpiredCacheItem("key", "value");
			removedItem.WillBeExpired = true;
			removedItem.TouchedByUserAction(true);
			AddCacheItem("key", removedItem);

			ExpirationTask expirer = new ExpirationTask(this, instrumentationProvider);
			int expiredItemsCount = expirer.SweepExpiredItemsFromCache(inMemoryCache);

			Assert.AreEqual("", expiredItemKeys, "Items removed through user action during expiration should not be further expired.");
			Assert.IsFalse(removedItem.WillBeExpired, "User removal of this object should reset its expiration flag");
			Assert.AreEqual(0, expiredItemsCount);
		}