Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 5
0
        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");
        }
Ejemplo n.º 7
0
        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);
        }
Ejemplo n.º 8
0
        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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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);
        }
Ejemplo n.º 13
0
        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);
        }
Ejemplo n.º 14
0
 public Configuration()
 {
     PreferredRetryStrategy = new DefaultRetryStrategy(TimeSpan.FromSeconds(5), 3);
 }