From a578ffb62647665834786c92b2bd85f1f9bf60f1 Mon Sep 17 00:00:00 2001 From: moiseev-signal <122060238+moiseev-signal@users.noreply.github.com> Date: Mon, 19 Aug 2024 13:42:13 -0700 Subject: [PATCH] net: Add test-support cargo feature --- rust/net/Cargo.toml | 19 ++++++++++ rust/net/examples/chat_smoke_test.rs | 41 +++----------------- rust/net/src/auth.rs | 1 + rust/net/src/chat.rs | 57 ++++++++++++++++++++++++++++ rust/net/src/svr3.rs | 35 +++++++++-------- 5 files changed, 101 insertions(+), 52 deletions(-) diff --git a/rust/net/Cargo.toml b/rust/net/Cargo.toml index 282394c0..8190f432 100644 --- a/rust/net/Cargo.toml +++ b/rust/net/Cargo.toml @@ -5,6 +5,9 @@ edition = "2021" authors = ["Signal Messenger LLC"] license = "AGPL-3.0-only" +[features] +test-support = [] + [dependencies] attest = { path = "../attest" } libsignal-core = { path = "../core" } @@ -75,3 +78,19 @@ tls-parser = "0.11.0" tokio = { version = "1", features = ["test-util", "io-std", "rt-multi-thread"] } url = "2.4.1" warp = { version = "0.3.6", features = ["tls"] } + +[[example]] +name = "svr3" +required-features = ["test-support"] + +[[example]] +name = "svr3_prop_test" +required-features = ["test-support"] + +[[example]] +name = "chat_smoke_test" +required-features = ["test-support"] + +[[test]] +name = "svr3_migration" +required-features = ["test-support"] diff --git a/rust/net/examples/chat_smoke_test.rs b/rust/net/examples/chat_smoke_test.rs index da31ca75..e7e904d2 100644 --- a/rust/net/examples/chat_smoke_test.rs +++ b/rust/net/examples/chat_smoke_test.rs @@ -4,19 +4,14 @@ // use std::process::ExitCode; -use std::time::Duration; use clap::{Args, Parser, ValueEnum}; -use http::uri::PathAndQuery; + use libsignal_net::auth::Auth; -use libsignal_net::chat::{chat_service, ChatServiceError}; -use libsignal_net::env::constants::WEB_SOCKET_PATH; +use libsignal_net::chat::test_support::simple_chat_service; +use libsignal_net::chat::ChatServiceError; use libsignal_net::env::Svr3Env; -use libsignal_net::infra::dns::DnsResolver; -use libsignal_net::infra::tcp_ssl::DirectConnector; -use libsignal_net::infra::{make_ws_config, ConnectionParams, EndpointConnection, RouteType}; -use libsignal_net::utils::ObservableEvent; -use tokio::sync::mpsc; +use libsignal_net::infra::{ConnectionParams, RouteType}; #[derive(Parser)] struct Config { @@ -101,33 +96,7 @@ async fn test_connection( env: &libsignal_net::env::Env<'static, Svr3Env<'static>>, connection_params: Vec, ) -> Result<(), ChatServiceError> { - let one_route_connect_timeout = Duration::from_secs(5); - let network_change_event = ObservableEvent::default(); - let dns_resolver = - DnsResolver::new_with_static_fallback(env.static_fallback(), &network_change_event); - let transport_connector = DirectConnector::new(dns_resolver); - let chat_endpoint = PathAndQuery::from_static(WEB_SOCKET_PATH); - let chat_ws_config = make_ws_config(chat_endpoint, one_route_connect_timeout); - let connection = EndpointConnection::new_multi( - connection_params, - one_route_connect_timeout, - chat_ws_config, - &network_change_event, - ); - - let (incoming_auth_tx, _incoming_rx) = mpsc::channel(1); - let (incoming_unauth_tx, _incoming_rx) = mpsc::channel(1); - let chat = chat_service( - &connection, - transport_connector, - incoming_auth_tx, - incoming_unauth_tx, - Auth { - username: "".to_owned(), - password: "".to_owned(), - }, - false, - ); + let chat = simple_chat_service(env, Auth::default(), connection_params); chat.connect_unauthenticated().await?; chat.disconnect().await; diff --git a/rust/net/src/auth.rs b/rust/net/src/auth.rs index bf0894c8..a37dda1a 100644 --- a/rust/net/src/auth.rs +++ b/rust/net/src/auth.rs @@ -28,6 +28,7 @@ impl From for HttpRequestDecorator { /// - username is a "hex(uid)" /// - password is a "timestamp:hex(otp(uid, timestamp, secret))" #[derive(Clone)] +#[cfg_attr(feature = "test-support", derive(Default))] pub struct Auth { pub username: String, pub password: String, diff --git a/rust/net/src/chat.rs b/rust/net/src/chat.rs index d0c68914..b9130ba8 100644 --- a/rust/net/src/chat.rs +++ b/rust/net/src/chat.rs @@ -475,6 +475,63 @@ pub fn chat_service( } } +#[cfg(feature = "test-support")] +pub mod test_support { + use std::sync::Arc; + use std::time::Duration; + + use http::uri::PathAndQuery; + use tokio::sync::mpsc; + + use crate::auth::Auth; + use crate::chat::{Chat, ChatServiceWithDebugInfo}; + use crate::env::constants::WEB_SOCKET_PATH; + use crate::env::{Env, Svr3Env}; + use crate::infra::dns::DnsResolver; + use crate::infra::tcp_ssl::DirectConnector; + use crate::infra::{make_ws_config, ConnectionParams, EndpointConnection}; + use crate::utils::ObservableEvent; + + use super::*; + + pub type AnyChat = Chat< + Arc, + Arc, + >; + + pub fn simple_chat_service( + env: &Env<'static, Svr3Env<'static>>, + auth: Auth, + connection_params: Vec, + ) -> AnyChat { + let one_route_connect_timeout = Duration::from_secs(5); + let network_change_event = ObservableEvent::default(); + let dns_resolver = + DnsResolver::new_with_static_fallback(env.static_fallback(), &network_change_event); + let transport_connector = DirectConnector::new(dns_resolver); + let chat_endpoint = PathAndQuery::from_static(WEB_SOCKET_PATH); + let chat_ws_config = make_ws_config(chat_endpoint, one_route_connect_timeout); + let connection = EndpointConnection::new_multi( + connection_params, + one_route_connect_timeout, + chat_ws_config, + &network_change_event, + ); + + let (incoming_auth_tx, _incoming_rx) = mpsc::channel(1); + let (incoming_unauth_tx, _incoming_rx) = mpsc::channel(1); + chat_service( + &connection, + transport_connector, + incoming_auth_tx, + incoming_unauth_tx, + auth, + false, + ) + .into_dyn() + } +} + #[cfg(test)] pub(crate) mod test { use crate::chat::{Response, ResponseProto, ResponseProtoInvalidError}; diff --git a/rust/net/src/svr3.rs b/rust/net/src/svr3.rs index fbdabd0f..796cc2c4 100644 --- a/rust/net/src/svr3.rs +++ b/rust/net/src/svr3.rs @@ -3,15 +3,9 @@ // SPDX-License-Identifier: AGPL-3.0-only // -use crate::auth::Auth; -use crate::enclave::PpssSetup; -use crate::env::Svr3Env; use crate::infra::errors::LogSafeDisplay; -use crate::infra::ws::{ - AttestedConnectionError, DefaultStream, WebSocketConnectError, WebSocketServiceError, -}; +use crate::infra::ws::{AttestedConnectionError, WebSocketConnectError, WebSocketServiceError}; use bincode::Options as _; -use direct::DirectConnect; use libsignal_svr3::{EvaluationResult, MaskedShareSet}; use rand_core::CryptoRngCore; use serde::{Deserialize, Serialize}; @@ -275,15 +269,24 @@ where Ok(share_set) } -impl Svr3Env<'static> { - /// Simplest way to connect to an SVR3 Environment in integration tests, command - /// line tools, and examples. - pub async fn connect_directly( - &self, - auth: &Auth, - ) -> >::ConnectionResults { - let endpoints = (self.sgx(), self.nitro(), self.tpm2snp()); - endpoints.connect(auth).await +#[cfg(feature = "test-support")] +pub mod test_support { + use crate::auth::Auth; + use crate::enclave::PpssSetup; + use crate::env::Svr3Env; + use crate::infra::ws::DefaultStream; + use crate::svr3::direct::DirectConnect as _; + + impl Svr3Env<'static> { + /// Simplest way to connect to an SVR3 Environment in integration tests, command + /// line tools, and examples. + pub async fn connect_directly( + &self, + auth: &Auth, + ) -> >::ConnectionResults { + let endpoints = (self.sgx(), self.nitro(), self.tpm2snp()); + endpoints.connect(auth).await + } } }