Esempio n. 1
0
        public async Task ClientRequest_WithExpires_AddsToCache()
        {
            // arrange
            var state            = new TestState();
            var expectedResponse = state.AddHttpRequest(1);

            expectedResponse.Content.Headers.Expires = DateTime.UtcNow.AddDays(1);

            // act
            var response = await state.ExecuteRequest();

            // assert
            Predicate <Tuple <string, CachingHttpClient.CachedValues> > assert = AssertResult;

            state.Dependencies
            .Verify(x => x.Cache.Put(Match.Create(assert)), Times.Once);

            bool AssertResult(Tuple <string, CachingHttpClient.CachedValues> input)
            {
                CustomAssert.AssertDateAlmost(
                    expectedResponse.Content.Headers.Expires.Value.UtcDateTime,
                    ((Headers.CacheSettings.ExpirySettings.Soft)input.Item2.CacheSettings.ExpirySettings).Item.MustRevalidateAtUtc);

                return(true);
            }
        }
Esempio n. 2
0
        public async Task ClientRequest_WithWeakETag_Caches()
        {
            // arrange
            var state            = new TestState();
            var expectedResponse = state.AddHttpRequest(1);

            expectedResponse.Headers.ETag = new EntityTagHeaderValue("\"etg\"", true);

            // act
            var response = await state.ExecuteRequest();

            // assert
            Predicate <Tuple <string, CachingHttpClient.CachedValues> > assert = AssertResult;

            state.Dependencies
            .Verify(x => x.Cache.Put(Match.Create(assert)), Times.Once);

            bool AssertResult(Tuple <string, CachingHttpClient.CachedValues> input)
            {
                // if there is an ETag, expires should be now, and not the past expiry
                var settings = ((Soft)input.Item2.CacheSettings.ExpirySettings).Item;

                CustomAssert.AssertDateAlmost(DateTime.UtcNow, settings.MustRevalidateAtUtc);

                var etag = ((Headers.CacheSettings.Validator.ETag)settings.Validator).Item;
                var weak = (Headers.CacheSettings.EntityTag.Weak)etag;

                Assert.AreEqual("\"etg\"", weak.Item);

                return(true);
            }
        }
Esempio n. 3
0
        public async Task ClientRequest_WithMaxAge_AddsToCache()
        {
            // arrange
            var state            = new TestState();
            var expectedResponse = state.AddHttpRequest(1);

            expectedResponse.Headers.CacheControl = new CacheControlHeaderValue
            {
                MaxAge = TimeSpan.FromDays(1)
            };

            // act
            var response = await state.ExecuteRequest();

            // assert
            Predicate <Tuple <string, CachingHttpClient.CachedValues> > assert = AssertResult;

            state.Dependencies
            .Verify(x => x.Cache.Put(Match.Create(assert)), Times.Once);

            bool AssertResult(Tuple <string, CachingHttpClient.CachedValues> input)
            {
                Assert.AreEqual("G$:$:http://www.com/", input.Item1);
                CustomAssert.AssertCachedResponse(1, input.Item2.HttpResponse);
                CustomAssert.AssertDateAlmost(
                    DateTime.UtcNow.AddDays(1),
                    ((Headers.CacheSettings.ExpirySettings.HardUtc)input.Item2.CacheSettings.ExpirySettings).Item);
                return(true);
            }
        }
Esempio n. 4
0
        public async Task ClientRequest_UsernameHasDollar_EscapesDollarInKey()
        {
            // arrange
            var state            = new TestState();
            var expectedResponse = state.AddHttpRequest(1);

            expectedResponse.Headers.CacheControl = new CacheControlHeaderValue
            {
                MaxAge  = TimeSpan.FromDays(1),
                Private = true
            };

            // act
            var response = await state.ExecuteRequest(user : "******");

            // assert
            Predicate <Tuple <string, CachingHttpClient.CachedValues> > assert = AssertResult;

            state.Dependencies
            .Verify(x => x.Cache.Put(Match.Create(assert)), Times.Once);

            bool AssertResult(Tuple <string, CachingHttpClient.CachedValues> input)
            {
                Assert.AreEqual("G$:my$$user$:http://www.com/", input.Item1);
                return(true);
            }
        }
Esempio n. 5
0
        public async Task ClientRequest_WithNoHeadersOrCache_ChecksUserAndSharedCache()
        {
            // arrange
            var state = new TestState();

            state.AddHttpRequest(1);

            // act
            var response = await state.ExecuteRequest(user : "******");

            // assert
            Predicate <string> assertShared = AssertShared;
            Predicate <string> assertUser   = AssertUser;

            state.Dependencies
            .Verify(x => x.Cache.Get(It.IsAny <string>()), Times.Exactly(2));
            state.Dependencies
            .Verify(x => x.Cache.Get(Match.Create(assertShared)), Times.Once);
            state.Dependencies
            .Verify(x => x.Cache.Get(Match.Create(assertUser)), Times.Once);

            bool AssertShared(string input)
            {
                return("G$:$:http://www.com/" == input);
            }

            bool AssertUser(string input)
            {
                return("G$:my user$:http://www.com/" == input);
            }
        }
