Skip to content

Commit cddf4d0

Browse files
authored
Provide CancellationToken parameters on async methods (#74)
* Add editorconfig * Provide CancellationToken parameters on async methods
1 parent d64789c commit cddf4d0

14 files changed

+124
-87
lines changed

.editorconfig

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# http://editorconfig.org
2+
3+
# This file is the top-most EditorConfig file
4+
root = true
5+
6+
# All Files
7+
[*]
8+
indent_style = space
9+
indent_size = 4

MbDotNet.Tests/Client/DeleteImposterTests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ public async Task CallsDelete()
1515

1616
Client.Imposters.Add(new HttpImposter(port, null));
1717

18-
MockRequestProxy.Setup(x => x.DeleteImposterAsync(port)).Returns(Task.CompletedTask);
18+
MockRequestProxy.Setup(x => x.DeleteImposterAsync(port, default)).Returns(Task.CompletedTask);
1919

2020
await Client.DeleteImposterAsync(port).ConfigureAwait(false);
2121

22-
MockRequestProxy.Verify(x => x.DeleteImposterAsync(port), Times.Once);
22+
MockRequestProxy.Verify(x => x.DeleteImposterAsync(port, default), Times.Once);
2323
}
2424

2525
[TestMethod]
@@ -37,20 +37,20 @@ public async Task RemovesImposterFromCollection()
3737
[TestMethod]
3838
public async Task DeleteAllImposters_CallsDeleteAll()
3939
{
40-
MockRequestProxy.Setup(x => x.DeleteAllImpostersAsync()).Returns(Task.CompletedTask);
40+
MockRequestProxy.Setup(x => x.DeleteAllImpostersAsync(default)).Returns(Task.CompletedTask);
4141

4242
Client.Imposters.Add(new HttpImposter(123, null));
4343
Client.Imposters.Add(new HttpImposter(456, null));
4444

4545
await Client.DeleteAllImpostersAsync().ConfigureAwait(false);
4646

47-
MockRequestProxy.Verify(x => x.DeleteAllImpostersAsync(), Times.Once);
47+
MockRequestProxy.Verify(x => x.DeleteAllImpostersAsync(default), Times.Once);
4848
}
4949

5050
[TestMethod]
5151
public async Task DeleteAllImposters_RemovesAllImpostersFromCollection()
5252
{
53-
MockRequestProxy.Setup(x => x.DeleteAllImpostersAsync()).Returns(Task.CompletedTask);
53+
MockRequestProxy.Setup(x => x.DeleteAllImpostersAsync(default)).Returns(Task.CompletedTask);
5454

5555
Client.Imposters.Add(new HttpImposter(123, null));
5656
Client.Imposters.Add(new HttpImposter(456, null));

MbDotNet.Tests/Client/GetHttpImposterTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class GetHttpImposterTests : MountebankClientTestBase
1414
public async Task NonHttpImposterRetrieved_ThrowsInvalidProtocolException()
1515
{
1616
const int port = 6000;
17-
MockRequestProxy.Setup(x => x.GetHttpImposterAsync(port)).ReturnsAsync(new RetrievedHttpImposter {Protocol = "Tcp"});
17+
MockRequestProxy.Setup(x => x.GetHttpImposterAsync(port, default)).ReturnsAsync(new RetrievedHttpImposter {Protocol = "Tcp"});
1818

1919
await Client.GetHttpImposterAsync(port).ConfigureAwait(false);
2020
}
@@ -29,7 +29,7 @@ public async Task HttpImposterRetrieved_ReturnsImposter()
2929
Protocol = "Http"
3030
};
3131

32-
MockRequestProxy.Setup(x => x.GetHttpImposterAsync(port)).ReturnsAsync(expectedImposter);
32+
MockRequestProxy.Setup(x => x.GetHttpImposterAsync(port, default)).ReturnsAsync(expectedImposter);
3333

3434
var result = await Client.GetHttpImposterAsync(port).ConfigureAwait(false);
3535

