use crate::prelude::*; #[test] fn end_to_end () -> anyhow::Result <()> { let rt = tokio::runtime::Runtime::new ()?; rt.block_on (end_to_end_async ())?; Ok (()) } async fn end_to_end_async () -> anyhow::Result <()> { use crate::executable_end_server as server; use crate::executable_relay_server as relay; let relay_opt = relay::Opt { listen_addr: "127.0.0.1:0".to_string ().into (), tcp_listen_port: Some (0), }; let relay_app = relay::App::new (relay_opt).await?; let relay_quic_port = relay_app.listen_addr ().port (); let relay_cert = Vec::from (relay_app.server_cert ()); let relay_metrics = Arc::clone (&relay_app.metrics); let tcp_listen_port = relay_app.tcp_listen_port ()?.unwrap (); assert_ne! (tcp_listen_port, 0); let task_relay = tokio::spawn (async move { relay_app.run ().await }); { let m = relay_metrics.read ().await; assert_eq! (m.connected_end_servers, 0); } // Connect with wrong port, should fail let server_conf = server::Config { debug_echo: false, id: "bogus".into (), relay_addr: "127.0.0.1:80".parse ()?, relay_cert: relay_cert.clone (), use_udp_over_tcp: false, }; let server_err = server::P4EndServer::connect (server_conf).await; assert! (server_err.is_err ()); // Connect with wrong cert, should fail let server_conf = server::Config { debug_echo: false, id: "bogus".into (), relay_addr: ([127, 0, 0, 1], relay_quic_port).into (), relay_cert: vec! [], use_udp_over_tcp: false, }; let server_err = server::P4EndServer::connect (server_conf).await; assert! (server_err.is_err ()); { let m = relay_metrics.read ().await; assert_eq! (m.connected_end_servers, 0); } // Connect over UDP let server_conf = server::Config { debug_echo: false, id: "bogus_VZBNRUA5".into (), relay_addr: ([127, 0, 0, 1], relay_quic_port).into (), relay_cert: relay_cert.clone (), use_udp_over_tcp: false, }; let t = Instant::now (); let (server, _) = server::P4EndServer::connect (server_conf).await?; let dur = t.elapsed (); assert! (dur < Duration::from_millis (1_000), "{:?}", dur); { let m = relay_metrics.read ().await; assert_eq! (m.connected_end_servers, 1); } // Connect over TCP let server_conf = server::Config { debug_echo: false, id: "bogus_6E5CZIAI".into (), relay_addr: ([127, 0, 0, 1], tcp_listen_port).into (), relay_cert: relay_cert.clone (), use_udp_over_tcp: true, }; let t = Instant::now (); let (server, _) = server::P4EndServer::connect (server_conf).await?; let dur = t.elapsed (); assert! (dur < Duration::from_millis (1_000), "{:?}", dur); { let m = relay_metrics.read ().await; assert_eq! (m.connected_end_servers, 2); } Ok (()) }