diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-02-06 14:22:59 +0100 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-02-07 17:34:19 +0100 |
| commit | 0bfaddec42d4a2db516d99bc572b27e394427aa8 (patch) | |
| tree | 44d1359f75d6dcf2be62f44ed54ddd89cab94d25 | |
| parent | f94d31a75bcfc0228dee7835cb8c1a992cf29f1a (diff) | |
| download | mullvadvpn-0bfaddec42d4a2db516d99bc572b27e394427aa8.tar.xz mullvadvpn-0bfaddec42d4a2db516d99bc572b27e394427aa8.zip | |
Move testing SOCKS server to own crate
| -rw-r--r-- | test/Cargo.lock | 13 | ||||
| -rw-r--r-- | test/Cargo.toml | 1 | ||||
| -rw-r--r-- | test/socks-server/Cargo.toml | 18 | ||||
| -rw-r--r-- | test/socks-server/src/lib.rs | 38 | ||||
| -rw-r--r-- | test/test-manager/Cargo.toml | 2 | ||||
| -rw-r--r-- | test/test-manager/src/main.rs | 36 |
6 files changed, 77 insertions, 31 deletions
diff --git a/test/Cargo.lock b/test/Cargo.lock index 725d56952e..64d3552540 100644 --- a/test/Cargo.lock +++ b/test/Cargo.lock @@ -2890,6 +2890,17 @@ dependencies = [ ] [[package]] +name = "socks-server" +version = "0.0.0" +dependencies = [ + "err-derive", + "fast-socks5", + "futures", + "log", + "tokio", +] + +[[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -3109,7 +3120,6 @@ dependencies = [ "dirs", "env_logger", "err-derive", - "fast-socks5", "futures", "inventory", "ipnetwork 0.20.0", @@ -3126,6 +3136,7 @@ dependencies = [ "regex", "serde", "serde_json", + "socks-server", "ssh2", "talpid-types", "tarpc", diff --git a/test/Cargo.toml b/test/Cargo.toml index a6653530b5..27c0f94469 100644 --- a/test/Cargo.toml +++ b/test/Cargo.toml @@ -11,6 +11,7 @@ members = [ "test-manager", "test-runner", "test-rpc", + "socks-server", ] [workspace.lints.rust] diff --git a/test/socks-server/Cargo.toml b/test/socks-server/Cargo.toml new file mode 100644 index 0000000000..ba6d1ba4f8 --- /dev/null +++ b/test/socks-server/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "socks-server" +description = "Contains a simple SOCKS5 server" +authors.workspace = true +repository.workspace = true +license.workspace = true +edition.workspace = true +rust-version.workspace = true + +[lints] +workspace = true + +[dependencies] +fast-socks5 = "0.9.5" +err-derive = { workspace = true } +tokio = { workspace = true } +log = { workspace = true } +futures = { workspace = true } diff --git a/test/socks-server/src/lib.rs b/test/socks-server/src/lib.rs new file mode 100644 index 0000000000..19638efe39 --- /dev/null +++ b/test/socks-server/src/lib.rs @@ -0,0 +1,38 @@ +use futures::StreamExt; +use std::io; +use std::net::SocketAddr; + +#[derive(err_derive::Error, Debug)] +pub enum Error { + #[error(display = "Failed to start SOCKS5 server")] + StartSocksServer(#[error(source)] io::Error), +} + +pub async fn spawn(bind_addr: SocketAddr) -> Result<tokio::task::JoinHandle<()>, Error> { + let socks_server: fast_socks5::server::Socks5Server = + fast_socks5::server::Socks5Server::bind(bind_addr) + .await + .map_err(Error::StartSocksServer)?; + + let handle = tokio::spawn(async move { + let mut incoming = socks_server.incoming(); + + while let Some(new_client) = incoming.next().await { + match new_client { + Ok(socket) => { + let fut = socket.upgrade_to_socks5(); + tokio::spawn(async move { + match fut.await { + Ok(_socket) => log::info!("socks client disconnected"), + Err(error) => log::error!("socks client failed: {error}"), + } + }); + } + Err(error) => { + log::error!("failed to accept socks client: {error}"); + } + } + } + }); + Ok(handle) +} diff --git a/test/test-manager/Cargo.toml b/test/test-manager/Cargo.toml index f7a57fab1c..72230a2edd 100644 --- a/test/test-manager/Cargo.toml +++ b/test/test-manager/Cargo.toml @@ -11,7 +11,6 @@ rust-version.workspace = true workspace = true [dependencies] -fast-socks5 = "0.9.5" anyhow = { version = "1", features = ["backtrace"] } futures = { workspace = true } regex = "1" @@ -43,6 +42,7 @@ pcap = { version = "0.10.1", features = ["capture-stream"] } pnet_packet = "0.31.0" test-rpc = { path = "../test-rpc" } +socks-server = { path = "../socks-server" } env_logger = { workspace = true } diff --git a/test/test-manager/src/main.rs b/test/test-manager/src/main.rs index a06b2f0257..d09dab0f53 100644 --- a/test/test-manager/src/main.rs +++ b/test/test-manager/src/main.rs @@ -14,7 +14,6 @@ use std::path::PathBuf; use anyhow::Context; use anyhow::Result; use clap::Parser; -use futures::StreamExt; use std::net::SocketAddr; use tests::config::DEFAULT_MULLVAD_HOST; @@ -250,33 +249,12 @@ async fn main() -> Result<()> { .await .context("Failed to run provisioning for VM")?; - let socks_server: fast_socks5::server::Socks5Server = - fast_socks5::server::Socks5Server::bind(SocketAddr::new( - crate::vm::network::NON_TUN_GATEWAY.into(), - crate::vm::network::SOCKS5_PORT, - )) - .await - .context("Failed to start SOCKS5 server")?; - let socks_server = tokio::spawn(async move { - let mut incoming = socks_server.incoming(); - - while let Some(new_client) = incoming.next().await { - match new_client { - Ok(socket) => { - let fut = socket.upgrade_to_socks5(); - tokio::spawn(async move { - match fut.await { - Ok(_socket) => log::info!("socks client disconnected"), - Err(error) => log::error!("socks client failed: {error}"), - } - }); - } - Err(error) => { - log::error!("failed to accept socks client: {error}"); - } - } - } - }); + // For convenience, spawn a SOCKS5 server that is reachable for tests that need it + let socks = socks_server::spawn(SocketAddr::new( + crate::vm::network::NON_TUN_GATEWAY.into(), + crate::vm::network::SOCKS5_PORT, + )) + .await?; let skip_wait = vm_config.provisioner != config::Provisioner::Noop; @@ -321,7 +299,7 @@ async fn main() -> Result<()> { if display { instance.wait().await; } - socks_server.abort(); + socks.abort(); result } Commands::FormatTestReports { reports } => { |