MbDotNet.Tests/Client/GetHttpsImposterTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class GetHttpsImposterTests : MountebankClientTestBase
1414
public async Task NonHttpsImposterRetrieved_ThrowsInvalidProtocolException()
1515
{
1616
const int port = 6000;
17-
MockRequestProxy.Setup(x => x.GetHttpsImposterAsync(port)).ReturnsAsync(new RetrievedHttpsImposter() { Protocol = "Tcp" });
17+
MockRequestProxy.Setup(x => x.GetHttpsImposterAsync(port, default)).ReturnsAsync(new RetrievedHttpsImposter() { Protocol = "Tcp" });
1818

1919
await Client.GetHttpsImposterAsync(port).ConfigureAwait(false);
2020
}
@@ -29,7 +29,7 @@ public async Task HttpsImposterRetrieved_ReturnsImposter()
2929
Protocol = "Https"
3030
};
3131

32-
MockRequestProxy.Setup(x => x.GetHttpsImposterAsync(port)).ReturnsAsync(expectedImposter);
32+
MockRequestProxy.Setup(x => x.GetHttpsImposterAsync(port, default)).ReturnsAsync(expectedImposter);
3333

3434
var result = await Client.GetHttpsImposterAsync(port).ConfigureAwait(false);
3535

MbDotNet.Tests/Client/GetTcpImposterTests.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class GetTcpImposterTests : MountebankClientTestBase
1414
public async Task NonTcpImposterRetrieved_ThrowsInvalidProtocolException()
1515
{
1616
const int port = 6000;
17-
MockRequestProxy.Setup(x => x.GetTcpImposterAsync(port)).ReturnsAsync(new RetrievedTcpImposter { Protocol = "Http" });
17+
MockRequestProxy.Setup(x => x.GetTcpImposterAsync(port, default)).ReturnsAsync(new RetrievedTcpImposter { Protocol = "Http" });
1818

1919
await Client.GetTcpImposterAsync(port).ConfigureAwait(false);
2020
}
@@ -29,7 +29,7 @@ public async Task TcpImposterRetrieved_ReturnsImposter()
2929
Protocol = "Tcp"
3030
};
3131

32-
MockRequestProxy.Setup(x => x.GetTcpImposterAsync(port)).ReturnsAsync(expectedImposter);
32+
MockRequestProxy.Setup(x => x.GetTcpImposterAsync(port, default)).ReturnsAsync(expectedImposter);
3333

3434
var result = await Client.GetTcpImposterAsync(port).ConfigureAwait(false);
3535

MbDotNet.Tests/Client/SubmitTests.cs

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ public async Task Submit_CallsSubmitOnAllPendingImposters()
2020

2121
await Client.SubmitAsync(new[] { imposter1, imposter2 }).ConfigureAwait(false);
2222

23-
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == firstPortNumber)), Times.Once);
24-
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == secondPortNumber)), Times.Once);
23+
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == firstPortNumber), default), Times.Once);
24+
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == secondPortNumber), default), Times.Once);
2525
}
2626

2727
[TestMethod]
@@ -35,8 +35,8 @@ public async Task SubmitCollection_ShouldSubmitImpostersUsingProxy()
3535

3636
await Client.SubmitAsync(new[] { imposter1, imposter2 }).ConfigureAwait(false);
3737

38-
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == firstPortNumber)), Times.Once);
39-
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == secondPortNumber)), Times.Once);
38+
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == firstPortNumber), default), Times.Once);
39+
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == secondPortNumber), default), Times.Once);
4040
}
4141

4242
[TestMethod]
@@ -61,7 +61,7 @@ public async Task Submit_AllowsNullPort()
6161

6262
await Client.SubmitAsync(imposter).ConfigureAwait(false);
6363

64-
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == default(int))), Times.Once);
64+
MockRequestProxy.Verify(x => x.CreateImposterAsync(It.Is<Imposter>(imp => imp.Port == default), default), Times.Once);
6565
}
6666
}
6767
}

MbDotNet.Tests/MountebankRequestProxyTests.cs

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Net;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45
using MbDotNet.Exceptions;
56
using MbDotNet.Models.Imposters;
@@ -29,12 +30,12 @@ public async Task DeleteAllImposters_SendsRequest()
2930

3031
var response = GetResponse(HttpStatusCode.OK);
3132

32-
_mockClient.Setup(x => x.DeleteAsync(expectedResource))
33+
_mockClient.Setup(x => x.DeleteAsync(expectedResource, default))
3334
.ReturnsAsync(response);
3435

3536
await _proxy.DeleteAllImpostersAsync().ConfigureAwait(false);
3637

