public async Task RespectsMaxDelay() { var responseClassifier = new MockResponseClassifier(retriableCodes: new [] { 500 }); var policy = new ExponentialRetryPolicyMock(maxRetries: 6, delay: TimeSpan.FromSeconds(1), maxDelay: TimeSpan.FromSeconds(5)); var mockTransport = new MockTransport(); var task = SendRequest(mockTransport, policy, responseClassifier); var expectedDelaysInSeconds = new int[] { 1, 2, 4, 5, 5, 5 }; await mockTransport.RequestGate.Cycle(new MockResponse(500)); for (int i = 0; i < 6; i++) { var delay = await policy.DelayGate.Cycle(); AssertExponentialDelay(TimeSpan.FromSeconds(expectedDelaysInSeconds[i]), delay); await mockTransport.RequestGate.Cycle(new MockResponse(500)); } var response = await task.TimeoutAfterDefault(); Assert.AreEqual(500, response.Status); }
public async Task MsHeadersArePreferredOverRetryAfter(string headerName) { var responseClassifier = new MockResponseClassifier(retriableCodes: new[] { 500 }); (HttpPipelinePolicy policy, AsyncGate <TimeSpan, object> gate) = CreateRetryPolicy(maxRetries: 3); var mockTransport = new MockTransport(); Task <Response> task = SendGetRequest(mockTransport, policy, responseClassifier); MockResponse mockResponse = new MockResponse(500); mockResponse.AddHeader(new HttpHeader("Retry-After", "1")); mockResponse.AddHeader(new HttpHeader(headerName, "120000")); await mockTransport.RequestGate.Cycle(mockResponse); TimeSpan retryDelay = await gate.Cycle(); await mockTransport.RequestGate.Cycle(new MockResponse(501)); Response response = await task.TimeoutAfterDefault(); Assert.AreEqual(TimeSpan.FromMilliseconds(120000), retryDelay); Assert.AreEqual(501, response.Status); }
public async Task RespectsRetryAfterHeaderWithDate() { var responseClassifier = new MockResponseClassifier(retriableCodes: new[] { 500 }); (HttpPipelinePolicy policy, AsyncGate <TimeSpan, object> gate) = CreateRetryPolicy(maxRetries: 3); var mockTransport = new MockTransport(); Task <Response> task = SendGetRequest(mockTransport, policy, responseClassifier); MockResponse mockResponse = new MockResponse(500); // Use large value to avoid time based flakiness mockResponse.AddHeader(new HttpHeader("Retry-After", DateTimeOffset.Now.AddHours(5).ToString("R"))); await mockTransport.RequestGate.Cycle(mockResponse); TimeSpan retryDelay = await gate.Cycle(); await mockTransport.RequestGate.Cycle(new MockResponse(501)); Response response = await task.TimeoutAfterDefault(); Assert.Less(TimeSpan.FromHours(4), retryDelay); Assert.AreEqual(501, response.Status); }