Skip to content

Commit 2c0802e

Browse files
authored
Merge 1652829 into 160d535
2 parents 160d535 + 1652829 commit 2c0802e

File tree

1 file changed

+106
-2
lines changed

1 file changed

+106
-2
lines changed

iroh/src/endpoint.rs

Lines changed: 106 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)