37-
_mockClient.Verify(x => x.DeleteAsync(expectedResource), Times.Once);
38+
_mockClient.Verify(x => x.DeleteAsync(expectedResource, default), Times.Once);
3839
}
3940

4041
[TestMethod]
@@ -43,7 +44,7 @@ public async Task DeleteAllImposters_StatusCodeNotOk_ThrowsMountebankException()
4344
{
4445
var response = GetResponse(HttpStatusCode.BadRequest);
4546

46-
_mockClient.Setup(x => x.DeleteAsync(It.IsAny<string>()))
47+
_mockClient.Setup(x => x.DeleteAsync(It.IsAny<string>(), default))
4748
.ReturnsAsync(response);
4849

4950
await _proxy.DeleteAllImpostersAsync().ConfigureAwait(false);
@@ -57,12 +58,12 @@ public async Task DeleteImposter_SendsRequest_ImpostersResourceWithPort()
5758

5859
var response = GetResponse(HttpStatusCode.OK);
5960

60-
_mockClient.Setup(x => x.DeleteAsync(expectedResource))
61+
_mockClient.Setup(x => x.DeleteAsync(expectedResource, default))
6162
.ReturnsAsync(response);
6263

6364
await _proxy.DeleteImposterAsync(port).ConfigureAwait(false);
6465

65-
_mockClient.Verify(x => x.DeleteAsync(expectedResource), Times.Once);
66+
_mockClient.Verify(x => x.DeleteAsync(expectedResource, default), Times.Once);
6667
}
6768

6869
[TestMethod]
@@ -71,7 +72,7 @@ public async Task DeleteImposter_StatusCodeNotOk_ThrowsMountebankException()
7172
{
7273
var response = GetResponse(HttpStatusCode.BadRequest);
7374

74-
_mockClient.Setup(x => x.DeleteAsync(It.IsAny<string>()))
75+
_mockClient.Setup(x => x.DeleteAsync(It.IsAny<string>(), default))
7576
.ReturnsAsync(response);
7677

7778
await _proxy.DeleteImposterAsync(123).ConfigureAwait(false);
@@ -84,12 +85,12 @@ public async Task CreateImposter_SendsRequest_ImpostersResource()
8485

8586
var response = GetResponse(HttpStatusCode.Created);
8687

87-
_mockClient.Setup(x => x.PostAsync(expectedResource, It.IsAny<HttpContent>()))
88+
_mockClient.Setup(x => x.PostAsync(expectedResource, It.IsAny<HttpContent>(), default))
8889
.ReturnsAsync(response);
8990

9091
await _proxy.CreateImposterAsync(new HttpImposter(123, null)).ConfigureAwait(false);
9192

92-
_mockClient.Verify(x => x.PostAsync(expectedResource, It.IsAny<HttpContent>()), Times.Once);
93+
_mockClient.Verify(x => x.PostAsync(expectedResource, It.IsAny<HttpContent>(), default), Times.Once);
9394
}
9495

9596
[TestMethod]
@@ -100,9 +101,9 @@ public async Task CreateImposter_SendsRequest_WithJsonBody()
100101
var response = GetResponse(HttpStatusCode.Created);
101102

102103
HttpContent content = null;
103-
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>()))
104+
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>(), default))
104105
.ReturnsAsync(response)
105-
.Callback<string, HttpContent>((res, cont) => content = cont);
106+
.Callback<string, HttpContent, CancellationToken>((res, cont, _) => content = cont);
106107

107108
await _proxy.CreateImposterAsync(new HttpImposter(123, null)).ConfigureAwait(false);
108109

@@ -132,7 +133,7 @@ public async Task CreateImposter_SendsRequest_ImposterWithNoPort()
132133
}
133134
");
134135

135-
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>()))
136+
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>(), default))
136137
.ReturnsAsync(response);
137138

138139
var imposter = new HttpImposter(null, null);
@@ -148,7 +149,7 @@ public async Task CreateImposter_StatusCodeNotCreated_ThrowsMountebankException(
148149
{
149150
var response = GetResponse(HttpStatusCode.BadRequest);
150151

151-
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>()))
152+
_mockClient.Setup(x => x.PostAsync(It.IsAny<string>(), It.IsAny<HttpContent>(), default))
152153
.ReturnsAsync(response);
153154

