@@ -267,5 +267,43 @@ public async Task ConnectAndCloseAsync_UseProxyServer_ExpectedClosedState(Uri se
267
267
Assert . Equal ( expectedCloseStatusDescription , cws . CloseStatusDescription ) ;
268
268
}
269
269
}
270
+
271
+ [ ConditionalFact ( nameof ( WebSocketsSupported ) ) ]
272
+ public async Task ConnectAsync_CancellationRequestedBeforeConnect_ThrowsOperationCanceledException ( )
273
+ {
274
+ using ( var clientSocket = new ClientWebSocket ( ) )
275
+ {
276
+ var cts = new CancellationTokenSource ( ) ;
277
+ cts . Cancel ( ) ;
278
+ Task t = clientSocket . ConnectAsync ( new Uri ( "ws://" + Guid . NewGuid ( ) . ToString ( "N" ) ) , cts . Token ) ;
279
+ await Assert . ThrowsAnyAsync < OperationCanceledException > ( ( ) => t ) ;
280
+ }
281
+ }
282
+
283
+ [ ConditionalFact ( nameof ( WebSocketsSupported ) ) ]
284
+ public async Task ConnectAsync_CancellationRequestedAfterConnect_ThrowsOperationCanceledException ( )
285
+ {
286
+ var releaseServer = new TaskCompletionSource < bool > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
287
+ await LoopbackServer . CreateClientAndServerAsync ( async uri =>
288
+ {
289
+ var clientSocket = new ClientWebSocket ( ) ;
290
+ try
291
+ {
292
+ var cts = new CancellationTokenSource ( ) ;
293
+ Task t = clientSocket . ConnectAsync ( uri , cts . Token ) ;
294
+ Assert . False ( t . IsCompleted ) ;
295
+ cts . Cancel ( ) ;
296
+ await Assert . ThrowsAnyAsync < OperationCanceledException > ( ( ) => t ) ;
297
+ }
298
+ finally
299
+ {
300
+ releaseServer . SetResult ( true ) ;
301
+ clientSocket . Dispose ( ) ;
302
+ }
303
+ } , server => server . AcceptConnectionAsync ( async connection =>
304
+ {
305
+ await releaseServer . Task ;
306
+ } ) , new LoopbackServer . Options { WebSocketEndpoint = true } ) ;
307
+ }
270
308
}
271
309
}
0 commit comments