@@ -69,7 +69,7 @@ fn dc_handshake_self_test() -> Result<()> {
69
69
. with_tls ( certificates:: CERT_PEM ) ?
70
70
. with_dc ( MockDcEndpoint :: new ( & CLIENT_TOKENS ) ) ?;
71
71
72
- self_test ( server, client, None , None ) ?;
72
+ self_test ( server, client, true , None , None ) ?;
73
73
74
74
Ok ( ( ) )
75
75
}
@@ -114,7 +114,7 @@ fn dc_mtls_handshake_self_test() -> Result<()> {
114
114
. with_tls ( client_tls) ?
115
115
. with_dc ( MockDcEndpoint :: new ( & SERVER_TOKENS ) ) ?;
116
116
117
- self_test ( server, client, None , None ) ?;
117
+ self_test ( server, client, true , None , None ) ?;
118
118
119
119
Ok ( ( ) )
120
120
}
@@ -143,7 +143,7 @@ fn dc_mtls_handshake_auth_failure_self_test() -> Result<()> {
143
143
}
144
144
. into ( ) ;
145
145
146
- self_test ( server, client, Some ( expected_client_error) , None ) ?;
146
+ self_test ( server, client, true , Some ( expected_client_error) , None ) ?;
147
147
148
148
Ok ( ( ) )
149
149
}
@@ -181,6 +181,7 @@ fn dc_mtls_handshake_server_not_supported_self_test() -> Result<()> {
181
181
self_test (
182
182
server,
183
183
client,
184
+ true ,
184
185
Some ( connection:: Error :: invalid_configuration (
185
186
"peer does not support specified dc versions" ,
186
187
) ) ,
@@ -228,6 +229,7 @@ fn dc_mtls_handshake_client_not_supported_self_test() -> Result<()> {
228
229
self_test (
229
230
server,
230
231
client,
232
+ false ,
231
233
Some ( expected_client_error) ,
232
234
Some ( connection:: Error :: invalid_configuration (
233
235
"peer does not support specified dc versions" ,
@@ -266,7 +268,7 @@ fn dc_possible_secret_control_packet(
266
268
. with_dc ( dc_endpoint) ?
267
269
. with_packet_interceptor ( RandomShort :: default ( ) ) ?;
268
270
269
- let ( client_events, _server_events) = self_test ( server, client, None , None ) ?;
271
+ let ( client_events, _server_events) = self_test ( server, client, true , None , None ) ?;
270
272
271
273
assert_eq ! (
272
274
1 ,
@@ -297,6 +299,7 @@ fn dc_possible_secret_control_packet(
297
299
fn self_test < S : ServerProviders , C : ClientProviders > (
298
300
server : server:: Builder < S > ,
299
301
client : client:: Builder < C > ,
302
+ client_has_dc : bool ,
300
303
expected_client_error : Option < connection:: Error > ,
301
304
expected_server_error : Option < connection:: Error > ,
302
305
) -> Result < ( DcRecorder , DcRecorder ) > {
@@ -318,18 +321,21 @@ fn self_test<S: ServerProviders, C: ClientProviders>(
318
321
319
322
let addr = server. local_addr ( ) ?;
320
323
324
+ let expected_count = 1 + client_has_dc as usize ;
321
325
spawn ( async move {
322
- if let Some ( mut conn) = server. accept ( ) . await {
323
- let result = dc:: ConfirmComplete :: wait_ready ( & mut conn) . await ;
324
-
325
- if let Some ( error) = expected_server_error {
326
- assert_eq ! ( error, convert_io_result( result) . unwrap( ) ) ;
327
-
328
- if expected_client_error. is_some ( ) {
329
- conn. close ( SERVER_CLOSE_ERROR_CODE . into ( ) ) ;
326
+ for _ in 0 ..expected_count {
327
+ if let Some ( mut conn) = server. accept ( ) . await {
328
+ let result = dc:: ConfirmComplete :: wait_ready ( & mut conn) . await ;
329
+
330
+ if let Some ( error) = expected_server_error {
331
+ assert_eq ! ( error, convert_io_result( result) . unwrap( ) ) ;
332
+
333
+ if expected_client_error. is_some ( ) {
334
+ conn. close ( SERVER_CLOSE_ERROR_CODE . into ( ) ) ;
335
+ }
336
+ } else {
337
+ assert ! ( result. is_ok( ) ) ;
330
338
}
331
- } else {
332
- assert ! ( result. is_ok( ) ) ;
333
339
}
334
340
}
335
341
} ) ;
@@ -340,35 +346,41 @@ fn self_test<S: ServerProviders, C: ClientProviders>(
340
346
. with_random ( Random :: with_seed ( 456 ) ) ?
341
347
. start ( ) ?;
342
348
343
- let client_events = client_events. clone ( ) ;
344
-
345
- primary:: spawn ( async move {
346
- let connect = Connect :: new ( addr) . with_server_name ( "localhost" ) ;
347
- let mut conn = client. connect ( connect) . await . unwrap ( ) ;
348
- let result = dc:: ConfirmComplete :: wait_ready ( & mut conn) . await ;
349
-
350
- if let Some ( error) = expected_client_error {
351
- assert_eq ! ( error, convert_io_result( result) . unwrap( ) ) ;
352
-
353
- if expected_server_error. is_some ( ) {
354
- conn. close ( CLIENT_CLOSE_ERROR_CODE . into ( ) ) ;
355
- // wait for the server to assert the expected error before dropping
356
- delay ( Duration :: from_millis ( 100 ) ) . await ;
349
+ for _ in 0 ..expected_count {
350
+ primary:: spawn ( {
351
+ let client = client. clone ( ) ;
352
+ let client_events = client_events. clone ( ) ;
353
+ async move {
354
+ let connect = Connect :: new ( addr)
355
+ . with_server_name ( "localhost" )
356
+ . with_deduplicate ( client_has_dc) ;
357
+ let mut conn = client. connect ( connect) . await . unwrap ( ) ;
358
+ let result = dc:: ConfirmComplete :: wait_ready ( & mut conn) . await ;
359
+
360
+ if let Some ( error) = expected_client_error {
361
+ assert_eq ! ( error, convert_io_result( result) . unwrap( ) ) ;
362
+
363
+ if expected_server_error. is_some ( ) {
364
+ conn. close ( CLIENT_CLOSE_ERROR_CODE . into ( ) ) ;
365
+ // wait for the server to assert the expected error before dropping
366
+ delay ( Duration :: from_millis ( 100 ) ) . await ;
367
+ }
368
+ } else {
369
+ assert ! ( result. is_ok( ) ) ;
370
+ let client_events = client_events
371
+ . dc_state_changed_events ( )
372
+ . lock ( )
373
+ . unwrap ( )
374
+ . clone ( ) ;
375
+ assert_dc_complete ( & client_events) ;
376
+ // wait briefly so the ack for the `DC_STATELESS_RESET_TOKENS` frame from the server is sent
377
+ // before the client closes the connection. This is only necessary to confirm the `dc::State`
378
+ // on the server moves to `DcState::Complete`
379
+ delay ( Duration :: from_millis ( 100 ) ) . await ;
380
+ }
357
381
}
358
- } else {
359
- assert ! ( result. is_ok( ) ) ;
360
- let client_events = client_events
361
- . dc_state_changed_events ( )
362
- . lock ( )
363
- . unwrap ( )
364
- . clone ( ) ;
365
- assert_dc_complete ( & client_events) ;
366
- // wait briefly so the ack for the `DC_STATELESS_RESET_TOKENS` frame from the server is sent
367
- // before the client closes the connection. This is only necessary to confirm the `dc::State`
368
- // on the server moves to `DcState::Complete`
369
- delay ( Duration :: from_millis ( 100 ) ) . await ;
370
- }
371
- } ) ;
382
+ } ) ;
383
+ }
372
384
373
385
Ok ( addr)
374
386
} )
0 commit comments