154155
await _proxy.CreateImposterAsync(new HttpImposter(123, null)).ConfigureAwait(false);

MbDotNet.sln

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio 15
4-
VisualStudioVersion = 15.0.27130.2026
3+
# Visual Studio Version 16
4+
VisualStudioVersion = 16.0.29424.173
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MbDotNet", "MbDotNet\MbDotNet.csproj", "{B5015C24-31E6-4CDB-8B18-48529D5D6C31}"
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MbDotNet.Tests", "MbDotNet.Tests\MbDotNet.Tests.csproj", "{4F59E12F-66D2-47E4-85F8-16E4AF36A907}"
99
EndProject
10+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FDA737DE-743C-4FA4-B09E-D2A003B50BD8}"
11+
ProjectSection(SolutionItems) = preProject
12+
.editorconfig = .editorconfig
13+
EndProjectSection
14+
EndProject
1015
Global
1116
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1217
Debug|Any CPU = Debug|Any CPU

MbDotNet/HttpClientWrapper.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45

56
namespace MbDotNet
@@ -16,19 +17,19 @@ public HttpClientWrapper(Uri baseAddress)
1617
};
1718
}
1819

19-
public async Task<HttpResponseMessage> DeleteAsync(string resource)
20+
public async Task<HttpResponseMessage> DeleteAsync(string resource, CancellationToken cancellationToken = default)
2021
{
21-
return await _client.DeleteAsync(resource).ConfigureAwait(false);
22+
return await _client.DeleteAsync(resource, cancellationToken).ConfigureAwait(false);
2223
}
2324

24-
public async Task<HttpResponseMessage> PostAsync(string resource, HttpContent content)
25+
public async Task<HttpResponseMessage> PostAsync(string resource, HttpContent content, CancellationToken cancellationToken = default)
2526
{
26-
return await _client.PostAsync(resource, content).ConfigureAwait(false);
27+
return await _client.PostAsync(resource, content, cancellationToken).ConfigureAwait(false);
2728
}
2829

29-
public async Task<HttpResponseMessage> GetAsync(string resource)
30+
public async Task<HttpResponseMessage> GetAsync(string resource, CancellationToken cancellationToken = default)
3031
{
31-
return await _client.GetAsync(resource).ConfigureAwait(false);
32+
return await _client.GetAsync(resource, cancellationToken).ConfigureAwait(false);
3233
}
3334

3435
public void Dispose()

MbDotNet/IClient.cs

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using System.Threading;
23
using System.Threading.Tasks;
34
using MbDotNet.Enums;
45
using MbDotNet.Models.Imposters;
@@ -80,7 +81,7 @@ public interface IClient
8081
/// <returns>The retrieved imposter</returns>
8182
/// <exception cref="MbDotNet.Exceptions.ImposterNotFoundException">Thrown if no imposter was found on the specified port.</exception>
8283
/// <exception cref="MbDotNet.Exceptions.InvalidProtocolException">Thrown if the retrieved imposter was not an HTTP imposter</exception>
83-
Task<RetrievedHttpImposter> GetHttpImposterAsync(int port);
84+
Task<RetrievedHttpImposter> GetHttpImposterAsync(int port, CancellationToken cancellationToken = default);
8485

8586
/// <summary>
8687
/// Retrieves a TcpImposter along with information about requests made to that
@@ -90,7 +91,7 @@ public interface IClient
9091
/// <returns>The retrieved imposter</returns>
9192
/// <exception cref="MbDotNet.Exceptions.ImposterNotFoundException">Thrown if no imposter was found on the specified port.</exception>
9293
/// <exception cref="MbDotNet.Exceptions.InvalidProtocolException">Thrown if the retrieved imposter was not an HTTP imposter</exception>
93-
Task<RetrievedTcpImposter> GetTcpImposterAsync(int port);
94+
Task<RetrievedTcpImposter> GetTcpImposterAsync(int port, CancellationToken cancellationToken = default);
9495

