コード例 #1
0
        public void GetWithException()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, InfinityTtl)
                          .CreateCache(Getter);

            counter.WithThrow = true;
            var key = 1;

            var t1 = Task.Run(() => cache.Get(key, counter).AsTask());
            var t2 = Task.Run(() => cache.Get(key, counter).AsTask());

            var ex1 = Assert.CatchAsync(() => t1);
            var ex2 = Assert.CatchAsync(() => t2);

            counter.WithThrow = false;

            var t3 = Task.Run(() => cache.Get(key, counter).AsTask());
            var t4 = Task.Run(() => cache.Get(key, counter).AsTask());

            Task.WaitAll(t3, t4);

            var t5 = Task.Run(() => cache.Get(key, counter).AsTask());
            var t6 = Task.Run(() => cache.Get(key, counter).AsTask());

            Task.WaitAll(t5, t6);

            Assert.AreEqual(2, counter.Count);
        }
コード例 #2
0
        public void GetAndOutdateTest()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, TimeSpan.FromSeconds(1))
                          .CreateCache(Getter);
            var keys = new[] { 1 };

            var res1 = cache.Get(keys, counter).Result;

            Task.Delay(1000).Wait();

            var res2Task = cache.Get(keys, counter).AsTask();
            var res3Task = cache.Get(keys, counter).AsTask();

            Task.WaitAll(res2Task, res3Task);
            var res2 = res2Task.Result;
            var res3 = res3Task.Result;

            Task.Delay(1000).Wait();

            var res4Task = cache.Get(keys, counter).AsTask();
            var res5Task = cache.Get(keys, counter).AsTask();

            Task.WaitAll(res4Task, res5Task);
            var res4 = res4Task.Result;
            var res5 = res5Task.Result;

            Assert.AreNotSame(res1.Single().Value, res2.Single().Value);
            Assert.AreSame(res1.Single().Value, res3.Single().Value);
            Assert.AreNotSame(res2.Single().Value, res4.Single().Value);
            Assert.AreSame(res2.Single().Value, res5.Single().Value);

            Assert.AreEqual(3, counter.Count);
        }
コード例 #3
0
        public void GetTest()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, InfinityTtl)
                          .CreateCache(Getter);
            var keys = Enumerable.Range(0, SET_COUNT);
            var t1   = Task.Run(() => cache.Get(keys, counter).AsTask());
            var t2   = Task.Run(() => cache.Get(keys, counter).AsTask());
            var t3   = Task.Run(() => cache.Get(keys, counter).AsTask());

            Task.WaitAll(t1, t2, t3);

            var r1 = new Dictionary <int, Wrapper>(t1.Result);
            var r2 = new Dictionary <int, Wrapper>(t2.Result);
            var r3 = new Dictionary <int, Wrapper>(t3.Result);

            for (var i = 0; i < SET_COUNT; i++)
            {
                Assert.AreEqual(i, r1[i].Value);
                Assert.AreEqual(i, r2[i].Value);
                Assert.AreEqual(i, r3[i].Value);
            }

            var cnt = counter.GetKeysCount().Sum();

            Assert.AreEqual(SET_COUNT, cnt);
        }
コード例 #4
0
        public void GetPartialTest()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, InfinityTtl)
                          .CreateCache(GetterPatial);
            var keys = Enumerable.Range(0, SET_COUNT);
            var r1   = new Dictionary <int, Wrapper>(cache.Get(keys, counter).Result);
            var r2   = new Dictionary <int, Wrapper>(cache.Get(keys, counter).Result);

            for (var i = 0; i < SET_COUNT; i++)
            {
                if (r1.TryGetValue(i, out var v1))
                {
                    Assert.AreEqual(i, v1.Value);
                }
                else
                {
                    Assert.AreEqual(1, i % 2);
                }

                if (r2.TryGetValue(i, out var v2))
                {
                    Assert.AreEqual(i, v2.Value);
                }
                else
                {
                    Assert.AreEqual(1, i % 2);
                }
            }

            Assert.AreEqual(1, counter.Count);
        }
コード例 #5
0
        public void GetIntersectTest()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, InfinityTtl)
                          .CreateCache(Getter);
            var count = SET_COUNT / 3;
            var r1    = (0, count);
            var r2    = (SET_COUNT / 4, SET_COUNT / 2);
            var r3    = (SET_COUNT - count, count);

            var k1 = Enumerable.Range(r1.Item1, r1.Item2);
            var k2 = Enumerable.Range(r2.Item1, r2.Item2);
            var k3 = Enumerable.Range(r3.Item1, r3.Item2);
            var t1 = Task.Run(() => cache.Get(k1, counter).AsTask());
            var t2 = Task.Run(() => cache.Get(k2, counter).AsTask());
            var t3 = Task.Run(() => cache.Get(k3, counter).AsTask());

            Task.WaitAll(t1, t2, t3);

            var v1 = new Dictionary <int, Wrapper>(t1.Result);
            var v2 = new Dictionary <int, Wrapper>(t2.Result);
            var v3 = new Dictionary <int, Wrapper>(t3.Result);

            for (var i = 0; i < SET_COUNT; i++)
            {
                if (i >= r1.Item1 && i < r1.Item1 + r1.Item2)
                {
                    Assert.AreEqual(i, v1[i].Value);
                }
                if (i >= r2.Item1 && i < r2.Item1 + r2.Item2)
                {
                    Assert.AreEqual(i, v2[i].Value);
                }
                if (i >= r3.Item1 && i < r3.Item1 + r3.Item2)
                {
                    Assert.AreEqual(i, v3[i].Value);
                }
            }

            var cnt = counter.GetKeysCount().Sum();

            Assert.AreEqual(SET_COUNT, cnt);
            Assert.AreEqual(3, counter.Count);
        }
コード例 #6
0
        public void GetAndExpireTest()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(TimeSpan.FromSeconds(1), TimeSpan.Zero)
                          .CreateCache(Getter);

            var keys = new[] { 1 };

            var res1 = cache.Get(keys, counter).Result;
            var res2 = cache.Get(keys, counter).Result;

            Task.Delay(1000).Wait();
            var res3 = cache.Get(keys, counter).Result;
            var res4 = cache.Get(keys, counter).Result;

            Assert.AreSame(res1.Single().Value, res2.Single().Value);
            Assert.AreNotSame(res1.Single().Value, res3.Single().Value);
            Assert.AreSame(res3.Single().Value, res4.Single().Value);
            Assert.AreEqual(2, counter.Count);
        }
コード例 #7
0
        public void GetOutdatedWithException()
        {
            var counter = new CounterForBatch();
            var cache   = ProCacheFactory
                          .CreateOptions <int, Wrapper>(InfinityTtl, TimeSpan.FromSeconds(1))
                          .CreateCache(Getter);

            var keys = 1;

            var r1 = cache.Get(keys, counter).Result;

            Task.Delay(1500).Wait();

            counter.WithThrow = true;

            var t2 = cache.Get(keys, counter).AsTask();
            var t3 = cache.Get(keys, counter).AsTask();

            var ex2 = Assert.CatchAsync(() => t2);
            var r3  = t3.Result;

            Assert.AreSame(r1, r3);

            counter.WithThrow = false;

            var t4 = cache.Get(keys, counter).AsTask();
            var t5 = cache.Get(keys, counter).AsTask();

            Task.WaitAll(t4, t5);

            var r4 = t4.Result;
            var r5 = t5.Result;

            Assert.AreNotSame(r1, r4);
            Assert.AreSame(r1, r5);
        }