Example #1
0
        private void PrepareMockResponseHandler(MockResponseHandler mockResponseHandler, int number)
        {
            var uri          = _baseUri + number + "/" + _infoJson;
            var xkcdResponse = PrepareXkcdResponse(number);

            mockResponseHandler.AddMockResponse(xkcdResponse, uri);
        }
Example #2
0
        public async void Method()
        {
            var httpHandler = new MockHttpHandler();
            var responseHandler = new MockResponseHandler<object>();

            var endpoint = new HttpApiEndpoint("path/to/api", HttpMethod.Get, new Dictionary<string, IHttpArgumentHandler>(), responseHandler, Enumerable.Empty<HttpHeader>());
            await endpoint.Call(httpHandler, "http://localhost", new Dictionary<string, object>());

            Assert.AreEqual(HttpMethod.Get, httpHandler.Request.Method);
        }
        private HttpClient PrepareHttpClient(string jokeUri, string joke)
        {
            var mockMessageHandler = new MockResponseHandler();

            var chuckResponse = new ChuckResponse("success", new ChuckJoke(joke));

            mockMessageHandler.AddMockResponse(chuckResponse, jokeUri);

            return(new HttpClient(mockMessageHandler));
        }
Example #4
0
        private MockResponseHandler PrepareMockResponseHandlerForLatest(int number)
        {
            var mockResponseHandler = new MockResponseHandler();
            var uri          = _baseUri + _infoJson;
            var xkcdResponse = PrepareXkcdResponse(number);

            mockResponseHandler.AddMockResponse(xkcdResponse, uri);

            return(mockResponseHandler);
        }
        public void ThrottledConcurrentRequestHandler_SendRequestAsync_ThrottlesRequests()
        {
            var      mockHandler = new MockMessageHandler();
            DateTime timeToStart = DateTime.Now.AddSeconds(1);

            var requestHandler = new MockResponseHandler()
            {
                CanHandleRequest = (request) => request.Method.Method == "GET" && request.RequestUri.ToString() == "http://testsite.com/test",
                HandleRequest    = async(request) =>
                {
                    try
                    {
                        System.Diagnostics.Debug.WriteLine(System.Threading.Interlocked.Increment(ref concurrentRequests));

                        var timeToWait = timeToStart.Subtract(DateTime.Now);
                        if (timeToWait.TotalMilliseconds > 0)
                        {
                            await Task.Delay(timeToWait).ConfigureAwait(false);
                        }

                        if (concurrentRequests > 4)
                        {
                            return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError));
                        }
                        else
                        {
                            return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NoContent));
                        }
                    }
                    finally
                    {
                        System.Threading.Interlocked.Decrement(ref concurrentRequests);
                    }
                }
            };

            mockHandler.AddDynamicResponse(requestHandler);

            var handler = new ThrottledConcurrentRequestHandler(mockHandler);

            using (var client = new System.Net.Http.HttpClient(handler))
            {
                var requests = new List <Task <System.Net.Http.HttpResponseMessage> >();
                for (int cnt = 0; cnt < 100; cnt++)
                {
                    requests.Add(client.GetAsync("http://testsite.com/test"));
                }
                Task.WaitAll(requests.ToArray());

                Assert.IsFalse((from r in requests where r.Result.StatusCode == System.Net.HttpStatusCode.InternalServerError select r).Any());
            }
        }
Example #6
0
        private HttpClient PrepareHttpClient()
        {
            var baseUri   = "https://dog.ceo/api/";
            var breedsUri = $"{baseUri}breeds/image/random";

            var mockMessageHandler = new MockResponseHandler();

            var dogBreedResponse = new DogResponse("success", "https://images.dog.ceo/breeds/random.jpg");

            mockMessageHandler.AddMockResponse(dogBreedResponse, breedsUri);

            return(new HttpClient(mockMessageHandler));
        }
        public void GetSearchSuggestions_NoMatch_ReturnsEmptyList()
        {
            var mockResponseHandler = new MockResponseHandler();

            mockResponseHandler.AddFakeResponse(
                "http://l.stoffi.io/search/suggestions.json?q=",
                "SearchSuggestions_Empty.json");
            var httpClient    = new HttpClient(mockResponseHandler);
            var searchService = new SearchService(httpClient);
            var suggestions   = searchService.GetSearchSuggestionsAsync("").Result;

            Assert.AreEqual(0, suggestions.Count);
        }
