public void RecentValueTimesOut( ) { var innerFactory = new DummyCacheFactory(); var cache = CreateCache(innerFactory, new TimeSpan(0, 0, 1)); using (ManualResetEvent evt = new ManualResetEvent(false)) { ItemsRemovedEventHandler <string> handler = (sender, args) => { // ReSharper disable once AccessToDisposedClosure evt.Set( ); }; cache.ItemsRemoved += handler; cache.Add("a", "a"); cache.Add("b", "b"); innerFactory.Inner.Clear( ); evt.WaitOne(5000); cache.ItemsRemoved -= handler; } string value; Assert.That(cache.TryGetValue("a", out value), Is.False); Assert.That(cache.TryGetOrAdd("b", out value, (k) => "c"), Is.False); }
public void EnsureCallbackThrottled( ) { var innerFactory = new DummyCacheFactory( ); EDC.Cache.ICache <string, string> cache = CreateCache(innerFactory, new TimeSpan(0, 0, 1)); string key = "1"; int callCount = 0; Action action = () => { string result; cache.TryGetOrAdd(key, out result, key1 => { Interlocked.Increment(ref callCount); return("A"); }); cache.Remove(key); }; Stopwatch sw = new Stopwatch( ); sw.Start( ); int runCount = 0; while (sw.ElapsedMilliseconds < 3000) { action( ); Thread.Sleep(10); Interlocked.Increment(ref runCount); } Assert.That(runCount, Is.GreaterThan(250).And.LessThan(350)); Assert.That(callCount, Is.GreaterThan(1).And.LessThan(6)); }
public void DoesBypassesForSecondaryIdentity() { var innerFactory = new DummyCacheFactory(); var cache = CreateCache(innerFactory, new TimeSpan(1, 0, 0), TimeSpan.Zero); var user1 = Entity.Create <UserAccount>(); var user2 = Entity.Create <UserAccount>(); cache.Add("a", "a"); innerFactory.Inner.Clear(); string value; Assert.That(cache.TryGetValue("a", out value), Is.True); using (new SetUser(user1, user2)) { cache.Remove("a"); } using (new SetUser(user2)) { Assert.That(cache.TryGetValue("a", out value), Is.False); } }
public void DoesNotBypassesForOtherUsers( ) { var innerFactory = new DummyCacheFactory(); var cache = CreateCache(innerFactory, new TimeSpan(0, 0, 1)); var invalidator = ((ICacheService)cache).CacheInvalidator; var user1 = Entity.Create <UserAccount>(); var user2 = Entity.Create <UserAccount>(); cache.Add("a", "a"); innerFactory.Inner.Clear(); string value; Assert.That(cache.TryGetValue("a", out value), Is.True); using (new SetUser(user1)) { invalidator.OnRelationshipChange(new List <EntityRef>()); } using (new SetUser(user2)) { Assert.That(cache.TryGetValue("a", out value), Is.True); } }
public void BypassesForRecentUserChanges(Action <ICacheInvalidator> act, bool delay) { var innerFactory = new DummyCacheFactory(); var cache = CreateCache(innerFactory, new TimeSpan(0, 0, 1)); var invalidator = ((ICacheService)cache).CacheInvalidator; var user = Entity.Create <UserAccount>(); cache.Add("a", "a"); innerFactory.Inner.Clear(); string value; Assert.That(cache.TryGetValue("a", out value), Is.True); if (delay) { Thread.Sleep(1005); } using (new SetUser(user)) { act(invalidator); Assert.That(cache.TryGetValue("a", out value), Is.EqualTo(!delay)); } }
EDC.Cache.ICache <string, string> CreateCache(DummyCacheFactory innerFactory, TimeSpan expire, TimeSpan recent) { var factory = new DelayedInvalidateCacheFactory { Inner = innerFactory, ExpirationInterval = expire, GlobalThresholdTicks = recent }; return(factory.Create <string, string>("Test Cache")); }
EDC.Cache.ICache <string, string> CreateCache(DummyCacheFactory innerFactory, TimeSpan expire) { var factory = new DelayedInvalidateCacheFactory { Inner = innerFactory, ExpirationInterval = expire }; return(factory.Create <string, string>("Test Cache")); }
public void InvalidatesDontBubble() { var innerFactory = new DummyCacheFactory(); var cache = CreateCache(innerFactory, new TimeSpan(1, 0, 0)); cache.Add("a", "a"); cache.Add("b", "b"); string value; Assert.That(cache.TryGetValue("a", out value), Is.True); Assert.That(cache.TryGetOrAdd("b", out value, (k) => { Assert.Fail(); return(""); }), Is.True); innerFactory.Inner.Clear(); Assert.That(cache.TryGetValue("a", out value), Is.True); Assert.That(cache.TryGetOrAdd("b", out value, (k) => { Assert.Fail(); return(""); }), Is.True); }