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