@@ -320,6 +320,8 @@ mod tests {
320320 use slog:: Drain ;
321321 use std:: net:: SocketAddrV6 ;
322322 use std:: str:: FromStr ;
323+ use std:: sync:: atomic:: AtomicUsize ;
324+ use std:: sync:: Arc ;
323325 use std:: time:: Duration ;
324326 use tokio:: io:: { AsyncReadExt , AsyncWriteExt } ;
325327 use tokio:: time:: sleep;
@@ -400,7 +402,7 @@ mod tests {
400402
401403 tokio:: spawn ( async move {
402404 let server_config = local_config ( 1 ) ;
403- let mut server = Server :: new ( server_config, addr, log2. clone ( ) )
405+ let server = Server :: new ( server_config, addr, log2. clone ( ) )
404406 . await
405407 . unwrap ( ) ;
406408
@@ -460,7 +462,7 @@ mod tests {
460462 ] ;
461463
462464 tokio:: spawn ( async move {
463- let mut server = Server :: new ( server_config, addr, log2. clone ( ) )
465+ let server = Server :: new ( server_config, addr, log2. clone ( ) )
464466 . await
465467 . unwrap ( ) ;
466468
@@ -522,7 +524,7 @@ mod tests {
522524 ] ;
523525
524526 let handle = tokio:: spawn ( async move {
525- let mut server = Server :: new ( server_config, addr, log2. clone ( ) )
527+ let server = Server :: new ( server_config, addr, log2. clone ( ) )
526528 . await
527529 . unwrap ( ) ;
528530
@@ -578,57 +580,83 @@ mod tests {
578580
579581 let server_config = local_config ( 1 ) ;
580582
583+ let max_connections = 3 ;
584+ let done_count = Arc :: new ( AtomicUsize :: new ( 0 ) ) ;
585+
581586 // Message to send over TLS
582587 const MSG : & str = "Hello Joe" ;
583588
584- let ( done_tx, done_rx) = tokio:: sync:: oneshot:: channel ( ) ;
585589 let log2 = log. clone ( ) ;
586590 let corpus = vec ! [
587591 pki_keydir. join( "corim-rot.cbor" ) ,
588592 pki_keydir. join( "corim-sp.cbor" ) ,
589593 ] ;
590594
595+ // Accept connections from 3 clients in different tasks
596+ //
597+ // For this test, the clients all share a set of keys, because
598+ // we only generate 2 sets of keys from the KDL.
599+ let dc2 = done_count. clone ( ) ;
591600 tokio:: spawn ( async move {
592- let mut server = Server :: new ( server_config, addr, log2. clone ( ) )
601+ let server = Server :: new ( server_config, addr, log2. clone ( ) )
593602 . await
594603 . unwrap ( ) ;
595604
596- let ( mut stream, _) =
597- server. accept ( corpus. clone ( ) ) . await . await . unwrap ( ) ;
598- let mut buf = String :: new ( ) ;
599- stream. read_to_string ( & mut buf) . await . unwrap ( ) ;
600-
601- assert_eq ! ( buf. as_str( ) , MSG ) ;
602-
603- // Inform the main task that the test is complete.
604- let _ = done_tx. send ( ( ) ) ;
605+ for _ in 0 ..max_connections {
606+ let accept_fut = server. accept ( corpus. clone ( ) ) . await ;
607+ let done_count = dc2. clone ( ) ;
608+ tokio:: spawn ( async move {
609+ let ( mut stream, _) = accept_fut. await . unwrap ( ) ;
610+ let mut buf = String :: new ( ) ;
611+ stream. read_to_string ( & mut buf) . await . unwrap ( ) ;
612+
613+ assert_eq ! ( buf. as_str( ) , MSG ) ;
614+ done_count
615+ . fetch_add ( 1 , std:: sync:: atomic:: Ordering :: Relaxed ) ;
616+ } ) ;
617+ }
605618 } ) ;
606619
607620 // Loop until we succesfully connect
608- let mut stream = loop {
609- let client_config = local_config ( 2 ) ;
610-
611- let corpus = vec ! [
612- pki_keydir. join( "corim-rot.cbor" ) ,
613- pki_keydir. join( "corim-sp.cbor" ) ,
614- ] ;
615-
616- if let Ok ( stream) =
617- Client :: connect ( client_config, addr, corpus, log. clone ( ) ) . await
618- {
619- break stream;
620- }
621- sleep ( Duration :: from_millis ( 1 ) ) . await ;
622- } ;
623-
624- stream. write_all ( MSG . as_bytes ( ) ) . await . unwrap ( ) ;
625-
626- // Trigger an EOF so that `read_to_string` in the acceptor task
627- // completes.
628- stream. shutdown ( ) . await . unwrap ( ) ;
621+ for _ in 0 ..max_connections {
622+ let pki_keydir = pki_keydir. clone ( ) ;
623+ let log = log. clone ( ) ;
624+ tokio:: spawn ( async move {
625+ let mut stream = loop {
626+ let client_config = local_config ( 2 ) ;
627+
628+ let corpus = vec ! [
629+ pki_keydir. join( "corim-rot.cbor" ) ,
630+ pki_keydir. join( "corim-sp.cbor" ) ,
631+ ] ;
632+
633+ if let Ok ( stream) = Client :: connect (
634+ client_config,
635+ addr,
636+ corpus,
637+ log. clone ( ) ,
638+ )
639+ . await
640+ {
641+ break stream;
642+ }
643+ sleep ( Duration :: from_millis ( 1 ) ) . await ;
644+ } ;
645+
646+ stream. write_all ( MSG . as_bytes ( ) ) . await . unwrap ( ) ;
647+
648+ // Trigger an EOF so that `read_to_string` in the acceptor task
649+ // completes.
650+ stream. shutdown ( ) . await . unwrap ( ) ;
651+ } ) ;
652+ }
629653
630654 // Wait for the other side of the connection to receive and assert the
631655 // message
632- let _ = done_rx. await ;
656+ while done_count. load ( std:: sync:: atomic:: Ordering :: Relaxed )
657+ != max_connections
658+ {
659+ sleep ( Duration :: from_millis ( 1 ) ) . await ;
660+ }
633661 }
634662}
0 commit comments