예제 #1
0
        public async Task FunctionalTest_RoutingMiddleware_ThrowsDeprecateCacheIsExpiredOrMissingException_NoCache()
        {
            HttpContext ctx = new DefaultHttpContext();

            ctx.Request.Host = new HostString("test.qp.lan");

            RoutingMiddleware routingMiddleware = new RoutingMiddleware(_next, new NullTargetingFilterAccessor());

            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            CacheStubAbstractItemStorageProvider cacheStubAbstractItemStorageProvider = new CacheStubAbstractItemStorageProvider(stubCacheProvider);

            await Assert.ThrowsExceptionAsync <DeprecateCacheIsExpiredOrMissingException>(() => routingMiddleware.Invoke(ctx, cacheStubAbstractItemStorageProvider));
        }
예제 #2
0
        public void Should_execute_delegate_but_not_put_value_in_cache_if_cache_does_not_hold_value_but_ttl_indicates_not_worth_caching()
        {
            const string valueToReturn = "valueToReturn";
            const string executionKey  = "SomeExecutionKey";

            ISyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy        cache             = Policy.Cache(stubCacheProvider, TimeSpan.Zero);

            stubCacheProvider.Get(executionKey).Should().BeNull();

            cache.Execute(() => { return(valueToReturn); }, new Context(executionKey)).Should().Be(valueToReturn);

            stubCacheProvider.Get(executionKey).Should().Be(null);
        }
예제 #3
0
        public async Task Should_execute_delegate_and_put_value_in_cache_if_cache_does_not_hold_value()
        {
            const string valueToReturn = "valueToReturn";
            const string executionKey  = "SomeExecutionKey";

            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy         cache             = Policy.CacheAsync(stubCacheProvider, TimeSpan.MaxValue);

            ((string)await stubCacheProvider.GetAsync(executionKey, CancellationToken.None, false).ConfigureAwait(false)).Should().BeNull();

            (await cache.ExecuteAsync(async() => { await TaskHelper.EmptyTask.ConfigureAwait(false); return(valueToReturn); }, new Context(executionKey)).ConfigureAwait(false)).Should().Be(valueToReturn);

            ((string)await stubCacheProvider.GetAsync(executionKey, CancellationToken.None, false).ConfigureAwait(false)).Should().Be(valueToReturn);
        }
예제 #4
0
        public async Task Should_execute_delegate_but_not_put_value_in_cache_if_cache_does_not_hold_value_but_ttl_indicates_not_worth_caching()
        {
            const string valueToReturn = "valueToReturn";
            const string operationKey  = "SomeOperationKey";

            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy         cache             = Policy.CacheAsync(stubCacheProvider, TimeSpan.Zero);

            ((string)await stubCacheProvider.GetAsync(operationKey, CancellationToken.None, false).ConfigureAwait(false)).Should().Be(null);

            (await cache.ExecuteAsync(async ctx => { await TaskHelper.EmptyTask.ConfigureAwait(false); return(valueToReturn); }, new Context(operationKey)).ConfigureAwait(false)).Should().Be(valueToReturn);

            ((string)await stubCacheProvider.GetAsync(operationKey, CancellationToken.None, false).ConfigureAwait(false)).Should().Be(null);
        }
