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);
        }
Exemplo n.º 4
0
        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");
        }