9596
/// <summary>
9697
/// Retrieves an HttpsImposter along with information about requests made to that
@@ -100,31 +101,31 @@ public interface IClient
100101
/// <returns>The retrieved imposter</returns>
101102
/// <exception cref="MbDotNet.Exceptions.ImposterNotFoundException">Thrown if no imposter was found on the specified port.</exception>
102103
/// <exception cref="MbDotNet.Exceptions.InvalidProtocolException">Thrown if the retrieved imposter was not an HTTP imposter</exception>
103-
Task<RetrievedHttpsImposter> GetHttpsImposterAsync(int port);
104+
Task<RetrievedHttpsImposter> GetHttpsImposterAsync(int port, CancellationToken cancellationToken = default);
104105

105106
/// <summary>
106107
/// Deletes a single imposter from mountebank. Will also remove the imposter from the collection
107108
/// of imposters that the client maintains.
108109
/// </summary>
109110
/// <param name="port">The port number of the imposter to be removed</param>
110-
Task DeleteImposterAsync(int port);
111+
Task DeleteImposterAsync(int port, CancellationToken cancellationToken = default);
111112

112113
/// <summary>
113114
/// Deletes all imposters from mountebank. Will also remove the imposters from the collection
114115
/// of imposters that the client maintains.
115116
/// </summary>
116-
Task DeleteAllImpostersAsync();
117+
Task DeleteAllImpostersAsync(CancellationToken cancellationToken = default);
117118

118119
/// <summary>
119120
/// Submits all pending imposters from the supplied collection to be created in mountebank.
120121
/// <exception cref="MbDotNet.Exceptions.MountebankException">Thrown if unable to create the imposter.</exception>
121122
/// </summary>
122-
Task SubmitAsync(ICollection<Imposter> imposters);
123+
Task SubmitAsync(ICollection<Imposter> imposters, CancellationToken cancellationToken = default);
123124

124125
/// <summary>
125126
/// Submits imposter to be created in mountebank.
126127
/// <exception cref="MbDotNet.Exceptions.MountebankException">Thrown if unable to create the imposter.</exception>
127128
/// </summary>
128-
Task SubmitAsync(Imposter imposter);
129+
Task SubmitAsync(Imposter imposter, CancellationToken cancellationToken = default);
129130
}
130131
}

MbDotNet/IHttpClientWrapper.cs

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
using System;
22
using System.Net.Http;
3+
using System.Threading;
34
using System.Threading.Tasks;
45

56
namespace MbDotNet
67
{
78
internal interface IHttpClientWrapper : IDisposable
89
{
9-
Task<HttpResponseMessage> DeleteAsync(string resource);
10-
Task<HttpResponseMessage> PostAsync(string resource, HttpContent content);
11-
Task<HttpResponseMessage> GetAsync(string resource);
10+
Task<HttpResponseMessage> DeleteAsync(string resource, CancellationToken cancellationToken = default);
11+
Task<HttpResponseMessage> PostAsync(string resource, HttpContent content, CancellationToken cancellationToken = default);
12+
Task<HttpResponseMessage> GetAsync(string resource, CancellationToken cancellationToken = default);
1213
}
1314
}

MbDotNet/IRequestProxy.cs

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
using MbDotNet.Models.Imposters;
2+
using System.Threading;
23
using System.Threading.Tasks;
34

45
namespace MbDotNet
56
{
67
internal interface IRequestProxy
78
{
8-
Task DeleteAllImpostersAsync();
9-
Task DeleteImposterAsync(int port);
10-
Task CreateImposterAsync(Imposter imposter);
11-
Task<RetrievedHttpImposter> GetHttpImposterAsync(int port);
12-
Task<RetrievedTcpImposter> GetTcpImposterAsync(int port);
13-
Task<RetrievedHttpsImposter> GetHttpsImposterAsync(int port);
9+
Task DeleteAllImpostersAsync(CancellationToken cancellationToken = default);
10+
Task DeleteImposterAsync(int port, CancellationToken cancellationToken = default);
11+
Task CreateImposterAsync(Imposter imposter, CancellationToken cancellationToken = default);
12+
Task<RetrievedHttpImposter> GetHttpImposterAsync(int port, CancellationToken cancellationToken = default);
13+
Task<RetrievedTcpImposter> GetTcpImposterAsync(int port, CancellationToken cancellationToken = default);
14+
Task<RetrievedHttpsImposter> GetHttpsImposterAsync(int port, CancellationToken cancellationToken = default);
1415
}
1516
}

0 commit comments

Comments
 (0)