예제 #5
0
        public void Should_execute_delegate_and_put_value_in_cache_if_cache_does_not_hold_value()
        {
            const string valueToReturn = "valueToReturn";
            const string executionKey  = "SomeExecutionKey";

            ISyncCacheProvider   stubCacheProvider = new StubCacheProvider();
            CachePolicy <string> cache             = Policy.Cache <string>(stubCacheProvider, TimeSpan.MaxValue);

            stubCacheProvider.Get(executionKey).Should().BeNull();

            cache.Execute(() => { return(valueToReturn); }, new Context(executionKey)).Should().Be(valueToReturn);

            stubCacheProvider.Get(executionKey).Should().Be(valueToReturn);
        }
        public void Should_execute_delegate_and_put_value_in_cache_for_non_nullable_types_if_cache_does_not_hold_value()
        {
            const ResultPrimitive valueToReturn = ResultPrimitive.Substitute;
            const string          operationKey  = "SomeOperationKey";

            ISyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy        cache             = Policy.Cache(stubCacheProvider, TimeSpan.MaxValue);

            stubCacheProvider.Get(operationKey).Should().BeNull();

            cache.Execute(ctx => { return(valueToReturn); }, new Context(operationKey)).Should().Be(valueToReturn);

            stubCacheProvider.Get(operationKey).Should().Be(valueToReturn);
        }
        public async Task Should_execute_delegate_and_put_value_in_cache_but_when_it_expires_execute_delegate_again()
        {
            const string valueToReturn = "valueToReturn";
            const string operationKey  = "SomeOperationKey";

            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            TimeSpan            ttl = TimeSpan.FromMinutes(30);
            var cache = Policy.CacheAsync <string>(stubCacheProvider, ttl);

            (bool cacheHit1, object fromCache1) = await stubCacheProvider.TryGetAsync(operationKey, CancellationToken.None, false).ConfigureAwait(false);

            cacheHit1.Should().BeFalse();
            fromCache1.Should().BeNull();

            int delegateInvocations             = 0;
            Func <Context, Task <string> > func = async ctx =>
            {
                delegateInvocations++;
                await TaskHelper.EmptyTask.ConfigureAwait(false);

                return(valueToReturn);
            };

            DateTimeOffset fixedTime = SystemClock.DateTimeOffsetUtcNow();

            SystemClock.DateTimeOffsetUtcNow = () => fixedTime;

            // First execution should execute delegate and put result in the cache.
            (await cache.ExecuteAsync(func, new Context(operationKey)).ConfigureAwait(false)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(1);

            (bool cacheHit2, object fromCache2) = await stubCacheProvider.TryGetAsync(operationKey, CancellationToken.None, false).ConfigureAwait(false);

            cacheHit2.Should().BeTrue();
            fromCache2.Should().Be(valueToReturn);

            // Second execution (before cache expires) should get it from the cache - no further delegate execution.
            // (Manipulate time so just prior cache expiry).
            SystemClock.DateTimeOffsetUtcNow = () => fixedTime.Add(ttl).AddSeconds(-1);
            (await cache.ExecuteAsync(func, new Context(operationKey)).ConfigureAwait(false)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(1);

            // Manipulate time to force cache expiry.
            SystemClock.DateTimeOffsetUtcNow = () => fixedTime.Add(ttl).AddSeconds(1);

            // Third execution (cache expired) should not get it from the cache - should cause further delegate execution.
            (await cache.ExecuteAsync(func, new Context(operationKey)).ConfigureAwait(false)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(2);
        }
        public void Should_not_error_for_executions_on_non_nullable_types_if_cache_does_not_hold_value()
        {
            const string operationKey = "SomeOperationKey";

            bool onErrorCalled = false;
            Action <Context, string, Exception> onError = (ctx, key, exc) => { onErrorCalled = true; };

            ISyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy        cache             = Policy.Cache(stubCacheProvider, TimeSpan.MaxValue, onError);

            stubCacheProvider.Get(operationKey).Should().BeNull();
            ResultPrimitive result = cache.Execute(ctx => ResultPrimitive.Substitute, new Context(operationKey));

            onErrorCalled.Should().BeFalse();
        }
예제 #9
0
        public async Task Single_generic_SerializingCacheProvider_should_not_serialize_on_put_for_defaultTResult()
        {
            bool serializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => { serializeInvoked = true; return(new StubSerialized(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            object            objectToCache     = default(object);
            string            key = "some key";

            SerializingCacheProviderAsync <StubSerialized> serializingCacheProvider = new SerializingCacheProviderAsync <StubSerialized>(stubCacheProvider.AsyncFor <StubSerialized>(), stubSerializer);
            await serializingCacheProvider.PutAsync(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)), CancellationToken.None, false);

            serializeInvoked.Should().Be(false);
            stubCacheProvider.Get(key).Should().BeNull();
        }
예제 #10
0
        public void Should_execute_delegate_and_put_value_in_cache_but_when_it_expires_execute_delegate_again()
        {
            const string valueToReturn = "valueToReturn";
            const string operationKey  = "SomeOperationKey";

            ISyncCacheProvider   stubCacheProvider = new StubCacheProvider();
            TimeSpan             ttl   = TimeSpan.FromMinutes(30);
            CachePolicy <string> cache = Policy.Cache <string>(stubCacheProvider, ttl);

            (bool cacheHit1, object fromCache1) = stubCacheProvider.TryGet(operationKey);
            cacheHit1.Should().BeFalse();
            fromCache1.Should().BeNull();

            int delegateInvocations     = 0;
            Func <Context, string> func = _ =>
            {
                delegateInvocations++;
                return(valueToReturn);
            };

            DateTimeOffset fixedTime = SystemClock.DateTimeOffsetUtcNow();

            SystemClock.DateTimeOffsetUtcNow = () => fixedTime;

            // First execution should execute delegate and put result in the cache.
            cache.Execute(func, new Context(operationKey)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(1);

            (bool cacheHit2, object fromCache2) = stubCacheProvider.TryGet(operationKey);
            cacheHit2.Should().BeTrue();
            fromCache2.Should().Be(valueToReturn);

            // Second execution (before cache expires) should get it from the cache - no further delegate execution.
            // (Manipulate time so just prior cache expiry).
            SystemClock.DateTimeOffsetUtcNow = () => fixedTime.Add(ttl).AddSeconds(-1);
            cache.Execute(func, new Context(operationKey)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(1);

            // Manipulate time to force cache expiry.
            SystemClock.DateTimeOffsetUtcNow = () => fixedTime.Add(ttl).AddSeconds(1);

            // Third execution (cache expired) should not get it from the cache - should cause further delegate execution.
            cache.Execute(func, new Context(operationKey)).Should().Be(valueToReturn);
            delegateInvocations.Should().Be(2);
        }
예제 #11
0
        public void Single_generic_SerializingCacheProvider_from_extension_syntax_should_not_serialize_on_put_for_defaultTResult()
        {
            bool serializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => { serializeInvoked = true; return(new StubSerialized(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            object            objectToCache     = default(object);
            string            key = "some key";

            SerializingCacheProvider <StubSerialized> serializingCacheProvider = stubCacheProvider.For <StubSerialized>().WithSerializer(stubSerializer);

            serializingCacheProvider.Put(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)));

            serializeInvoked.Should().Be(false);
            stubCacheProvider.Get(key).Should().BeNull();
        }
예제 #12
0
        public void Should_execute_delegate_and_put_value_in_cache_if_cache_does_not_hold_value()
        {
            const string valueToReturn = "valueToReturn";
            const string operationKey  = "SomeOperationKey";

            ISyncCacheProvider   stubCacheProvider = new StubCacheProvider();
            CachePolicy <string> cache             = Policy.Cache <string>(stubCacheProvider, TimeSpan.MaxValue);

            (bool cacheHit1, object fromCache1) = stubCacheProvider.TryGet(operationKey);
            cacheHit1.Should().BeFalse();
            fromCache1.Should().BeNull();

            cache.Execute(_ => valueToReturn, new Context(operationKey)).Should().Be(valueToReturn);

            (bool cacheHit2, object fromCache2) = stubCacheProvider.TryGet(operationKey);
            cacheHit2.Should().BeTrue();
            fromCache2.Should().Be(valueToReturn);
        }
예제 #13
0
        public void Should_execute_delegate_and_put_value_in_cache_if_cache_does_not_hold_value__default_for_value_type()
        {
            ResultPrimitive valueToReturn = default(ResultPrimitive);
            const string    operationKey  = "SomeOperationKey";

            ISyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy        cache             = Policy.Cache(stubCacheProvider, TimeSpan.MaxValue);

            (bool cacheHit1, object fromCache1) = stubCacheProvider.TryGet(operationKey);
            cacheHit1.Should().BeFalse();
            fromCache1.Should().BeNull();

            cache.Execute(ctx => { return(valueToReturn); }, new Context(operationKey)).Should().Be(valueToReturn);

            (bool cacheHit2, object fromCache2) = stubCacheProvider.TryGet(operationKey);
            cacheHit2.Should().BeTrue();
            fromCache2.Should().Be(valueToReturn);
        }
예제 #14
0
        public void Should_execute_delegate_but_not_put_value_in_cache_if_cache_does_not_hold_value_but_ttl_indicates_not_worth_caching()
        {
            const string valueToReturn = "valueToReturn";
            const string operationKey  = "SomeOperationKey";

            ISyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy        cache             = Policy.Cache(stubCacheProvider, TimeSpan.Zero);

            (bool cacheHit1, object fromCache1) = stubCacheProvider.TryGet(operationKey);
            cacheHit1.Should().BeFalse();
            fromCache1.Should().BeNull();

            cache.Execute(ctx => { return(valueToReturn); }, new Context(operationKey)).Should().Be(valueToReturn);

            (bool cacheHit2, object fromCache2) = stubCacheProvider.TryGet(operationKey);
            cacheHit2.Should().BeFalse();
            fromCache2.Should().BeNull();
        }
예제 #15
0
        public void Double_generic_SerializingCacheProvider_should_not_serialize_on_put_for_defaultTResult()
        {
            bool serializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => { serializeInvoked = true; return(new StubSerialized <ResultPrimitive>(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            ResultPrimitive   objectToCache     = default(ResultPrimitive);
            string            key = "some key";

            SerializingCacheProvider <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider = new SerializingCacheProvider <ResultPrimitive, StubSerialized <ResultPrimitive> >(stubCacheProvider.For <StubSerialized <ResultPrimitive> >(), stubTResultSerializer);

            serializingCacheProvider.Put(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)));

            serializeInvoked.Should().Be(false);
            stubCacheProvider.Get(key).Should().BeNull();
        }
예제 #16
0
        public async Task Single_generic_SerializingCacheProvider_from_extension_syntax_should_serialize_on_put()
        {
            bool serializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => { serializeInvoked = true; return(new StubSerialized(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            object            objectToCache     = new object();
            string            key = "some key";

            SerializingCacheProviderAsync <StubSerialized> serializingCacheProvider = stubCacheProvider.AsyncFor <StubSerialized>().WithSerializer(stubSerializer);
            await serializingCacheProvider.PutAsync(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)), CancellationToken.None, false);

            serializeInvoked.Should().Be(true);
            (await stubCacheProvider.GetAsync(key, CancellationToken.None, false)).Should().BeOfType <StubSerialized>()
            .Which.Original.Should().Be(objectToCache);
        }
예제 #17
0
        public void Single_generic_SerializingCacheProvider_should_not_deserialize_on_get_when_item_not_in_cache()
        {
            bool deserializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => new StubSerialized(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            string key = "some key";

            stubCacheProvider.Get(key).Should().BeNull();

            SerializingCacheProvider <StubSerialized> serializingCacheProvider = new SerializingCacheProvider <StubSerialized>(stubCacheProvider.For <StubSerialized>(), stubSerializer);
            object fromCache = serializingCacheProvider.Get(key);

            deserializeInvoked.Should().Be(false);
            fromCache.Should().Be(default(object));
        }
예제 #18
0
        public async Task Should_execute_delegate_and_put_value_in_cache_for_non_nullable_types_if_cache_does_not_hold_value()
        {
            const ResultPrimitive valueToReturn = ResultPrimitive.Substitute;
            const string          operationKey  = "SomeOperationKey";

            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy         cache             = Policy.CacheAsync(stubCacheProvider, TimeSpan.MaxValue);

            (await stubCacheProvider.GetAsync(operationKey, CancellationToken.None, false)).Should().BeNull();

            (await cache.ExecuteAsync(async ctx =>
            {
                await TaskHelper.EmptyTask.ConfigureAwait(false);
                return(ResultPrimitive.Substitute);
            }, new Context(operationKey))).Should().Be(valueToReturn);

            (await stubCacheProvider.GetAsync(operationKey, CancellationToken.None, false)).Should().Be(valueToReturn);
        }
예제 #19
0
        public async Task Double_generic_SerializingCacheProvider_from_extension_syntax_should_not_serialize_on_put_for_defaultTResult()
        {
            bool serializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => { serializeInvoked = true; return(new StubSerialized <ResultPrimitive>(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            ResultPrimitive   objectToCache     = default(ResultPrimitive);
            string            key = "some key";

            SerializingCacheProviderAsync <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider =
                stubCacheProvider.AsyncFor <StubSerialized <ResultPrimitive> >().WithSerializer(stubTResultSerializer);
            await serializingCacheProvider.PutAsync(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)), CancellationToken.None, false);

            serializeInvoked.Should().Be(false);
            stubCacheProvider.Get(key).Should().BeNull();
        }
예제 #20
0
        public async Task Double_generic_SerializingCacheProvider_should_not_deserialize_on_get_when_item_not_in_cache()
        {
            bool deserializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => new StubSerialized <ResultPrimitive>(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            string key = "some key";

            stubCacheProvider.Get(key).Should().BeNull();

            SerializingCacheProviderAsync <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider = new SerializingCacheProviderAsync <ResultPrimitive, StubSerialized <ResultPrimitive> >(stubCacheProvider.AsyncFor <StubSerialized <ResultPrimitive> >(), stubTResultSerializer);
            ResultPrimitive fromCache = await serializingCacheProvider.GetAsync(key, CancellationToken.None, false);

            deserializeInvoked.Should().Be(false);
            fromCache.Should().Be(default(ResultPrimitive));
        }
예제 #21
0
        public async Task Double_generic_SerializingCacheProvider_should_serialize_on_put()
        {
            bool serializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => { serializeInvoked = true; return(new StubSerialized <ResultPrimitive>(o)); },
                deserialize: s => s.Original
                );
            var             stubCacheProvider = new StubCacheProvider();
            ResultPrimitive objectToCache     = ResultPrimitive.Good;
            string          key = "some key";

            SerializingCacheProviderAsync <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider = new SerializingCacheProviderAsync <ResultPrimitive, StubSerialized <ResultPrimitive> >(stubCacheProvider.AsyncFor <StubSerialized <ResultPrimitive> >(), stubTResultSerializer);
            await serializingCacheProvider.PutAsync(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)), CancellationToken.None, false);

            serializeInvoked.Should().Be(true);
            (await stubCacheProvider.GetAsync(key, CancellationToken.None, false)).Should().BeOfType <StubSerialized <ResultPrimitive> >()
            .Which.Original.Should().Be(objectToCache);
        }
예제 #22
0
        public async Task Single_generic_SerializingCacheProvider_from_extension_syntax_should_not_deserialize_on_get_when_item_not_in_cache()
        {
            bool deserializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => new StubSerialized(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            string key = "some key";

            stubCacheProvider.Get(key).Should().BeNull();

            SerializingCacheProviderAsync <StubSerialized> serializingCacheProvider = stubCacheProvider.AsyncFor <StubSerialized>().WithSerializer(stubSerializer);
            object fromCache = await serializingCacheProvider.GetAsync(key, CancellationToken.None, false);

            deserializeInvoked.Should().Be(false);
            fromCache.Should().Be(default(object));
        }
예제 #23
0
        public void Double_generic_SerializingCacheProvider_from_extension_syntax_should_not_deserialize_on_get_when_item_not_in_cache()
        {
            bool deserializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => new StubSerialized <ResultPrimitive>(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            string key = "some key";

            stubCacheProvider.Get(key).Should().BeNull();

            SerializingCacheProvider <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider =
                stubCacheProvider.For <StubSerialized <ResultPrimitive> >().WithSerializer(stubTResultSerializer);
            ResultPrimitive fromCache = serializingCacheProvider.Get(key);

            deserializeInvoked.Should().Be(false);
            fromCache.Should().Be(default(ResultPrimitive));
        }
예제 #24
0
        public void Single_generic_SerializingCacheProvider_from_extension_syntax_should_deserialize_on_get()
        {
            bool deserializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => new StubSerialized(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            object objectToCache     = new object();
            string key = "some key";

            stubCacheProvider.Put(key, new StubSerialized(objectToCache), new Ttl(TimeSpan.FromMinutes(1)));

            SerializingCacheProvider <StubSerialized> serializingCacheProvider = stubCacheProvider.For <StubSerialized>().WithSerializer(stubSerializer);
            object fromCache = serializingCacheProvider.Get(key);

            deserializeInvoked.Should().Be(true);
            fromCache.Should().Be(objectToCache);
        }
        public async Task Single_generic_SerializingCacheProvider_should_not_deserialize_on_get_when_item_not_in_cache()
        {
            bool deserializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => new StubSerialized(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            string key = "some key";

            stubCacheProvider.TryGet(key).Item1.Should().BeFalse();

            AsyncSerializingCacheProvider <StubSerialized> serializingCacheProvider = new AsyncSerializingCacheProvider <StubSerialized>(stubCacheProvider.AsyncFor <StubSerialized>(), stubSerializer);

            (bool cacheHit, object fromCache) = await serializingCacheProvider.TryGetAsync(key, CancellationToken.None, false);

            cacheHit.Should().BeFalse();
            deserializeInvoked.Should().BeFalse();
            fromCache.Should().Be(default);
예제 #26
0
        public void Double_generic_SerializingCacheProvider_should_deserialize_on_get()
        {
            bool deserializeInvoked = false;
            StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> > stubTResultSerializer = new StubSerializer <ResultPrimitive, StubSerialized <ResultPrimitive> >(
                serialize: o => new StubSerialized <ResultPrimitive>(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var             stubCacheProvider = new StubCacheProvider();
            ResultPrimitive objectToCache     = ResultPrimitive.Good;
            string          key = "some key";

            SerializingCacheProvider <ResultPrimitive, StubSerialized <ResultPrimitive> > serializingCacheProvider = new SerializingCacheProvider <ResultPrimitive, StubSerialized <ResultPrimitive> >(stubCacheProvider.For <StubSerialized <ResultPrimitive> >(), stubTResultSerializer);

            stubCacheProvider.Put(key, new StubSerialized <ResultPrimitive>(objectToCache), new Ttl(TimeSpan.FromMinutes(1)));
            object fromCache = serializingCacheProvider.Get(key);

            deserializeInvoked.Should().Be(true);
            fromCache.Should().Be(objectToCache);
        }
예제 #27
0
        public async Task Should_not_error_for_executions_on_non_nullable_types_if_cache_does_not_hold_value()
        {
            const string operationKey = "SomeOperationKey";

            bool onErrorCalled = false;
            Action <Context, string, Exception> onError = (ctx, key, exc) => { onErrorCalled = true; };

            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy         cache             = Policy.CacheAsync(stubCacheProvider, TimeSpan.MaxValue, onError);

            (await stubCacheProvider.GetAsync(operationKey, CancellationToken.None, false)).Should().BeNull();
            ResultPrimitive result = await cache.ExecuteAsync(async ctx =>
            {
                await TaskHelper.EmptyTask.ConfigureAwait(false);
                return(ResultPrimitive.Substitute);
            }, new Context(operationKey));

            onErrorCalled.Should().BeFalse();
        }
예제 #28
0
        public void Single_generic_SerializingCacheProvider_should_serialize_on_put()
        {
            bool serializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => { serializeInvoked = true; return(new StubSerialized(o)); },
                deserialize: s => s.Original
                );
            StubCacheProvider stubCacheProvider = new StubCacheProvider();
            object            objectToCache     = new object();
            string            key = "some key";

            SerializingCacheProvider <StubSerialized> serializingCacheProvider = new SerializingCacheProvider <StubSerialized>(stubCacheProvider.For <StubSerialized>(), stubSerializer);

            serializingCacheProvider.Put(key, objectToCache, new Ttl(TimeSpan.FromMinutes(1)));

            serializeInvoked.Should().Be(true);
            stubCacheProvider.Get(key).Should().BeOfType <StubSerialized>()
            .Which.Original.Should().Be(objectToCache);
        }
예제 #29
0
        public async Task Single_generic_SerializingCacheProvider_from_extension_syntax_should_deserialize_on_get()
        {
            bool deserializeInvoked = false;
            StubSerializer <object, StubSerialized> stubSerializer = new StubSerializer <object, StubSerialized>(
                serialize: o => new StubSerialized(o),
                deserialize: s => { deserializeInvoked = true; return(s.Original); }
                );
            var    stubCacheProvider = new StubCacheProvider();
            object objectToCache     = new object();
            string key = "some key";

            await stubCacheProvider.PutAsync(key, new StubSerialized(objectToCache), new Ttl(TimeSpan.FromMinutes(1)), CancellationToken.None, false);

            SerializingCacheProviderAsync <StubSerialized> serializingCacheProvider = stubCacheProvider.AsyncFor <StubSerialized>().WithSerializer(stubSerializer);
            object fromCache = await serializingCacheProvider.GetAsync(key, CancellationToken.None, false);

            deserializeInvoked.Should().Be(true);
            fromCache.Should().Be(objectToCache);
        }
예제 #30
0
        public async Task Should_allow_custom_FuncCacheKeyStrategy()
        {
            IAsyncCacheProvider stubCacheProvider = new StubCacheProvider();
            CachePolicy         cache             = Policy.CacheAsync(stubCacheProvider, TimeSpan.MaxValue, context => context.ExecutionKey + context["id"]);

            object person1 = new object();
            await stubCacheProvider.PutAsync("person1", person1, new Ttl(TimeSpan.MaxValue), CancellationToken.None, false).ConfigureAwait(false);

            object person2 = new object();
            await stubCacheProvider.PutAsync("person2", person2, new Ttl(TimeSpan.MaxValue), CancellationToken.None, false).ConfigureAwait(false);

            bool funcExecuted          = false;
            Func <Task <object> > func = async() => { funcExecuted = true; await TaskHelper.EmptyTask.ConfigureAwait(false); return(new object()); };

            (await cache.ExecuteAsync(func, new Context("person", new { id = "1" }.AsDictionary())).ConfigureAwait(false)).Should().BeSameAs(person1);
            funcExecuted.Should().BeFalse();

            (await cache.ExecuteAsync(func, new Context("person", new { id = "2" }.AsDictionary())).ConfigureAwait(false)).Should().BeSameAs(person2);
            funcExecuted.Should().BeFalse();
        }