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); }
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)); }