public async Task EvictsFromChannelButNotFromRegisteredCacheStack() { var connection = RedisHelper.GetConnection(); var completionSource = new TaskCompletionSource <bool>(); await connection.GetSubscriber().SubscribeAsync("CacheTower.RemoteEviction", (channel, value) => { if (value == "TestKey") { completionSource.SetResult(true); } }); var cacheStackMock = new Mock <ICacheStack>(); var extension = new RedisRemoteEvictionExtension(connection); extension.Register(cacheStackMock.Object); await extension.OnValueRefreshAsync("TestKey", TimeSpan.FromDays(1)); var completedTask = await Task.WhenAny(completionSource.Task, Task.Delay(TimeSpan.FromSeconds(30))); Assert.AreEqual(completionSource.Task, completedTask, "Subscribers were not notified about the refreshed value within the time limit"); cacheStackMock.Verify(c => c.EvictAsync("TestKey"), Times.Never, "The CacheStack that published the refresh was told to evict its own cache"); }
protected override void SetupBenchmark() { base.SetupBenchmark(); CacheExtension = new RedisRemoteEvictionExtension(RedisHelper.GetConnection(), new ICacheLayer[] { new MemoryCacheLayer() }); RedisHelper.FlushDatabase(); }
public void ThrowForRegisteringMoreThanOneCacheStack() { var extension = new RedisRemoteEvictionExtension(RedisHelper.GetConnection()); var cacheStackMock = new Mock <ICacheStack>(); extension.Register(cacheStackMock.Object); extension.Register(cacheStackMock.Object); }
public async Task RemoteEvictionOccursOnLocalEviction() { RedisHelper.FlushDatabase(); var connection = RedisHelper.GetConnection(); var cacheStackMockOne = new Mock <ICacheStack>(); var cacheLayerOne = new Mock <ICacheLayer>(); var extensionOne = new RedisRemoteEvictionExtension(connection, new ICacheLayer[] { cacheLayerOne.Object }); extensionOne.Register(cacheStackMockOne.Object); var cacheStackMockTwo = new Mock <ICacheStack>(); var cacheLayerTwo = new Mock <ICacheLayer>(); var extensionTwo = new RedisRemoteEvictionExtension(connection, new ICacheLayer[] { cacheLayerTwo.Object }); extensionTwo.Register(cacheStackMockTwo.Object); var completionSource = new TaskCompletionSource <bool>(); connection.GetSubscriber().Subscribe("CacheTower.RemoteEviction").OnMessage(channelMessage => { if (channelMessage.Message == "TestKey") { completionSource.SetResult(true); } else { completionSource.SetResult(false); } }); await extensionOne.OnCacheEvictionAsync("TestKey"); var succeedingTask = await Task.WhenAny(completionSource.Task, Task.Delay(TimeSpan.FromSeconds(10))); if (!succeedingTask.Equals(completionSource.Task)) { RedisHelper.DebugInfo(connection); Assert.Fail("Subscriber response took too long"); } Assert.IsTrue(completionSource.Task.Result, "Subscribers were not notified about the refreshed value"); await Task.Delay(500); cacheLayerOne.Verify(c => c.EvictAsync("TestKey"), Times.Never, "Eviction took place locally where it should have been skipped"); cacheLayerTwo.Verify(c => c.EvictAsync("TestKey"), Times.Once, "Eviction was skipped where it should have taken place locally"); }
public async Task RemoteFlush() { RedisHelper.FlushDatabase(); var connection = RedisHelper.GetConnection(); var cacheStackMockOne = new Mock <ICacheStack>(); var cacheLayerOne = new Mock <ICacheLayer>(); var extensionOne = new RedisRemoteEvictionExtension(connection, new ICacheLayer[] { cacheLayerOne.Object }); extensionOne.Register(cacheStackMockOne.Object); var cacheStackMockTwo = new Mock <ICacheStack>(); var cacheLayerTwo = new Mock <ICacheLayer>(); var extensionTwo = new RedisRemoteEvictionExtension(connection, new ICacheLayer[] { cacheLayerTwo.Object }); extensionTwo.Register(cacheStackMockTwo.Object); var completionSource = new TaskCompletionSource <bool>(); connection.GetSubscriber().Subscribe("CacheTower.RemoteFlush").OnMessage(channelMessage => { if (channelMessage.Message == StackExchange.Redis.RedisValue.EmptyString) { completionSource.SetResult(true); } else { completionSource.SetResult(false); } }); await extensionOne.OnCacheFlushAsync(); var succeedingTask = await Task.WhenAny(completionSource.Task, Task.Delay(TimeSpan.FromSeconds(10))); Assert.AreEqual(completionSource.Task, succeedingTask, "Subscriber response took too long"); Assert.IsTrue(completionSource.Task.Result, "Subscribers were not notified about the flush"); await Task.Delay(500); cacheLayerOne.Verify(c => c.FlushAsync(), Times.Never, "Flush took place locally where it should have been skipped"); cacheLayerTwo.Verify(c => c.FlushAsync(), Times.Once, "Flush was skipped where it should have taken place locally"); }