public async Task GetOrSet_FourSimultaneous()
        {
            await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()))
            {
                await cacheStack.SetAsync("GetOrSet", new CacheEntry <int>(15, DateTime.UtcNow.AddDays(-1)));

                for (var i = 0; i < WorkIterations; i++)
                {
                    var task1 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) =>
                    {
                        await Task.Delay(30);
                        return(12);
                    }, new CacheSettings(TimeSpan.FromDays(1)));
                    var task2 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) =>
                    {
                        await Task.Delay(30);
                        return(12);
                    }, new CacheSettings(TimeSpan.FromDays(1)));
                    var task3 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) =>
                    {
                        await Task.Delay(30);
                        return(12);
                    }, new CacheSettings(TimeSpan.FromDays(1)));
                    var task4 = cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) =>
                    {
                        await Task.Delay(30);
                        return(12);
                    }, new CacheSettings(TimeSpan.FromDays(1)));

                    await task1;
                    await task2;
                    await task3;
                    await task4;
                }
            }
        }
 public async Task CacheTower_MemoryCacheLayer_ViaCacheStack()
 {
     await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()))
     {
         await LoopActionAsync(Iterations, async() =>
         {
             await cacheStack.SetAsync("TestKey", 123, TimeSpan.FromDays(1));
             await cacheStack.GetAsync <int>("TestKey");
             await cacheStack.GetOrSetAsync <string>("GetOrSet_TestKey", (old) =>
             {
                 return(Task.FromResult("Hello World"));
             }, new CacheSettings(TimeSpan.FromDays(1), TimeSpan.FromDays(1)));
         });
     }
 }
Beispiel #3
0
        public async Task GetOrSet_UnderLoad()
        {
            await using (var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>()))
            {
                await cacheStack.SetAsync("GetOrSet", new CacheEntry <int>(15, DateTime.UtcNow.AddDays(-1)));

                Parallel.For(0, WorkIterations, async value =>
                {
                    await cacheStack.GetOrSetAsync <int>("GetOrSet", async(old) =>
                    {
                        await Task.Delay(30);
                        return(12);
                    }, new CacheSettings(TimeSpan.FromDays(1)));
                });
            }
        }
Beispiel #4
0
        public async Task GetOrSet_BackPropagatesToEarlierCacheLayers()
        {
            var layer1 = new MemoryCacheLayer();
            var layer2 = new MemoryCacheLayer();
            var layer3 = new MemoryCacheLayer();

            await using var cacheStack = new CacheStack(new[] { layer1, layer2, layer3 }, Array.Empty <ICacheExtension>());
            var cacheEntry = new CacheEntry <int>(42, TimeSpan.FromDays(1));
            await layer2.SetAsync("GetOrSet_BackPropagatesToEarlierCacheLayers", cacheEntry);

            var cacheEntryFromStack = await cacheStack.GetOrSetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers", (old) =>
            {
                return(Task.FromResult(14));
            }, new CacheSettings(TimeSpan.FromDays(1), TimeSpan.FromMinutes(1)));

            Assert.AreEqual(cacheEntry.Value, cacheEntryFromStack);

            //Give enough time for the background task back propagation to happen
            await Task.Delay(2000);

            Assert.AreEqual(cacheEntry, await layer1.GetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers"));
            Assert.IsNull(await layer3.GetAsync <int>("GetOrSet_BackPropagatesToEarlierCacheLayers"));
        }
Beispiel #5
0
        public async Task GetOrSet_CacheHitBackgroundRefresh()
        {
            await using var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>());
            var cacheEntry = new CacheEntry <int>(17, DateTime.UtcNow.AddDays(1));
            await cacheStack.SetAsync("GetOrSet_CacheHitBackgroundRefresh", cacheEntry);

            var waitingOnBackgroundTask = new TaskCompletionSource <int>();

            var result = await cacheStack.GetOrSetAsync <int>("GetOrSet_CacheHitBackgroundRefresh", (oldValue) =>
            {
                waitingOnBackgroundTask.TrySetResult(27);
                return(Task.FromResult(27));
            }, new CacheSettings(TimeSpan.FromDays(2), TimeSpan.Zero));

            Assert.AreEqual(17, result);

            await waitingOnBackgroundTask.Task;
            //Give 400ms to return the value and set it to the MemoryCacheLayer
            await Task.Delay(400);

            var refetchedResult = await cacheStack.GetAsync <int>("GetOrSet_CacheHitBackgroundRefresh");

            Assert.AreEqual(27, refetchedResult.Value);
        }
Beispiel #6
0
 public async Task GetOrSet_ThrowsOnNullGetter()
 {
     var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>());
     await cacheStack.GetOrSetAsync <int>("MyCacheKey", null, new CacheSettings(TimeSpan.FromDays(1)));
 }
Beispiel #7
0
 public async Task GetOrSet_ThrowsOnNullKey()
 {
     var cacheStack = new CacheStack(new[] { new MemoryCacheLayer() }, Array.Empty <ICacheExtension>());
     await cacheStack.GetOrSetAsync <int>(null, (old) => Task.FromResult(5), new CacheSettings(TimeSpan.FromDays(1)));
 }