public async Task ExecuteRequestAsync_ThrowsException_Fail() { // Request var url = "http://localhost:8080/x"; var method = HttpMethod.GET; var requestContent = "Test"; var requestHeaders = new Dictionary <string, string> { ["X-Custom-Header"] = "123", }; var request = new MercadoPagoRequest(url, method, requestHeaders, requestContent); // Mock var httpClientMock = new HttpClientMock(); httpClientMock.MockRequestError( url, System.Net.Http.HttpMethod.Get, new Exception()); var httpClient = new DefaultHttpClient(httpClientMock.HttpClient); var retryStrategy = new DefaultRetryStrategy(1); await Assert.ThrowsAsync <Exception>(() => httpClient.SendAsync(request, retryStrategy, default)); }
public async Task RetryOnlyWith429Responses() { var dateHeader = DateTime.Now; var resetTime = new DateTimeOffset(dateHeader).AddSeconds(1).ToUnixTimeSeconds(); var response = Substitute.For <HttpResponseMessage>(); response.StatusCode = (HttpStatusCode)429; response.Headers.Add("X-Rate-Limit-Reset", resetTime.ToString()); response.Headers.Add("Date", dateHeader.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'")); response.Headers.Add("X-Okta-Request-Id", "foo"); var successResponse = Substitute.For <HttpResponseMessage>(); successResponse.StatusCode = HttpStatusCode.OK; var request = Substitute.For <HttpRequestMessage>(); request.RequestUri = new Uri("https://foo.dev"); var operation = Substitute.For <Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > >(); operation(request, default(CancellationToken)).ReturnsForAnyArgs(x => response, x => successResponse); var retryStrategy = new DefaultRetryStrategy(5, 0); var retryResponse = await retryStrategy.WaitAndRetryAsync(request, default(CancellationToken), operation); operation.ReceivedCalls().Count().Should().Be(2); retryResponse.StatusCode.Should().Be(HttpStatusCode.OK); }
public async Task ExecuteRequestAsync_AllParameters_Success() { // Request var url = "http://localhost:8080/x"; var method = HttpMethod.GET; var requestContent = "Test"; var requestHeaders = new Dictionary <string, string> { ["X-Custom-Header"] = "123", }; var request = new MercadoPagoRequest(url, method, requestHeaders, requestContent); // Response var responseStatusCode = HttpStatusCode.OK; var responseContent = "OK"; var httpResponse = new HttpResponseMessage(responseStatusCode) { Content = new StringContent(responseContent), }; httpResponse.Headers.Add("X-Custom-Response-Header", "456"); // Mock var httpClientMock = new HttpClientMock(); httpClientMock.MockRequest(url, System.Net.Http.HttpMethod.Get, httpResponse); var httpClient = new DefaultHttpClient(httpClientMock.HttpClient); var retryStrategy = new DefaultRetryStrategy(0); MercadoPagoResponse response = await httpClient.SendAsync(request, retryStrategy, default); Assert.Equal((int)responseStatusCode, response.StatusCode); Assert.Equal(responseContent, response.Content); }
public async Task StopRetryWhenTimeoutIsReached() { var dateHeader = DateTime.Now; var resetTime = new DateTimeOffset(dateHeader).AddSeconds(5).ToUnixTimeSeconds(); var response = Substitute.For <HttpResponseMessage>(); response.StatusCode = (HttpStatusCode)429; response.Headers.Add("X-Rate-Limit-Reset", resetTime.ToString()); response.Headers.Add("Date", dateHeader.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'")); response.Headers.Add("X-Okta-Request-Id", "foo"); var request = Substitute.For <HttpRequestMessage>(); request.RequestUri = new Uri("https://foo.dev"); var operation = Substitute.For <Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > >(); operation(request, default(CancellationToken)).Returns(x => { Thread.Sleep(2000); return(response); }); var retryStrategy = new DefaultRetryStrategy(10, 1); var retryResponse = await retryStrategy.WaitAndRetryAsync(request, default(CancellationToken), operation); retryResponse.StatusCode.Should().Be((HttpStatusCode)429); var receivedCalls = operation.ReceivedCalls(); receivedCalls.Count().Should().Be(1); }
public async Task RetryOperationUntilMaxRetriesIsReached() { var dateHeader = DateTime.Now; var resetTime = new DateTimeOffset(dateHeader).AddSeconds(1).ToUnixTimeSeconds(); var response = Substitute.For <HttpResponseMessage>(); response.StatusCode = (HttpStatusCode)429; response.Headers.Add("X-Rate-Limit-Reset", resetTime.ToString()); response.Headers.Date = dateHeader.ToUniversalTime(); response.Headers.Add("X-Okta-Request-Id", "foo"); var request = Substitute.For <HttpRequestMessage>(); request.RequestUri = new Uri("https://foo.dev"); var operation = Substitute.For <Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > >(); operation(request, default(CancellationToken)).ReturnsForAnyArgs(response); operation(request, default(CancellationToken)).Result.StatusCode.Should().Be(429); operation.ClearReceivedCalls(); var retryStrategy = new DefaultRetryStrategy(1, 0); var retryResponse = await retryStrategy.WaitAndRetryAsync(request, default(CancellationToken), operation); operation.ReceivedCalls().Count().Should().Be(2); retryResponse.StatusCode.Should().Be((HttpStatusCode)429); }
public async Task AddOktaHeadersInRetry() { var dateHeader = DateTime.Now; var resetTime = new DateTimeOffset(dateHeader).AddSeconds(1).ToUnixTimeSeconds(); var response = Substitute.For <HttpResponseMessage>(); response.StatusCode = (HttpStatusCode)429; response.Headers.Add("X-Rate-Limit-Reset", resetTime.ToString()); response.Headers.Add("Date", dateHeader.ToUniversalTime().ToString("ddd, dd MMM yyyy HH:mm:ss 'GMT'")); response.Headers.Add("X-Okta-Request-Id", "foo"); var request = Substitute.For <HttpRequestMessage>(); request.RequestUri = new Uri("https://foo.dev"); var requestHeadersDictionary = new Dictionary <int, List <KeyValuePair <string, IEnumerable <string> > > >(); var numberOfExecutions = 0; var operation = Substitute.For <Func <HttpRequestMessage, CancellationToken, Task <HttpResponseMessage> > >(); operation(request, default(CancellationToken)).ReturnsForAnyArgs( x => { var receivedRequest = (HttpRequestMessage)x.Args().GetValue(0); requestHeadersDictionary.Add(numberOfExecutions, receivedRequest.Headers.ToList()); numberOfExecutions++; return(response); }); var retryStrategy = new DefaultRetryStrategy(1, 0); var retryResponse = await retryStrategy.WaitAndRetryAsync(request, default(CancellationToken), operation); numberOfExecutions.Should().Be(2); retryResponse.StatusCode.Should().Be((HttpStatusCode)429); var receivedCalls = operation.ReceivedCalls(); receivedCalls.Count().Should().Be(2); requestHeadersDictionary.Count.Should().Be(2); requestHeadersDictionary[0].Should().BeNullOrEmpty(); requestHeadersDictionary[1].Should().HaveCount(2); var retryForHeader = requestHeadersDictionary[1].FirstOrDefault(x => x.Key == "X-Okta-Retry-For"); retryForHeader.Should().NotBeNull(); retryForHeader.Value.Should().Contain("foo"); var retryCountHeader = requestHeadersDictionary[1].FirstOrDefault(x => x.Key == "X-Okta-Retry-Count"); retryCountHeader.Should().NotBeNull(); retryCountHeader.Value.Should().Contain("1"); }
public void ShouldRetry_RequestNull_NotRetry() { var maxNumberRetries = 2; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); HttpRequestMessage httpRequest = null; var httpResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError); var hadRetryableError = false; var numberRetries = 0; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetries); Assert.False(retryResponse.Retry); Assert.Equal(TimeSpan.Zero.Ticks, retryResponse.Delay.Ticks); }
public void ShouldRetry_MaxDelay_Retry() { var maxNumberRetries = 5; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); var httpRequest = new HttpRequestMessage(HttpMethod.Get, "http://localhost:8080/x"); var httpResponse = new HttpResponseMessage(HttpStatusCode.InternalServerError); var hadRetryableError = false; var numberRetries = 4; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetries); Assert.True(retryResponse.Retry); Assert.Equal(DefaultRetryStrategy.MaxDelay.Ticks, retryResponse.Delay.Ticks); }
public void ShouldRetry_RetryableRequestAndRetryableError_Retry() { var maxNumberRetries = 2; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); var httpRequest = new HttpRequestMessage(HttpMethod.Get, "http://localhost:8080/x"); HttpResponseMessage httpResponse = null; var hadRetryableError = true; var numberRetry = 0; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetry); Assert.True(retryResponse.Retry); Assert.Equal(DefaultRetryStrategy.MinDelay.Ticks, retryResponse.Delay.Ticks); }
public void ShouldRetry_NoRetryableErrorAndNotRetryableResponse_NotRetry() { var maxNumberRetries = 2; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); var httpRequest = new HttpRequestMessage(HttpMethod.Get, "http://localhost:8080/x"); var httpResponse = new HttpResponseMessage(HttpStatusCode.OK); var hadRetryableError = false; var numberRetries = 0; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetries); Assert.False(retryResponse.Retry); Assert.Equal(TimeSpan.Zero.Ticks, retryResponse.Delay.Ticks); }
public void ShouldRetry_PostWithIdempotencyKeyEmpty_NotRetry() { var maxNumberRetries = 2; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/x"); httpRequest.Headers.Add(Headers.IdempotencyKey, string.Empty); var httpResponse = new HttpResponseMessage(HttpStatusCode.Conflict); var hadRetryableError = false; var numberRetries = 1; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetries); Assert.False(retryResponse.Retry); Assert.Equal(TimeSpan.Zero.Ticks, retryResponse.Delay.Ticks); }
public void ShouldRetry_PostWithIdempotencyKeyAndRetryableStatusCode_Retry() { var maxNumberRetries = 2; var retryStrategy = new DefaultRetryStrategy(maxNumberRetries); var httpRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:8080/x"); httpRequest.Headers.Add(Headers.IdempotencyKey, Guid.NewGuid().ToString()); var httpResponse = new HttpResponseMessage(HttpStatusCode.Conflict); var hadRetryableError = false; var numberRetries = 1; RetryResponse retryResponse = retryStrategy.ShouldRetry( httpRequest, httpResponse, hadRetryableError, numberRetries); Assert.True(retryResponse.Retry); Assert.Equal( 2 * DefaultRetryStrategy.MinDelay.Ticks, retryResponse.Delay.Ticks); }
public async Task ExecuteRequestAsync_WithOperationCanceledExceptionRetry_Success() { // Request var url = "http://localhost:8080/x"; var method = HttpMethod.GET; var requestContent = "Test"; var requestHeaders = new Dictionary <string, string> { ["X-Custom-Header"] = "123", }; var request = new MercadoPagoRequest(url, method, requestHeaders, requestContent); // Response var responseStatusCode = HttpStatusCode.OK; var responseContent = "OK"; var finalHttpResponse = new HttpResponseMessage(responseStatusCode) { Content = new StringContent(responseContent), }; // Mock var httpClientMock = new HttpClientMock(); httpClientMock.MockRequest( url, System.Net.Http.HttpMethod.Get, (setupReturns) => setupReturns .ThrowsAsync(new OperationCanceledException()) .ReturnsAsync(finalHttpResponse)); var httpClient = new DefaultHttpClient(httpClientMock.HttpClient); var retryStrategy = new DefaultRetryStrategy(1); MercadoPagoResponse response = await httpClient.SendAsync(request, retryStrategy, default); Assert.Equal((int)responseStatusCode, response.StatusCode); Assert.Equal(responseContent, response.Content); }
public Configuration() { PreferredRetryStrategy = new DefaultRetryStrategy(TimeSpan.FromSeconds(5), 3); }