public async Task WaitsBetweenRetries() { var policy = new ExponentialRetryPolicyMock(retriableCodes: new [] { 500 }, delay: TimeSpan.FromSeconds(1), maxDelay: TimeSpan.FromSeconds(10)); var mockTransport = new MockTransport(); var task = SendRequest(mockTransport, policy); await mockTransport.RequestGate.Cycle(new MockResponse(500)); var delay = await policy.DelayGate.Cycle(); AssertExponentialDelay(TimeSpan.FromSeconds(1), delay); await mockTransport.RequestGate.Cycle(new MockResponse(200)); var response = await task.TimeoutAfterDefault(); Assert.AreEqual(200, response.Status); }
public async Task RespectsMaxDelay() { var policy = new ExponentialRetryPolicyMock(retriableCodes: new [] { 500 }, maxRetries: 6, delay: TimeSpan.FromSeconds(1), maxDelay: TimeSpan.FromSeconds(5)); var mockTransport = new MockTransport(); var task = SendRequest(mockTransport, policy); 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 UsesLargerOfDelayAndServerDelay(int delay, int retryAfter, int expected) { var responseClassifier = new MockResponseClassifier(retriableCodes: new [] { 500 }); var policy = new ExponentialRetryPolicyMock(delay: TimeSpan.FromSeconds(delay), maxDelay: TimeSpan.FromSeconds(5)); var mockTransport = CreateMockTransport(); var task = SendGetRequest(mockTransport, policy, responseClassifier); MockResponse mockResponse = new MockResponse(500); mockResponse.AddHeader(new HttpHeader("Retry-After", retryAfter.ToString())); await mockTransport.RequestGate.Cycle(mockResponse); var retryDelay = await policy.DelayGate.Cycle(); await mockTransport.RequestGate.Cycle(new MockResponse(501)); var response = await task.TimeoutAfterDefault(); AssertExponentialDelay(TimeSpan.FromSeconds(expected), retryDelay); Assert.AreEqual(501, response.Status); }
public async Task WaitsSameAmountEveryTime() { var responseClassifier = new MockResponseClassifier(retriableCodes: new [] { 500 }); var policy = new ExponentialRetryPolicyMock(maxRetries: 4, delay: TimeSpan.FromSeconds(1), maxDelay: TimeSpan.FromSeconds(10)); var mockTransport = CreateMockTransport(); var task = SendGetRequest(mockTransport, policy, responseClassifier); var expectedDelaysInSeconds = new int[] { 1, 2, 4, 8 }; await mockTransport.RequestGate.Cycle(new MockResponse(500)); for (int i = 0; i < 4; 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); }
protected override (HttpPipelinePolicy, AsyncGate <TimeSpan, object>) CreateRetryPolicy(int[] retriableCodes, Func <Exception, bool> exceptionFilter = null, int maxRetries = 3) { var policy = new ExponentialRetryPolicyMock(retriableCodes, exceptionFilter, maxRetries, TimeSpan.FromSeconds(3), maxDelay: TimeSpan.MaxValue); return(policy, policy.DelayGate); }
protected override (HttpPipelinePolicy, AsyncGate <TimeSpan, object>) CreateRetryPolicy(int maxRetries = 3) { var policy = new ExponentialRetryPolicyMock(maxRetries, TimeSpan.FromSeconds(3), maxDelay: TimeSpan.MaxValue); return(policy, policy.DelayGate); }