Skip to content

Commit aa532dc

Browse files
committed
tests: add test for relay connections
1 parent 1efd2b5 commit aa532dc

File tree

1 file changed

+104
-1
lines changed

1 file changed

+104
-1
lines changed

iroh/src/endpoint.rs

Lines changed: 104 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)