Skip to content

Commit 1e97877

Browse files
committed
Changed retry tests to allow multiple behaviours
1 parent dbb6f10 commit 1e97877

File tree

4 files changed

+44
-39
lines changed

4 files changed

+44
-39
lines changed

src/SendGrid/Helpers/Reliability/ReliabilitySettings.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public int RetryCount
3838

3939
if (value > 5)
4040
{
41-
throw new ArgumentException("Retry count must be less than 5");
41+
throw new ArgumentException("The maximum number of retries is 5");
4242
}
4343

4444
retryCount = value;
@@ -59,7 +59,7 @@ public TimeSpan RetryInterval
5959
{
6060
if (value.TotalSeconds > 30)
6161
{
62-
throw new ArgumentException("Maximum retry interval is 30 seconds");
62+
throw new ArgumentException("The maximum retry interval is 30 seconds");
6363
}
6464

6565
retryInterval = value;

src/SendGrid/Helpers/Reliability/RetryDelegatingHandler.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
using System;
2-
using System.Net.Http;
3-
using System.Threading;
4-
using System.Threading.Tasks;
5-
using Polly;
6-
using Polly.Retry;
7-
8-
namespace SendGrid.Helpers.Reliability
1+
namespace SendGrid.Helpers.Reliability
92
{
3+
using System;
4+
using System.Net.Http;
5+
using System.Threading;
6+
using System.Threading.Tasks;
7+
using Polly;
8+
using Polly.Retry;
9+
1010
public class RetryDelegatingHandler : DelegatingHandler
1111
{
1212
private readonly ReliabilitySettings settings;

tests/SendGrid.Tests/Helpers/Reliability/RetryDelegatingHandlerTests.cs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public RetryDelegatingHandlerTests()
1919
{
2020
reliabilitySettings = new ReliabilitySettings
2121
{
22-
RetryCount = 2
22+
RetryCount = 1
2323
};
2424
innerHandler = new RetryTestBehaviourDelegatingHandler();
2525
client = new HttpClient(new RetryDelegatingHandler(innerHandler, reliabilitySettings))
@@ -31,7 +31,7 @@ public RetryDelegatingHandlerTests()
3131
[Fact]
3232
public async Task Invoke_ShouldReturnHttpResponseAndNotRetryWhenSuccessful()
3333
{
34-
innerHandler.ConfigureBehaviour(innerHandler.OK);
34+
innerHandler.AddBehaviour(innerHandler.OK);
3535

3636
var result = await client.SendAsync(new HttpRequestMessage());
3737

@@ -42,7 +42,7 @@ public async Task Invoke_ShouldReturnHttpResponseAndNotRetryWhenSuccessful()
4242
[Fact]
4343
public async Task Invoke_ShouldReturnHttpResponseAndNotRetryWhenUnauthorised()
4444
{
45-
innerHandler.ConfigureBehaviour(innerHandler.AuthenticationError);
45+
innerHandler.AddBehaviour(innerHandler.AuthenticationError);
4646

4747
var result = await client.SendAsync(new HttpRequestMessage());
4848

@@ -53,43 +53,45 @@ public async Task Invoke_ShouldReturnHttpResponseAndNotRetryWhenUnauthorised()
5353
[Fact]
5454
public async Task Invoke_ShouldReturnErrorWithoutRetryWhenErrorIsNotTransient()
5555
{
56-
innerHandler.ConfigureBehaviour(innerHandler.NonTransientException);
56+
innerHandler.AddBehaviour(innerHandler.NonTransientException);
5757

58-
await Assert.ThrowsAsync<InvalidOperationException>(
59-
() =>
60-
{
61-
return client.SendAsync(new HttpRequestMessage());
62-
});
58+
await Assert.ThrowsAsync<InvalidOperationException>(() => client.SendAsync(new HttpRequestMessage()));
6359

6460
Assert.Equal(1, innerHandler.InvocationCount);
6561
}
6662

63+
[Fact]
64+
public async Task Invoke_ShoulddRetryOnceWhenFailedOnFirstAttemptThenSuccessful()
65+
{
66+
innerHandler.AddBehaviour(innerHandler.TaskCancelled);
67+
innerHandler.AddBehaviour(innerHandler.OK);
68+
69+
var result = await client.SendAsync(new HttpRequestMessage());
70+
71+
Assert.Equal(result.StatusCode, HttpStatusCode.OK);
72+
Assert.Equal(2, innerHandler.InvocationCount);
73+
}
74+
6775
[Fact]
6876
public async Task Invoke_ShouldRetryTheExpectedAmountOfTimesAndReturnTimeoutExceptionWhenTasksCancelled()
6977
{
70-
innerHandler.ConfigureBehaviour(innerHandler.TaskCancelled);
78+
innerHandler.AddBehaviour(innerHandler.TaskCancelled);
79+
innerHandler.AddBehaviour(innerHandler.TaskCancelled);
7180

72-
await Assert.ThrowsAsync<TimeoutException>(
73-
() =>
74-
{
75-
return client.SendAsync(new HttpRequestMessage());
76-
});
81+
await Assert.ThrowsAsync<TimeoutException>(() => client.SendAsync(new HttpRequestMessage()));
7782

78-
Assert.Equal(3, innerHandler.InvocationCount);
83+
Assert.Equal(2, innerHandler.InvocationCount);
7984
}
8085

8186
[Fact]
8287
public async Task Invoke_ShouldRetryTheExpectedAmountOfTimesAndReturnExceptionWhenInternalServerErrorsEncountered()
8388
{
84-
innerHandler.ConfigureBehaviour(innerHandler.InternalServerError);
89+
innerHandler.AddBehaviour(innerHandler.InternalServerError);
90+
innerHandler.AddBehaviour(innerHandler.InternalServerError);
8591

86-
await Assert.ThrowsAsync<HttpRequestException>(
87-
() =>
88-
{
89-
return client.SendAsync(new HttpRequestMessage());
90-
});
92+
await Assert.ThrowsAsync<HttpRequestException>(() => client.SendAsync(new HttpRequestMessage()));
9193

92-
Assert.Equal(3, innerHandler.InvocationCount);
94+
Assert.Equal(2, innerHandler.InvocationCount);
9395
}
9496

9597
[Fact]

tests/SendGrid.Tests/Helpers/Reliability/RetryTestBehaviourDelegatingHandler.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Net;
34
using System.Net.Http;
45
using System.Threading;
@@ -8,22 +9,24 @@ namespace SendGrid.Tests.Helpers.Reliability
89
{
910
public class RetryTestBehaviourDelegatingHandler : DelegatingHandler
1011
{
11-
private Func<Task<HttpResponseMessage>> behaviour;
12+
private readonly List<Func<Task<HttpResponseMessage>>> behaviours;
1213

1314
public RetryTestBehaviourDelegatingHandler()
1415
{
15-
ConfigureBehaviour(OK);
16+
behaviours = new List<Func<Task<HttpResponseMessage>>>();
1617
}
1718

1819
public int InvocationCount { get; private set; }
1920

20-
public void ConfigureBehaviour(Func<Task<HttpResponseMessage>> configuredBehavior)
21+
public void AddBehaviour(Func<Task<HttpResponseMessage>> configuredBehavior)
2122
{
22-
behaviour = () =>
23+
Task<HttpResponseMessage> behaviour()
2324
{
2425
InvocationCount++;
2526
return configuredBehavior();
26-
};
27+
}
28+
29+
behaviours.Add(behaviour);
2730
}
2831

2932
public Task<HttpResponseMessage> OK()
@@ -57,7 +60,7 @@ public Task<HttpResponseMessage> NonTransientException()
5760

5861
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
5962
{
60-
return behaviour();
63+
return behaviours[InvocationCount]();
6164
}
6265
}
6366
}

0 commit comments

Comments
 (0)