Example #8
0
        private HttpClient PrepareHttpClient(List <string> breeds)
        {
            var baseUri   = "https://dog.ceo/api/";
            var breedsUri = $"{baseUri}breeds/list/all";

            var mockMessageHandler = new MockResponseHandler();

            var dogBreedResponse = new DogBreedsResponse("success", breeds.ToDictionary(k => k, k => Enumerable.Empty <string>().ToList()));

            mockMessageHandler.AddMockResponse(dogBreedResponse, breedsUri);

            return(new HttpClient(mockMessageHandler));
        }
        public void GetFilteredSongs_NoMatch_ReturnsEmptyObject()
        {
            var mockResponseHandler = new MockResponseHandler();

            mockResponseHandler.AddFakeResponse(
                "http://l.stoffi.io/search.json?q=&limit=3&c=songs",
                "SearchResult_Empty.json");
            var httpClient    = new HttpClient(mockResponseHandler);
            var searchService = new SearchService(httpClient);
            var searchResults = searchService.GetFilteredSongsAsync("", 3).Result;

            Assert.AreEqual(0, searchResults.TotalHits);
            Assert.AreEqual(0, searchResults.Hits.Count);
        }
Example #10
0
        public async Task SharePointRestRetryTest(HttpStatusCode statusCode)
        {
            MockResponseHandler        responseHandler = new MockResponseHandler();
            SharePointRestRetryHandler retryHandler    = new SharePointRestRetryHandler(null)
            {
                InnerHandler = responseHandler,
                // Set delay to zero to speed up test case
                DelayInSeconds = 0,
                // Start with default values for the other settings
                MaxRetries          = 10,
                UseRetryAfterHeader = false,
                IncrementalDelay    = true
            };

            using (HttpMessageInvoker invoker = new HttpMessageInvoker(retryHandler))
            {
                var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://pnp.com/rocks");

                // Check 1: basic retry
                var retryResponse  = new HttpResponseMessage(statusCode);
                var secondResponse = new HttpResponseMessage(HttpStatusCode.OK);
                responseHandler.SetHttpResponse(retryResponse, secondResponse);

                var response = await invoker.SendAsync(httpRequestMessage, new CancellationToken());

                Assert.AreEqual(response, secondResponse);

                // Check 2: bump into max retries
                retryResponse  = new HttpResponseMessage(statusCode);
                secondResponse = new HttpResponseMessage(statusCode);
                responseHandler.SetHttpResponse(retryResponse, secondResponse);

                bool exceptionThrown = false;
                try
                {
                    response = await invoker.SendAsync(httpRequestMessage, new CancellationToken());
                }
                catch (Exception ex)
                {
                    if (ex is ServiceException)
                    {
                        exceptionThrown = true;
                        var serviceException = ex as ServiceException;
                        Assert.IsTrue((serviceException.Error as ServiceError).HttpResponseCode == (int)statusCode);
                    }
                }
                Assert.IsTrue(exceptionThrown);
            }
        }
Example #11
0
        private HttpClient PrepareHttpClient(List <string> breeds)
        {
            var baseUri   = "https://api.thecatapi.com/v1/";
            var breedsUri = $"{baseUri}breeds";

            var mockMessageHandler = new MockResponseHandler();

            var catBreedResponse = breeds
                                   .Select(c => new CatBreedsResponse("", c))
                                   .ToList();

            mockMessageHandler.AddMockResponse(catBreedResponse, breedsUri);

            return(new HttpClient(mockMessageHandler));
        }
