Skip to content

Commit 207ed92

Browse files
committed
use CancelAfter if possible
1 parent 5e7249d commit 207ed92

15 files changed

+176
-184
lines changed

tests/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Transport/EchonetLiteHandler.Receiving.cs

Lines changed: 34 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ namespace Smdn.Net.EchonetLite.Transport;
1616
#pragma warning disable IDE0040
1717
partial class EchonetLiteHandlerTests {
1818
#pragma warning restore IDE0040
19+
private const int TimeoutInMillisecondsForReceiveOperationExpectedToSucceed = 5_000;
20+
1921
private class PseudoIncomingEchonetLiteHandler : EchonetLiteHandler {
2022
private readonly ConcurrentQueue<Func<IBufferWriter<byte>, CancellationToken, ValueTask<IPAddress>>> incomingActionQueue = new();
2123

@@ -83,7 +85,8 @@ CancellationToken cancellationToken
8385
}
8486

8587
[Test]
86-
public async Task ReceiveCallback()
88+
[CancelAfter(TimeoutInMillisecondsForReceiveOperationExpectedToSucceed)]
89+
public async Task ReceiveCallback(CancellationToken cancellationToken)
8790
{
8891
var expectedFromAddress = IPAddress.Loopback;
8992
var expectedData = new byte[] { 0x01, 0x23 };
@@ -96,7 +99,7 @@ public async Task ReceiveCallback()
9699
var numberOfCallsToReceiveCallback = 0;
97100
Exception? exceptionOccurredInReceiveCallback = null;
98101

99-
handler.ReceiveCallback = async (address, data, cancellationToken) => {
102+
handler.ReceiveCallback = async (address, data, ct) => {
100103
numberOfCallsToReceiveCallback++;
101104

102105
try {
@@ -114,24 +117,23 @@ public async Task ReceiveCallback()
114117

115118
Assert.That(handler.ReceiveCallback, Is.Not.Null);
116119

117-
handler.QueueIncomingAction((writer, cancellationToken) => {
120+
handler.QueueIncomingAction((writer, ct) => {
118121
writer.Write(expectedData);
119122

120123
return new(expectedFromAddress);
121124
});
122125

123-
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
124-
125-
await handler.WaitUntilConsumedAsync(cts.Token);
126+
await handler.WaitUntilConsumedAsync(cancellationToken);
126127

127-
callsToReceiveCallbackEvent.Wait(cts.Token);
128+
callsToReceiveCallbackEvent.Wait(cancellationToken);
128129

129130
Assert.That(numberOfCallsToReceiveCallback, Is.EqualTo(1));
130131
Assert.That(exceptionOccurredInReceiveCallback, Is.Null);
131132
}
132133

133134
[Test]
134-
public async Task ReceiveCallback_Null()
135+
[CancelAfter(TimeoutInMillisecondsForReceiveOperationExpectedToSucceed)]
136+
public async Task ReceiveCallback_Null(CancellationToken cancellationToken)
135137
{
136138
var expectedFromAddress = IPAddress.Loopback;
137139
var expectedData = new byte[] { 0x01, 0x23 };
@@ -144,19 +146,18 @@ public async Task ReceiveCallback_Null()
144146

145147
Assert.That(handler.ReceiveCallback, Is.Null);
146148

147-
handler.QueueIncomingAction((writer, cancellationToken) => {
149+
handler.QueueIncomingAction((writer, ct) => {
148150
writer.Write(expectedData);
149151

150152
return new(expectedFromAddress);
151153
});
152154

153-
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
154-
155-
await handler.WaitUntilConsumedAsync(cts.Token);
155+
await handler.WaitUntilConsumedAsync(cancellationToken);
156156
}
157157

158158
[Test]
159-
public async Task ReceiveEchonetLiteAsync_ReceiveFromNullAddress()
159+
[CancelAfter(TimeoutInMillisecondsForReceiveOperationExpectedToSucceed)]
160+
public async Task ReceiveEchonetLiteAsync_ReceiveFromNullAddress(CancellationToken cancellationToken)
160161
{
161162
IPAddress nullFromAddress = null!;
162163
var expectedData = new byte[] { 0x01, 0x23 };
@@ -170,7 +171,7 @@ public async Task ReceiveEchonetLiteAsync_ReceiveFromNullAddress()
170171
var numberOfCallsToReceiveTaskExceptionHandler = 0;
171172
Exception? exceptionOccurredInReceiveEchonetLiteAsync = null;
172173

173-
handler.ReceiveCallback = (address, data, cancellationToken) => {
174+
handler.ReceiveCallback = (address, data, ct) => {
174175
numberOfCallsToReceiveCallback++;
175176

176177
return default;
@@ -186,26 +187,25 @@ public async Task ReceiveEchonetLiteAsync_ReceiveFromNullAddress()
186187
};
187188

188189
handler.QueueIncomingAction(
189-
(writer, cancellationToken) => {
190+
(writer, ct) => {
190191
writer.Write(expectedData);
191192

192193
return new(nullFromAddress); // return null as a remote address
193194
}
194195
);
195196

196-
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
197+
await handler.WaitUntilConsumedAsync(cancellationToken);
197198

198-
await handler.WaitUntilConsumedAsync(cts.Token);
199-
200-
callsToReceiveTaskExceptionHandlerEvent.Wait(cts.Token);
199+
callsToReceiveTaskExceptionHandlerEvent.Wait(cancellationToken);
201200

202201
Assert.That(numberOfCallsToReceiveCallback, Is.Zero);
203202
Assert.That(numberOfCallsToReceiveTaskExceptionHandler, Is.EqualTo(1));
204203
Assert.That(exceptionOccurredInReceiveEchonetLiteAsync, Is.InstanceOf<InvalidOperationException>());
205204
}
206205

207206
[Test]
208-
public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore()
207+
[CancelAfter(TimeoutInMillisecondsForReceiveOperationExpectedToSucceed)]
208+
public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore(CancellationToken cancellationToken)
209209
{
210210
using var callsToReceiveTaskExceptionHandlerEvent = new ManualResetEventSlim(false);
211211
using var handler = new PseudoIncomingEchonetLiteHandler();
@@ -215,7 +215,7 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore()
215215
var numberOfCallsToReceiveCallback = 0;
216216
var numberOfCallsToReceiveTaskExceptionHandler = 0;
217217

218-
handler.ReceiveCallback = (address, data, cancellationToken) => {
218+
handler.ReceiveCallback = (address, data, ct) => {
219219
numberOfCallsToReceiveCallback++;
220220

221221
return default;
@@ -234,11 +234,9 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore()
234234
(writer, cancellationToken) => throw new NotImplementedException()
235235
);
236236

237-
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
238-
239-
await handler.WaitUntilConsumedAsync(cts.Token);
237+
await handler.WaitUntilConsumedAsync(cancellationToken);
240238

241-
callsToReceiveTaskExceptionHandlerEvent.Wait(cts.Token);
239+
callsToReceiveTaskExceptionHandlerEvent.Wait(cancellationToken);
242240

243241
Assert.That(numberOfCallsToReceiveCallback, Is.Zero);
244242
Assert.That(numberOfCallsToReceiveTaskExceptionHandler, Is.EqualTo(1));
@@ -247,7 +245,7 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore()
247245
// following inputs must be processed successfully
248246
using var callsToReceiveCallbackEvent = new ManualResetEventSlim(false);
249247

250-
handler.ReceiveCallback = (address, data, cancellationToken) => {
248+
handler.ReceiveCallback = (address, data, ct) => {
251249
numberOfCallsToReceiveCallback++;
252250

253251
callsToReceiveCallbackEvent.Set();
@@ -263,15 +261,16 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveAsyncCore()
263261
}
264262
);
265263

266-
await handler.WaitUntilConsumedAsync(cts.Token);
264+
await handler.WaitUntilConsumedAsync(cancellationToken);
267265

268-
callsToReceiveCallbackEvent.Wait(cts.Token);
266+
callsToReceiveCallbackEvent.Wait(cancellationToken);
269267

270268
Assert.That(numberOfCallsToReceiveCallback, Is.EqualTo(1));
271269
}
272270

273271
[Test]
274-
public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback()
272+
[CancelAfter(TimeoutInMillisecondsForReceiveOperationExpectedToSucceed)]
273+
public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback(CancellationToken cancellationToken)
275274
{
276275
var expectedFromAddress = IPAddress.Loopback;
277276
var expectedData = new byte[] { 0x01, 0x23 };
@@ -285,7 +284,7 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback()
285284
var numberOfCallsToReceiveCallback = 0;
286285
var numberOfCallsToReceiveTaskExceptionHandler = 0;
287286

288-
handler.ReceiveCallback = (address, data, cancellationToken) => {
287+
handler.ReceiveCallback = (address, data, ct) => {
289288
numberOfCallsToReceiveCallback++;
290289

291290
throw new NotImplementedException();
@@ -307,11 +306,9 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback()
307306
}
308307
);
309308

310-
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
311-
312-
await handler.WaitUntilConsumedAsync(cts.Token);
309+
await handler.WaitUntilConsumedAsync(cancellationToken);
313310

314-
callsToReceiveTaskExceptionHandlerEvent.Wait(cts.Token);
311+
callsToReceiveTaskExceptionHandlerEvent.Wait(cancellationToken);
315312

316313
Assert.That(numberOfCallsToReceiveCallback, Is.EqualTo(1));
317314
Assert.That(numberOfCallsToReceiveTaskExceptionHandler, Is.EqualTo(1));
@@ -320,7 +317,7 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback()
320317
// following inputs must be processed successfully
321318
using var callsToReceiveCallbackEvent = new ManualResetEventSlim(false);
322319

323-
handler.ReceiveCallback = (address, data, cancellationToken) => {
320+
handler.ReceiveCallback = (address, data, ct) => {
324321
numberOfCallsToReceiveCallback++;
325322

326323
callsToReceiveCallbackEvent.Set();
@@ -336,9 +333,9 @@ public async Task ReceiveEchonetLiteAsync_ExceptionOccurredInReceiveCallback()
336333
}
337334
);
338335

339-
await handler.WaitUntilConsumedAsync(cts.Token);
336+
await handler.WaitUntilConsumedAsync(cancellationToken);
340337

341-
callsToReceiveCallbackEvent.Wait(cts.Token);
338+
callsToReceiveCallbackEvent.Wait(cancellationToken);
342339

343340
Assert.That(numberOfCallsToReceiveCallback, Is.EqualTo(2));
344341
}

tests/Smdn.Net.EchonetLite.Primitives/Smdn.Net.EchonetLite.Transport/EchonetLiteHandler.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,15 +186,16 @@ public void SendAsync_CancellationRequested()
186186

187187
handler.StartReceiving();
188188

189-
using var cts = new CancellationTokenSource();
190-
191-
cts.Cancel();
189+
var cancellationToken = new CancellationToken(canceled: true);
192190

193191
Assert.That(
194-
async () => await handler.SendAsync(data: default, cancellationToken: cts.Token),
192+
async () => await handler.SendAsync(
193+
data: default,
194+
cancellationToken: cancellationToken
195+
),
195196
Throws
196197
.InstanceOf<OperationCanceledException>()
197-
.With.Property(nameof(OperationCanceledException.CancellationToken)).EqualTo(cts.Token)
198+
.With.Property(nameof(OperationCanceledException.CancellationToken)).EqualTo(cancellationToken)
198199
);
199200
}
200201

@@ -242,15 +243,17 @@ public void SendToAsync_CancellationRequested()
242243

243244
handler.StartReceiving();
244245

245-
using var cts = new CancellationTokenSource();
246-
247-
cts.Cancel();
246+
var cancellationToken = new CancellationToken(canceled: true);
248247

249248
Assert.That(
250-
async () => await handler.SendToAsync(remoteAddress: IPAddress.Loopback, data: default, cancellationToken: cts.Token),
249+
async () => await handler.SendToAsync(
250+
remoteAddress: IPAddress.Loopback,
251+
data: default,
252+
cancellationToken: cancellationToken
253+
),
251254
Throws
252255
.InstanceOf<OperationCanceledException>()
253-
.With.Property(nameof(OperationCanceledException.CancellationToken)).EqualTo(cts.Token)
256+
.With.Property(nameof(OperationCanceledException.CancellationToken)).EqualTo(cancellationToken)
254257
);
255258
}
256259
}

tests/Smdn.Net.EchonetLite.RouteB.Primitives/Smdn.Net.EchonetLite.RouteB.Transport/RouteBEchonetLiteHandler.cs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,20 +122,23 @@ public void ConnectAsync_CancellationRequested()
122122
{
123123
using var handler = new PseudoRouteBEchonetLiteHandler();
124124
using var credential = new PseudoRouteBCredential();
125-
using var cts = new CancellationTokenSource();
126-
127-
cts.Cancel();
128125

129126
Assert.That(handler.IsReceiving, Is.False, $"{nameof(handler.IsReceiving)} before attempting connection");
130127

131128
Assert.That(
132-
async () => await handler.ConnectAsync(credential: credential, cancellationToken: cts.Token),
129+
async () => await handler.ConnectAsync(
130+
credential: credential,
131+
cancellationToken: new(canceled: true)
132+
),
133133
Throws.InstanceOf<OperationCanceledException>()
134134
);
135135

136136
#pragma warning disable CA2012
137137
Assert.That(
138-
handler.ConnectAsync(credential: credential, cancellationToken: cts.Token).IsCanceled,
138+
handler.ConnectAsync(
139+
credential: credential,
140+
cancellationToken: new(canceled: true)
141+
).IsCanceled,
139142
Is.True
140143
);
141144
#pragma warning restore CA2012
@@ -195,20 +198,18 @@ public async Task DisconnectAsync_CancellationRequested()
195198

196199
await handler.ConnectAsync(credential: credential);
197200

198-
using var cts = new CancellationTokenSource();
199-
200-
cts.Cancel();
201-
202201
Assert.That(handler.IsReceiving, Is.True, $"{nameof(handler.IsReceiving)} before attempting disconnection");
203202

204203
Assert.That(
205-
async () => await handler.DisconnectAsync(cancellationToken: cts.Token),
204+
async () => await handler.DisconnectAsync(cancellationToken: new(canceled: true)),
206205
Throws.InstanceOf<OperationCanceledException>()
207206
);
208207

209208
#pragma warning disable CA2012
210209
Assert.That(
211-
handler.DisconnectAsync(cancellationToken: cts.Token).IsCanceled,
210+
handler.DisconnectAsync(
211+
cancellationToken: new(canceled: true)
212+
).IsCanceled,
212213
Is.True
213214
);
214215
#pragma warning restore CA2012

tests/Smdn.Net.EchonetLite/Smdn.Net.EchonetLite/EchonetClient.Events.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-FileCopyrightText: 2024 smdn <smdn@smdn.jp>
22
// SPDX-License-Identifier: MIT
33
using System.Net;
4+
using System.Threading;
45

56
using NUnit.Framework;
67

@@ -16,7 +17,8 @@ public partial class EchonetClientEventsTests {
1617
[TestCase(ESV.SetGetServiceNotAvailable)]
1718
[TestCase(ESV.Inf)]
1819
[TestCase(ESV.InfC)]
19-
public void InstanceListUpdating_InstanceListUpdated(ESV esv)
20+
[CancelAfter(EchonetClientTests.TimeoutInMillisecondsForOperationExpectedToSucceed)]
21+
public void InstanceListUpdating_InstanceListUpdated(ESV esv, CancellationToken cancellationToken)
2022
{
2123
var receiveFromAddress = IPAddress.Loopback;
2224
var handler = new ReceiveInstanceListEchonetLiteHandler(
@@ -47,13 +49,11 @@ public void InstanceListUpdating_InstanceListUpdated(ESV esv)
4749
Assert.That(e.Node.Address, Is.EqualTo(receiveFromAddress));
4850
};
4951

50-
using var cts = EchonetClientTests.CreateTimeoutCancellationTokenSourceForOperationExpectedToSucceed();
51-
5252
Assert.That(
5353
async () => await handler.PerformReceivingAsync(
5454
receiveFromAddress: receiveFromAddress,
5555
esv: esv,
56-
cancellationToken: cts.Token
56+
cancellationToken: cancellationToken
5757
),
5858
Throws.Nothing
5959
);

0 commit comments

Comments
 (0)