예제 #1
0
        public void SlidingExpiration()
        {
            var cache    = CreateCache();
            var fileSize = 10;

            var slide = TimeSpan.FromMilliseconds(200);
            var calls = 10;

            var part = new TimeSpan(2 * slide.Ticks / calls);

            var data = FullRead(cache, 123);

            Assert.IsNull(data);
            //expired long time ago
            cache.AddOrUpdateStream(123, GetRandomFile(fileSize), CancellationToken.None,
                                    CacheExpirationPolicy.SlidingUtc(slide));

            for (int i = 0; i < calls; i++)
            {
                data = FullRead(cache, 123);
                Assert.IsNotNull(data);
                Assert.AreEqual(fileSize, data.Length);
                cache.GarbageCollect(CancellationToken.None); //here is expired one collected
                Thread.Sleep(part);
            }

            Thread.Sleep(new TimeSpan(2 * slide.Ticks));
            cache.GarbageCollect(CancellationToken.None); //here is expired one collected

            data = FullRead(cache, 123);
            Assert.IsNull(data);

            AssertNoGarbageFiles(cache);
        }
예제 #2
0
        public void LockedForReadFileGc()
        {
            var cache    = CreateCache();
            var fileSize = 10;
            var data     = FullRead(cache, 123);

            Assert.IsNull(data);
            cache.AddOrUpdateStream(123, GetRandomFile(fileSize), CancellationToken.None,
                                    CacheExpirationPolicy.AbsoluteUtc(DateTime.MinValue));
            data = FullRead(cache, 123);
            Assert.IsNotNull(data);

            var ms = new MemoryStream();

            using (var s = cache.TryGetStream(123, CancellationToken.None))
            {
                cache.GarbageCollect(CancellationToken.None); //item is expired but will not be collected.
                s.CopyTo(ms);
            }

            data = FullRead(cache, 123);
            Assert.IsNull(data);

            AssertHasCachedFiles(cache);

            cache.GarbageCollect(CancellationToken.None); //trash collected if not collected on read.

            AssertNoCachedFiles(cache);
            AssertNoGarbageFiles(cache);
        }
예제 #3
0
        public void LockedForReadHardlinkGc()
        {
            try
            {
                var cache    = CreateCache();
                var fileSize = 1 * 1024 * 1024; // 1 mb

                cache.AddOrUpdateStream(123, GetRandomFile(fileSize), CancellationToken.None,
                                        CacheExpirationPolicy.AbsoluteUtc(DateTime.MinValue));
                var data = FullRead(cache, 123);
                Assert.IsNotNull(data);


                var targetFilePath = GetRandomPath();
                Assert.IsTrue(cache.TryGetFile(123, CancellationToken.None, targetFilePath));
                try
                {
                    AssertFile(targetFilePath, fileSize);
                    AssertHasCachedFiles(cache);

                    using (var s = File.OpenRead(targetFilePath))
                    {
                        var bytes = new byte[8 * 1024];
                        Assert.IsTrue(s.Read(bytes, 0, bytes.Length) > 0);
                        cache.GarbageCollect(CancellationToken.None);
                    }

                    AssertFile(targetFilePath, fileSize);//item is expired, collected, but available to user

                    data = FullRead(cache, 123);
                    Assert.IsNull(data);

                    cache.GarbageCollect(CancellationToken.None); //trash collected if not collected on read.

                    AssertNoCachedFiles(cache);
                    AssertNoGarbageFiles(cache);

                    AssertFile(targetFilePath, fileSize);
                }
                finally
                {
                    File.Delete(targetFilePath);
                }
            }
            catch
            {
                DeleteRandomPaths();
            }
        }
예제 #4
0
        public async Task AsyncLockedForReadFileGc()
        {
            try
            {
                var cache    = CreateCache();
                var fileSize = 1 * 1024;
                var data     = FullRead(cache, 123);
                Assert.IsNull(data);
                var tasks = Enumerable.Range(0, 20).Select(i =>
                {
                    try
                    {
                        var filePath = GetRandomPath();
                        cache.GetFileOrAddStream(123, x => GetRandomFile(fileSize), CancellationToken.None, filePath,
                                                 CacheExpirationPolicy.AbsoluteUtc(DateTime.MinValue));
                        cache.GarbageCollect(CancellationToken.None);
                        while (true)
                        {
                            try
                            {
                                AssertFile(filePath, fileSize);
                                break;
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e);
                            }
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                        throw;
                    }
                    return(Task.CompletedTask);
                }).ToArray();

                await Task.WhenAll(tasks);

                cache.GarbageCollect(CancellationToken.None); //trash collected if not collected on read.

                AssertNoCachedFiles(cache);
                AssertNoGarbageFiles(cache);
            }
            finally
            {
                DeleteRandomPaths();
            }
        }