Example #12
0
        public async void HeadersProvider()
        {
            var httpHandler = new MockHttpHandler();
            var responseHandler = new MockResponseHandler<object>();

            var headersProvider = new MockApiInstrumenter();
            headersProvider.Headers.Add(new HttpHeader("key", "value"));

            var endpoint = new HttpApiEndpoint("path/to/api", HttpMethod.Get, new Dictionary<string, IHttpArgumentHandler>(), responseHandler, Enumerable.Empty<HttpHeader>());
            await endpoint.Call(httpHandler, "http://localhost", new Dictionary<string, object>(), headersProvider.InstrumentCall);

            var header = httpHandler.Request.Headers.Single();
            Assert.AreEqual("key", header.Name);
            Assert.AreEqual("value", header.Values.Single());
        }
        public void GetFilteredSongs_Match_ReturnsObject()
        {
            var mockResponseHandler = new MockResponseHandler();

            mockResponseHandler.AddFakeResponse(
                "http://l.stoffi.io/search.json?q=love&limit=3&c=songs",
                "SearchResult_Love.json");
            var httpClient    = new HttpClient(mockResponseHandler);
            var searchService = new SearchService(httpClient);
            var searchResults = searchService.GetFilteredSongsAsync("love", 3).Result;

            Assert.AreEqual(947, searchResults.TotalHits);
            Assert.AreEqual(428, searchResults.Hits[0].Id);
            Assert.AreEqual("Love", searchResults.Hits[0].Name);
        }
        public void GetSearchSuggestions_Match_ReturnsMatches()
        {
            var mockResponseHandler = new MockResponseHandler();

            mockResponseHandler.AddFakeResponse(
                "http://l.stoffi.io/search/suggestions.json?q=lo",
                "SearchSuggestions_Lo.json");
            var httpClient     = new HttpClient(mockResponseHandler);
            var searchService  = new SearchService(httpClient);
            var suggestions    = searchService.GetSearchSuggestionsAsync("lo").Result;
            var suggestionList = new List <SearchSuggestion>(suggestions);

            Assert.AreEqual(3, suggestions.Count);
            Assert.AreEqual("love", suggestionList[0].Value);
            Assert.AreEqual(60.0, suggestionList[0].Score);
        }
        public async Task ServiceUnavailableRetryHandler_SendRequestAsync_RetriesOnTooManyRequests()
        {
            var      mockHandler = new MockMessageHandler();
            DateTime timeToStart = DateTime.Now.AddSeconds(1);

            var requestHandler = new MockResponseHandler()
            {
                CanHandleRequest = (request) => request.Method.Method == "GET" && request.RequestUri.ToString() == "http://testsite.com/test",
                HandleRequest    = async(request) =>
                {
                    try
                    {
                        System.Diagnostics.Debug.WriteLine(System.Threading.Interlocked.Increment(ref requestCount));

                        var timeToWait = timeToStart.Subtract(DateTime.Now);
                        if (timeToWait.TotalMilliseconds > 0)
                        {
                            await Task.Delay(timeToWait).ConfigureAwait(false);
                        }

                        if (requestCount < 4)
                        {
                            return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.ServiceUnavailable));
                        }
                        else
                        {
                            return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.NoContent));
                        }
                    }
                    finally
                    {
                        System.Threading.Interlocked.Increment(ref requestCount);
                    }
                }
            };

            mockHandler.AddDynamicResponse(requestHandler);

            var handler = new ServiceUnavailableRetryHandler(mockHandler, 5, TimeSpan.FromMilliseconds(1000));

            using (var client = new System.Net.Http.HttpClient(handler))
            {
                var response = await client.GetAsync("http://testsite.com/test");

                Assert.AreNotEqual(System.Net.HttpStatusCode.ServiceUnavailable, response.StatusCode);
            }
        }
