udp_prague 0.1.1

A Rust implementation of the Prague congestion control protocol for UDP-based applications.
Documentation
use std::thread;
use std::time::Duration;

use udp_prague::core::{
    run_receiver_with_reporter, run_sender_with_reporter, Reporter, RunnerConfig, RunnerError,
};

struct SilentReporter;

impl Reporter for SilentReporter {}

#[test]
fn sender_receiver_core_runtime_localhost_smoke() {
    let port = 38083u16;

    let rcv_config = RunnerConfig {
        rcv_addr: "0.0.0.0".to_string(),
        rcv_port: u32::from(port),
        ..RunnerConfig::default()
    };
    let snd_config = RunnerConfig {
        rcv_addr: "127.0.0.1".to_string(),
        rcv_port: u32::from(port),
        connect: true,
        ..RunnerConfig::default()
    };

    let rcv_thr = thread::spawn(move || {
        let mut reporter = SilentReporter;
        run_receiver_with_reporter(rcv_config, &mut reporter, Some(20)).expect("receiver run");
    });

    thread::sleep(Duration::from_millis(50));

    let snd_thr = thread::spawn(move || {
        let mut reporter = SilentReporter;
        run_sender_with_reporter(snd_config, &mut reporter, Some(20)).expect("sender run");
    });

    snd_thr.join().expect("sender join");
    rcv_thr.join().expect("receiver join");
}

#[test]
fn sender_non_connected_startup_timeout_returns_error() {
    let mut reporter = SilentReporter;
    let config = RunnerConfig {
        rcv_addr: "0.0.0.0".to_string(),
        rcv_port: 38089,
        startup_wait_timeout_us: Some(10_000),
        ..RunnerConfig::default()
    };

    let err = run_sender_with_reporter(config, &mut reporter, None).expect_err("startup timeout");
    match err {
        RunnerError::StartupTriggerTimeout { waited_us } => assert_eq!(waited_us, 10_000),
        other => panic!("unexpected error: {other}"),
    }
}