예제 #5
0
        public void AbsoluteExpiration()
        {
            var cache    = CreateCache();
            var fileSize = 1 * 1024;

            var data = FullRead(cache, 123);

            Assert.IsNull(data);
            //expired long time ago
            cache.AddOrUpdateStream(123, GetRandomFile(fileSize), CancellationToken.None,
                                    CacheExpirationPolicy.AbsoluteUtc(DateTime.MinValue));

            data = FullRead(cache, 123);
            Assert.IsNotNull(data);
            Assert.AreEqual(fileSize, data.Length);

            cache.GarbageCollect(CancellationToken.None); //here is expired one collected

            data = FullRead(cache, 123);
            Assert.IsNull(data);

            AssertNoGarbageFiles(cache);
        }
예제 #6
0
        public static async Task GetOrAddAsync_TwoTimesCalledWithNoDateTimeExpire_ResultAlwaysTheSameAndGetValueFuncCalledOneTime(ICache <int, string> cache)
        {
            const string testValue = "Test1";

            var getValueCalled  = false;
            var getValueCalled1 = false;
            var getValueCalled2 = false;
            var value           = await cache.GetOrAddAsync(1, () =>
            {
                getValueCalled = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterAbsoluteDateTime(DateTime.Now.AddMilliseconds(400))).ConfigureAwait(false);

            Assert.Equal(testValue, value);

            await Task.Delay(50).ConfigureAwait(false);

            var secondValue = await cache.GetOrAddAsync(1, () =>
            {
                getValueCalled1 = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterAbsoluteDateTime(DateTime.Now.AddMilliseconds(400))).ConfigureAwait(false);

            await Task.Delay(400).ConfigureAwait(false);

            var thirdValue = await cache.GetOrAddAsync(1, () =>
            {
                getValueCalled2 = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterAbsoluteDateTime(DateTime.Now.AddMilliseconds(200))).ConfigureAwait(false);

            Assert.Equal(testValue, secondValue);
            Assert.Equal(testValue, thirdValue);
            Assert.True(getValueCalled);
            Assert.False(getValueCalled1);
            Assert.True(getValueCalled2);
        }
예제 #7
0
        public static async Task GetOrAdd_TwoTimesCalledWithNoTimeSpanExpire_ResultAlwaysTheSameAndGetValueFuncCalledOneTime(ICache <int, string> cache)
        {
            const string testValue = "Test1";

            var getValueCalled  = false;
            var getValueCalled1 = false;
            var getValueCalled2 = false;
            var value           = cache.GetOrAdd(1, () =>
            {
                getValueCalled = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterSlidingTimeSpan(TimeSpan.FromMilliseconds(2000)));

            Assert.Equal(testValue, value);

            await Task.Delay(1500).ConfigureAwait(false);

            var secondValue = cache.GetOrAdd(1, () =>
            {
                getValueCalled1 = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterSlidingTimeSpan(TimeSpan.FromMilliseconds(2000)));

            await Task.Delay(1500).ConfigureAwait(false);

            var thirdValue = cache.GetOrAdd(1, () =>
            {
                getValueCalled2 = true;
                return(testValue);
            }, CacheExpirationPolicy.AfterSlidingTimeSpan(TimeSpan.FromMilliseconds(1500)));

            Assert.Equal(testValue, secondValue);
            Assert.Equal(testValue, thirdValue);
            Assert.True(getValueCalled);
            Assert.False(getValueCalled1);
            Assert.False(getValueCalled2);
        }
예제 #8
0
        public static async Task GetOrAddAsync_TwoTimesCalledWithDateTimeExpire_ResultAlwaysTheSameAndGetValueFuncCalledTwoTime(ICache <int, string> cache)
        {
            const string testValue = "Test1";

            var getValueCalledCount = 0;
            var value = await cache.GetOrAddAsync(1, () =>
            {
                getValueCalledCount++;
                return(testValue);
            }, CacheExpirationPolicy.AfterAbsoluteDateTime(DateTime.Now.AddMilliseconds(50))).ConfigureAwait(false);

            Assert.Equal(testValue, value);

            await Task.Delay(100).ConfigureAwait(false);

            var secondValue = await cache.GetOrAddAsync(1, () =>
            {
                getValueCalledCount++;
                return(testValue);
            }, CacheExpirationPolicy.NeverExpire).ConfigureAwait(false);

            Assert.Equal(testValue, secondValue);
            Assert.Equal(2, getValueCalledCount);
        }
예제 #9
0
 /// <summary>
 /// CTOR
 /// </summary>
 public InMemoryCacheConfiguration()
 {
     ExpirationTime   = TimeSpan.FromMinutes(5);
     ExpirationPolicy = CacheExpirationPolicy.Sliding;
     DataProvider     = new InMemoryDataProvider();
 }