Esempio n. 6
0
        public async Task ClientRequest_CachedValueForUserAndShared_ReturnsUserValue()
        {
            // arrange
            var state          = new TestState();
            var sharedResponse = state.AddToCache(DateTime.UtcNow.AddDays(1), addResponseContent: 1);
            var userResponse   = state.AddToCache(DateTime.UtcNow.AddDays(1), addResponseContent: 2, user: "******");
            var serverResponse = state.AddHttpRequest(3);

            // act
            var response = await state.ExecuteRequest(user : "******");

            // assert
            await CustomAssert.AssertResponse(2, response);
        }
Esempio n. 7
0
        public async Task ClientRequest_WithExpiresInThePast_StillCaches()
        {
            // arrange
            var state            = new TestState();
            var expectedResponse = state.AddHttpRequest(1);

            expectedResponse.Content.Headers.Expires = DateTime.UtcNow.AddDays(-1);

            // act
            var response = await state.ExecuteRequest();

            // assert
            state.Dependencies
            .Verify(x => x.Cache.Put(It.IsAny <Tuple <string, CachingHttpClient.CachedValues> >()), Times.Once);
        }
Esempio n. 8
0
        public async Task ClientRequest_WithNoHeadersOrCache_AvoidsCache()
        {
            // arrange
            var state = new TestState();

            state.AddHttpRequest(1);

            // act
            var response = await state.ExecuteRequest();

            // assert
            await CustomAssert.AssertResponse(1, response);

            state.Dependencies
            .Verify(x => x.Cache.Put(It.IsAny <Tuple <string, CachingHttpClient.CachedValues> >()), Times.Never);
        }
Esempio n. 9
0
        public async Task ClientRequest_WithPreviouslyCachedValue_ReturnsCachedValue()
        {
            // arrange
            var state          = new TestState();
            var cachedResponse = state.AddToCache(DateTime.UtcNow.AddDays(1), addResponseContent: 1);
            var serverResponse = state.AddHttpRequest(2);

            // act
            var response = await state.ExecuteRequest();

            // assert
            await CustomAssert.AssertResponse(1, response);

            state.Dependencies
            .Verify(x => x.Send(It.IsAny <Tuple <HttpRequestMessage, CancellationToken> >()), Times.Never);
        }
Esempio n. 10
0
        public async Task ClientRequest_WithStrongETag_ServerReturns304_ConstructsResponseCorrectly()
        {
            // arrange
            var state = new TestState();

            state.AddToCache(
                DateTime.MinValue,
                addResponseContent: 4,
                customHeaders: new[] { KeyValuePair.Create("x-custom-header", new[] { "cached value" }) },
                expiry: NewSoft(new CacheSettings.RevalidationSettings(
                                    DateTime.MinValue,
                                    CacheSettings.Validator.NewETag(CacheSettings.EntityTag.NewStrong("\"etg 1\"")))));

            var expectedResponse = state.AddHttpRequest(null, responseCode: 304);

            expectedResponse.Headers.Add("x-custom-header", new[] { "server value" });

            // act
            var response = await state.ExecuteRequest();

            // assert
            await CustomAssert.AssertResponse(4, response);

            state.Dependencies
            .Verify(x => x.Cache.Put(It.IsAny <Tuple <string, CachingHttpClient.CachedValues> >()), Times.Never);
            Assert.AreEqual("cached value", response.Headers.GetValues("x-custom-header").First());

            Predicate <Tuple <HttpRequestMessage, CancellationToken> > assertHttpSend = AssertHttpSend;

            state.Dependencies
            .Verify(x => x.Send(Match.Create(assertHttpSend)), Times.Once);

            bool AssertHttpSend(Tuple <HttpRequestMessage, CancellationToken> input)
            {
                Assert.AreEqual(@"""etg 1""", input.Item1.Headers.IfNoneMatch.First().Tag);
                Assert.False(input.Item1.Headers.IfNoneMatch.First().IsWeak);
                return(true);
            }
        }
Esempio n. 11
0
        public async Task ClientRequest_WithNoHeadersOrCache_ChecksCacheFirst()
        {
            // arrange
            var state = new TestState();

            state.AddHttpRequest(1);

            // act
            var response = await state.ExecuteRequest();

            // assert
            Predicate <string> assert = AssertResult;

            state.Dependencies
            .Verify(x => x.Cache.Get(It.IsAny <string>()), Times.Once);
            state.Dependencies
            .Verify(x => x.Cache.Get(Match.Create(assert)), Times.Once);

            bool AssertResult(string input)
            {
                Assert.AreEqual("G$:$:http://www.com/", input);
                return(true);
            }
        }