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