Example #16
0
        public async void ArgumentProvider()
        {
            var httpHandler = new MockHttpHandler();
            var responseHandler = new MockResponseHandler<string>(x => x.Headers.Single(y => y.Name == "name").Values.Single());

            var endpoint = new HttpApiEndpoint(
                "path/to/api",
                HttpMethod.Get,
                new Dictionary<string, IHttpArgumentHandler>
                {
                    { "name", new HttpHeaderArgumentHandler(DefaultTypeConverter.Create())  }
                },
                responseHandler,
                Enumerable.Empty<HttpHeader>());
            var response = await endpoint.Call(httpHandler, "http://localhost", new Dictionary<string, object> { ["name"] = "value" });

            Assert.AreEqual("value", response);
        }
Example #17
0
        private HttpClient PrepareHttpClient(string breedName, string breedId, int responseCount = 1)
        {
            var baseUri        = "https://api.thecatapi.com/v1/";
            var breedFinderUri = $"{baseUri}breeds/search?q={HttpUtility.UrlEncode(breedName)}";
            var imageFinderUri = $"{baseUri}images/search?size=small&breed_id={breedId}";

            var mockMessageHandler = new MockResponseHandler();

            var catBreedResponse = Enumerable.Range(0, responseCount)
                                   .Select(c => new CatBreedsResponse(breedId, breedName))
                                   .ToList();

            mockMessageHandler.AddMockResponse(catBreedResponse, breedFinderUri);

            var catImageResponse = Enumerable.Range(0, responseCount)
                                   .Select(c => new CatResponse(new Uri("https://cdn2.thecatapi.com/images/" + breedId + ".jpg")))
                                   .ToList();

            mockMessageHandler.AddMockResponse(catImageResponse, imageFinderUri);

            return(new HttpClient(mockMessageHandler));
        }
Example #18
0
 private HttpClient PrepareHttpClient(MockResponseHandler mockResponseHandler)
 {
     return(new HttpClient(mockResponseHandler));
 }
        private static MockMessageHandler SetupOAuth2MockHandler()
        {
            var mockHandler = new MockMessageHandler();

            mockHandler.AddFixedResponse(new Uri("http://testsite.com/Token"), new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new System.Net.Http.StringContent(String.Empty, System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
            });
            var mockResponse = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Redirect)
            {
                Content = new System.Net.Http.StringContent("Normally this is a web page the user logs into, but this test is automated and skips that.", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
            };

            mockResponse.Headers.Location = new Uri("http://testsite.com/AuthComplete?code=28770506516186843330");
            mockHandler.AddFixedResponse(new Uri("http://testsite.com/Authorize"), mockResponse);

            var tokenIssuingHandler = new MockResponseHandler();

            tokenIssuingHandler.CanHandleRequest = (request) => { return(request.Method.Method == "POST" && request.RequestUri.ToString() == "http://testsite.com/Token"); };
            tokenIssuingHandler.HandleRequest    = async(request) =>
            {
                var content = request.Content as System.Net.Http.FormUrlEncodedContent;
                if (content == null)
                {
                    return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
                }

                var contentParams = new Dictionary <string, string>();
                var contentStr    = await content.ReadAsStringAsync().ConfigureAwait(false);

                foreach (var kvp in contentStr.Split(new char[] { '&' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    var    parts = kvp.Split(new char[] { '=' });
                    var    key   = Uri.UnescapeDataString(parts[0]);
                    string value = null;
                    if (parts.Length > 1)
                    {
                        value = Uri.UnescapeDataString(parts[1]);
                    }

                    contentParams.Add(key, value);
                }

                var grantType = (from c in contentParams where c.Key == "grant_type" select c.Value).FirstOrDefault();

                if (grantType == OAuth2.OAuth2GrantTypes.AuthorizationCode)
                {
                    var code = (from c in contentParams where c.Key == "code" select c.Value).FirstOrDefault();

                    if (code != "28770506516186843330")
                    {
                        return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
                    }

                    return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                    {
                        Content = new System.Net.Http.StringContent("{ token_type: \"Bearer\", access_token: \"123\", expires_in: \"3600\", refresh_token: \"456\" }", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
                    });
                }
                else if (grantType == OAuth2GrantTypes.ClientCredentials)
                {
                    if (request.Headers.Authorization.Scheme == "Basic" && request.Headers.Authorization.Parameter == "OTg3NjU0MzIxOmFiY2RlZmdoaWxtbm9wcXJzdHV2emFiYw==")
                    {
                        return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                        {
                            Content = new System.Net.Http.StringContent("{ token_type: \"Bearer\", access_token: \"123\", expires_in: \"3600\", refresh_token: \"456\" }", System.Text.UTF8Encoding.UTF8, MediaTypes.ApplicationJson)
                        });
                    }
                }

                return(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest));
            };
            mockHandler.AddDynamicResponse(tokenIssuingHandler);

            var authCheckingHandler = new MockResponseHandler();

            authCheckingHandler.CanHandleRequest = (request) => { return(request.RequestUri.ToString() == "http://testsite.com/TestEndpoint"); };
            authCheckingHandler.HandleRequest    = (request) =>
            {
                if (request.Headers.Authorization == null || request.Headers.Authorization.Scheme != "Bearer" || request.Headers.Authorization.Parameter != "123")
                {
                    return(Task.FromResult(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized)));
                }

                return(Task.FromResult(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
                {
                    Content = new System.Net.Http.StringContent("Yay! You're authed.")
                }));
            };
            mockHandler.AddDynamicResponse(authCheckingHandler);
            return(mockHandler);
        }
