public void SetPopulates_AbsoluteExpiration_IntoScopeLink()
        {
            var    cache = CreateCache();
            var    obj   = new object();
            string key   = "myKey";
            var    time  = new DateTimeOffset(2051, 1, 1, 1, 1, 1, TimeSpan.Zero);

            ICacheEntry entry;

            using (entry = cache.CreateEntry(key))
            {
                Assert.Same(entry, CacheEntryHelper.Current);

                var expirationToken = new TestExpirationToken()
                {
                    ActiveChangeCallbacks = true
                };
                cache.Set(key, obj, new MemoryCacheEntryOptions().SetAbsoluteExpiration(time));
            }

            Assert.Empty(((CacheEntry)entry).ExpirationTokens);
            Assert.NotNull(((CacheEntry)entry).AbsoluteExpiration);
            Assert.Equal(time, ((CacheEntry)entry).AbsoluteExpiration);
        }
Esempio n. 2
0
        public async Task ExpiringEntryDecreasesCacheSize()
        {
            var cache = new MemoryCache(new MemoryCacheOptions
            {
                ExpirationScanFrequency = TimeSpan.Zero,
                SizeLimit = 10
            });

            var entryOptions = new MemoryCacheEntryOptions {
                Size = 5
            };
            var changeToken = new TestExpirationToken();
            var sem         = new SemaphoreSlim(0, 1);

            entryOptions.ExpirationTokens.Add(changeToken);
            entryOptions.PostEvictionCallbacks.Add(new PostEvictionCallbackRegistration
            {
                EvictionCallback = (k, v, r, s) => sem.Release(),
                State            = null
            });

            cache.Set("key", "value", entryOptions);

            Assert.Equal(5, cache.Size);

            // Expire entry
            changeToken.Fire();

            // Trigger compaction
            Assert.Null(cache.Get("key"));

            // Wait for compaction to complete
            Assert.True(await sem.WaitAsync(TimeSpan.FromSeconds(10)));

            Assert.Equal(0, cache.Size);
        }
        public async Task LinkContexts_AreThreadSafe()
        {
            var cache              = CreateCache();
            var key1               = new object();
            var key2               = new object();
            var key3               = new object();
            var key4               = new object();
            var value1             = Guid.NewGuid();
            var value2             = Guid.NewGuid();
            var value3             = Guid.NewGuid();
            var value4             = Guid.NewGuid();
            TestExpirationToken t3 = null;
            TestExpirationToken t4 = null;

            Func <Task> func = async() =>
            {
                t3 = new TestExpirationToken()
                {
                    ActiveChangeCallbacks = true
                };
                t4 = new TestExpirationToken()
                {
                    ActiveChangeCallbacks = true
                };

                value1 = await cache.GetOrCreateAsync(key1, async e1 =>
                {
                    value2 = await cache.GetOrCreateAsync(key2, async e2 =>
                    {
                        await Task.WhenAll(
                            Task.Run(() =>
                        {
                            value3 = cache.Set(key3, Guid.NewGuid(), t3);
                        }),
                            Task.Run(() =>
                        {
                            value4 = cache.Set(key4, Guid.NewGuid(), t4);
                        }));

                        return(Guid.NewGuid());
                    });

                    return(Guid.NewGuid());
                });
            };

            await func();

            Assert.NotNull(cache.Get(key1));
            Assert.NotNull(cache.Get(key2));
            Assert.Equal(value3, cache.Get(key3));
            Assert.Equal(value4, cache.Get(key4));
            Assert.NotEqual(value3, value4);

            t3.Fire();
            Assert.Equal(value4, cache.Get(key4));

            Assert.Null(cache.Get(key1));
            Assert.Null(cache.Get(key2));
            Assert.Null(cache.Get(key3));

            await func();

            Assert.NotNull(cache.Get(key1));
            Assert.NotNull(cache.Get(key2));
            Assert.Equal(value3, cache.Get(key3));
            Assert.Equal(value4, cache.Get(key4));
            Assert.NotEqual(value3, value4);

            t4.Fire();
            Assert.Equal(value3, cache.Get(key3));

            Assert.Null(cache.Get(key1));
            Assert.Null(cache.Get(key2));
            Assert.Null(cache.Get(key4));
        }