@@ -1325,7 +1325,7 @@ mod tests {
13251325 use std:: time:: { Duration , Instant } ;
13261326
13271327 use iroh_base:: { EndpointAddr , EndpointId , SecretKey , TransportAddr } ;
1328- use n0_error:: { AnyError as Error , Result , StdResultExt } ;
1328+ use n0_error:: { AnyError as Error , Result , StackResultExt , StdResultExt , ensure_any } ;
13291329 use n0_future:: { BufferedStreamExt , StreamExt , stream, time} ;
13301330 use n0_watcher:: Watcher ;
13311331 use quinn:: ConnectionError ;
@@ -2478,4 +2478,107 @@ mod tests {
24782478 assert ! ( dt0 / dt1 < 20.0 , "First round: {dt0}s, second round {dt1}s" ) ;
24792479 Ok ( ( ) )
24802480 }
2481+
2482+ #[ tokio:: test]
2483+ #[ traced_test]
2484+ async fn test_one_server_two_clients_local_relay ( ) -> Result {
2485+ let ( relay_map, _relay_url, _relay_guard) = run_relay_server ( ) . await ?;
2486+ let relay_mode = RelayMode :: Custom ( relay_map) ;
2487+ test_two_clients_impl ( relay_mode) . await ?;
2488+ Ok ( ( ) )
2489+ }
2490+
2491+ #[ tokio:: test]
2492+ #[ traced_test]
2493+ async fn test_one_server_two_clients_public_relay ( ) -> Result {
2494+ let relay_mode = RelayMode :: Default ;
2495+ test_two_clients_impl ( relay_mode) . await ?;
2496+ Ok ( ( ) )
2497+ }
2498+
2499+ #[ tokio:: test]
2500+ #[ traced_test]
2501+ async fn test_one_server_two_clients_no_relay ( ) -> Result {
2502+ test_two_clients_impl ( RelayMode :: Disabled ) . await ?;
2503+ Ok ( ( ) )
2504+ }
2505+
2506+ async fn test_two_clients_impl ( relay_mode : RelayMode ) -> Result {
2507+ const ALPN : & [ u8 ] = b"test" ;
2508+ let use_relay = relay_mode != RelayMode :: Disabled ;
2509+ let server = Endpoint :: builder ( )
2510+ . relay_mode ( relay_mode. clone ( ) )
2511+ . alpns ( vec ! [ ALPN . to_vec( ) ] )
2512+ . insecure_skip_relay_cert_verify ( true )
2513+ . bind ( )
2514+ . instrument ( info_span ! ( "server" ) )
2515+ . await ?;
2516+ if use_relay {
2517+ server. online ( ) . await ;
2518+ }
2519+ info ! ( id = %server. id( ) . fmt_short( ) , "server online" ) ;
2520+ let server_addr = server. addr ( ) ;
2521+
2522+ // We abort this example after two connections have finished.
2523+ let count = 2 ;
2524+
2525+ // Our server accepts connections, opens an uni stream, writes some data,
2526+ // and waits for the connection to be closed.
2527+ let server_task = tokio:: spawn (
2528+ async move {
2529+ for _i in 0 ..count {
2530+ info ! ( "wait for connection" ) ;
2531+ let conn = server
2532+ . accept ( )
2533+ . await
2534+ . context ( "server endpoint closed" ) ?
2535+ . await ?;
2536+ info ! ( "accepted" ) ;
2537+ let mut s = conn. open_uni ( ) . await . anyerr ( ) ?;
2538+ s. write_all ( b"hi" ) . await . anyerr ( ) ?;
2539+ s. finish ( ) . anyerr ( ) ?;
2540+ info ! ( "written" ) ;
2541+ conn. closed ( ) . await ;
2542+ info ! ( "closed" ) ;
2543+ }
2544+ server. close ( ) . await ;
2545+ n0_error:: Ok ( ( ) )
2546+ }
2547+ . instrument ( info_span ! ( "server" ) ) ,
2548+ ) ;
2549+
2550+ // Our client tasks creates a new endpoint and connects to the server two times.
2551+ let client_task = tokio:: spawn (
2552+ async move {
2553+ for _i in 0 ..count {
2554+ let client = Endpoint :: builder ( )
2555+ . relay_mode ( relay_mode. clone ( ) )
2556+ . insecure_skip_relay_cert_verify ( true )
2557+ . bind ( )
2558+ . instrument ( info_span ! ( "client" ) )
2559+ . await ?;
2560+ if use_relay {
2561+ client. online ( ) . await ;
2562+ }
2563+ info ! ( id = %client. id( ) . fmt_short( ) , "endpoint online" ) ;
2564+ let conn = client. connect ( server_addr. clone ( ) , ALPN ) . await ?;
2565+ info ! ( "connected" ) ;
2566+ let mut s = conn. accept_uni ( ) . await . anyerr ( ) ?;
2567+ let data = s. read_to_end ( 2 ) . await . anyerr ( ) ?;
2568+ info ! ( "read" ) ;
2569+ ensure_any ! ( data == b"hi" , "unexpected data" ) ;
2570+ conn. close ( 23u32 . into ( ) , b"bye" ) ;
2571+ info ! ( "conn closed" ) ;
2572+ client. close ( ) . await ;
2573+ info ! ( "endpoint closed" ) ;
2574+ }
2575+ n0_error:: Ok ( ( ) )
2576+ }
2577+ . instrument ( info_span ! ( "client" ) ) ,
2578+ ) ;
2579+
2580+ client_task. await . std_context ( "client" ) ?. context ( "client" ) ?;
2581+ server_task. await . std_context ( "server" ) ?. context ( "server" ) ?;
2582+ Ok ( ( ) )
2583+ }
24812584}
0 commit comments