Example #20
0
        public async Task MicrosoftGraphRetryTest(HttpStatusCode statusCode)
        {
            MockResponseHandler        responseHandler = new MockResponseHandler();
            MicrosoftGraphRetryHandler retryHandler    = new MicrosoftGraphRetryHandler(null)
            {
                InnerHandler = responseHandler,
                // Set delay to zero to speed up test case
                DelayInSeconds = 0,
                // Start with testing without retry header
                UseRetryAfterHeader = false,
                // Start with default values for the other settings
                MaxRetries       = 10,
                IncrementalDelay = true
            };

            using (HttpMessageInvoker invoker = new HttpMessageInvoker(retryHandler))
            {
                var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://pnp.com/rocks");

                // Check 1: basic retry
                var retryResponse  = new HttpResponseMessage(statusCode);
                var secondResponse = new HttpResponseMessage(HttpStatusCode.OK);
                responseHandler.SetHttpResponse(retryResponse, secondResponse);

                var response = await invoker.SendAsync(httpRequestMessage, new CancellationToken());

                Assert.AreEqual(response, secondResponse);

                // Check 2: bump into max retries
                retryResponse  = new HttpResponseMessage(statusCode);
                secondResponse = new HttpResponseMessage(statusCode);
                responseHandler.SetHttpResponse(retryResponse, secondResponse);

                bool exceptionThrown = false;
                try
                {
                    response = await invoker.SendAsync(httpRequestMessage, new CancellationToken());
                }
                catch (Exception ex)
                {
                    if (ex is ServiceException)
                    {
                        exceptionThrown = true;
                        var serviceException = ex as ServiceException;
                        Assert.IsTrue((serviceException.Error as ServiceError).HttpResponseCode == (int)statusCode);
                    }
                }
                Assert.IsTrue(exceptionThrown);

                // Check 3: retry-header testing
                retryHandler.UseRetryAfterHeader = true;
                retryResponse = new HttpResponseMessage(statusCode);
                retryResponse.Headers.TryAddWithoutValidation(RETRY_AFTER, "0");
                secondResponse = new HttpResponseMessage(HttpStatusCode.OK);
                responseHandler.SetHttpResponse(retryResponse, secondResponse);

                response = await invoker.SendAsync(httpRequestMessage, new CancellationToken());

                Assert.AreEqual(response, secondResponse);
                response.RequestMessage.Headers.TryGetValues(RETRY_ATTEMPT, out IEnumerable <string> values);
                Assert.AreEqual(values.First(), "1");
            }
        }