@@ -1294,13 +1294,13 @@ mod tests {
12941294 use std:: time:: { Duration , Instant } ;
12951295
12961296 use iroh_base:: { EndpointAddr , EndpointId , SecretKey , TransportAddr } ;
1297- use n0_error:: { AnyError as Error , Result , StdResultExt } ;
1297+ use n0_error:: { AnyError as Error , Result , StackResultExt , StdResultExt , ensure_any } ;
12981298 use n0_future:: { BufferedStreamExt , StreamExt , stream, time} ;
12991299 use n0_watcher:: Watcher ;
13001300 use quinn:: ConnectionError ;
13011301 use rand:: SeedableRng ;
13021302 use tokio:: sync:: oneshot;
1303- use tracing:: { Instrument , error_span, info, info_span, instrument} ;
1303+ use tracing:: { Instrument , debug , error_span, info, info_span, instrument} ;
13041304 use tracing_test:: traced_test;
13051305
13061306 use super :: Endpoint ;
@@ -2447,4 +2447,108 @@ mod tests {
24472447 assert ! ( dt0 / dt1 < 20.0 , "First round: {dt0}s, second round {dt1}s" ) ;
24482448 Ok ( ( ) )
24492449 }
2450+
2451+ #[ tokio:: test]
2452+ #[ traced_test]
2453+ async fn test_one_server_two_clients_local_relay ( ) -> Result {
2454+ let ( relay_map, _relay_url, _relay_guard) = run_relay_server ( ) . await ?;
2455+ let relay_mode = RelayMode :: Custom ( relay_map) ;
2456+ test_two_clients_impl ( relay_mode) . await ?;
2457+ Ok ( ( ) )
2458+ }
2459+
2460+ #[ tokio:: test]
2461+ #[ traced_test]
2462+ async fn test_one_server_two_clients_public_relay ( ) -> Result {
2463+ let relay_mode = RelayMode :: Default ;
2464+ test_two_clients_impl ( relay_mode) . await ?;
2465+ Ok ( ( ) )
2466+ }
2467+
2468+ #[ tokio:: test]
2469+ #[ traced_test]
2470+ async fn test_one_server_two_clients_no_relay ( ) -> Result {
2471+ test_two_clients_impl ( RelayMode :: Disabled ) . await ?;
2472+ Ok ( ( ) )
2473+ }
2474+
2475+ async fn test_two_clients_impl ( relay_mode : RelayMode ) -> Result {
2476+ const ALPN : & [ u8 ] = b"test" ;
2477+ let use_relay = relay_mode != RelayMode :: Disabled ;
2478+ let server = Endpoint :: builder ( )
2479+ . relay_mode ( relay_mode. clone ( ) )
2480+ . alpns ( vec ! [ ALPN . to_vec( ) ] )
2481+ . insecure_skip_relay_cert_verify ( true )
2482+ . bind ( )
2483+ . instrument ( info_span ! ( "server" ) )
2484+ . await ?;
2485+ if use_relay {
2486+ server. online ( ) . await ;
2487+ }
2488+ info ! ( id = %server. id( ) . fmt_short( ) , "server online" ) ;
2489+ let server_addr = server. addr ( ) ;
2490+
2491+ // We abort this example after 3 connections have finished.
2492+ let count = 3 ;
2493+
2494+ // Our server accepts connections, opens an uni stream, writes some data,
2495+ // and waits for the connection to be closed.
2496+ let server_task = tokio:: spawn (
2497+ async move {
2498+ for i in 0 ..count {
2499+ info ! ( "wait for connection {i}" ) ;
2500+ let conn = server
2501+ . accept ( )
2502+ . await
2503+ . context ( "server endpoint closed" ) ?
2504+ . await ?;
2505+ info ! ( "accepted" ) ;
2506+ let mut s = conn. open_uni ( ) . await . anyerr ( ) ?;
2507+ s. write_all ( b"hi" ) . await . anyerr ( ) ?;
2508+ s. finish ( ) . anyerr ( ) ?;
2509+ debug ! ( "written" ) ;
2510+ conn. closed ( ) . await ;
2511+ info ! ( "connection {i} complete" ) ;
2512+ }
2513+ server. close ( ) . await ;
2514+ n0_error:: Ok ( ( ) )
2515+ }
2516+ . instrument ( info_span ! ( "server" ) ) ,
2517+ ) ;
2518+
2519+ // Our client tasks creates a new endpoint and connects to the server n times.
2520+ let client_task = tokio:: spawn (
2521+ async move {
2522+ for i in 0 ..count {
2523+ let client = Endpoint :: builder ( )
2524+ . relay_mode ( relay_mode. clone ( ) )
2525+ . insecure_skip_relay_cert_verify ( true )
2526+ . bind ( )
2527+ . instrument ( info_span ! ( "client" ) )
2528+ . await ?;
2529+ if use_relay {
2530+ client. online ( ) . await ;
2531+ }
2532+ info ! ( id = %client. id( ) . fmt_short( ) , "endpoint online" ) ;
2533+ let conn = client. connect ( server_addr. clone ( ) , ALPN ) . await ?;
2534+ info ! ( "connected" ) ;
2535+ let mut s = conn. accept_uni ( ) . await . anyerr ( ) ?;
2536+ let data = s. read_to_end ( 2 ) . await . anyerr ( ) ?;
2537+ debug ! ( "read" ) ;
2538+ ensure_any ! ( data == b"hi" , "unexpected data" ) ;
2539+ conn. close ( 23u32 . into ( ) , b"bye" ) ;
2540+ debug ! ( "conn closed" ) ;
2541+ client. close ( ) . await ;
2542+ debug ! ( "endpoint closed" ) ;
2543+ info ! ( "client round {i} complete" ) ;
2544+ }
2545+ n0_error:: Ok ( ( ) )
2546+ }
2547+ . instrument ( info_span ! ( "client" ) ) ,
2548+ ) ;
2549+
2550+ client_task. await . std_context ( "client" ) ?. context ( "client" ) ?;
2551+ server_task. await . std_context ( "server" ) ?. context ( "server" ) ?;
2552+ Ok ( ( ) )
2553+ }
24502554}
0 commit comments