Skip to content

Commit 216db23

Browse files
committed
Move testing SOCKS server to own crate
1 parent a6fe745 commit 216db23

File tree

6 files changed

+77
-31
lines changed

6 files changed

+77
-31
lines changed

test/Cargo.lock

+12-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ members = [
1111
"test-manager",
1212
"test-runner",
1313
"test-rpc",
14+
"socks-server",
1415
]
1516

1617
[workspace.lints.rust]

test/socks-server/Cargo.toml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "socks-server"
3+
description = "Contains a simple SOCKS5 server"
4+
authors.workspace = true
5+
repository.workspace = true
6+
license.workspace = true
7+
edition.workspace = true
8+
rust-version.workspace = true
9+
10+
[lints]
11+
workspace = true
12+
13+
[dependencies]
14+
fast-socks5 = "0.9.5"
15+
err-derive = { workspace = true }
16+
tokio = { workspace = true }
17+
log = { workspace = true }
18+
futures = { workspace = true }

test/socks-server/src/lib.rs

+38
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use futures::StreamExt;
2+
use std::io;
3+
use std::net::SocketAddr;
4+
5+
#[derive(err_derive::Error, Debug)]
6+
pub enum Error {
7+
#[error(display = "Failed to start SOCKS5 server")]
8+
StartSocksServer(#[error(source)] io::Error),
9+
}
10+
11+
pub async fn spawn(bind_addr: SocketAddr) -> Result<tokio::task::JoinHandle<()>, Error> {
12+
let socks_server: fast_socks5::server::Socks5Server =
13+
fast_socks5::server::Socks5Server::bind(bind_addr)
14+
.await
15+
.map_err(Error::StartSocksServer)?;
16+
17+
let handle = tokio::spawn(async move {
18+
let mut incoming = socks_server.incoming();
19+
20+
while let Some(new_client) = incoming.next().await {
21+
match new_client {
22+
Ok(socket) => {
23+
let fut = socket.upgrade_to_socks5();
24+
tokio::spawn(async move {
25+
match fut.await {
26+
Ok(_socket) => log::info!("socks client disconnected"),
27+
Err(error) => log::error!("socks client failed: {error}"),
28+
}
29+
});
30+
}
31+
Err(error) => {
32+
log::error!("failed to accept socks client: {error}");
33+
}
34+
}
35+
}
36+
});
37+
Ok(handle)
38+
}

test/test-manager/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ rust-version.workspace = true
1111
workspace = true
1212

1313
[dependencies]
14-
fast-socks5 = "0.9.5"
1514
anyhow = { version = "1", features = ["backtrace"] }
1615
futures = { workspace = true }
1716
regex = "1"
@@ -43,6 +42,7 @@ pcap = { version = "0.10.1", features = ["capture-stream"] }
4342
pnet_packet = "0.31.0"
4443

4544
test-rpc = { path = "../test-rpc" }
45+
socks-server = { path = "../socks-server" }
4646

4747
env_logger = { workspace = true }
4848

test/test-manager/src/main.rs

+7-29
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ use std::path::PathBuf;
1414
use anyhow::Context;
1515
use anyhow::Result;
1616
use clap::Parser;
17-
use futures::StreamExt;
1817
use std::net::SocketAddr;
1918
use tests::config::DEFAULT_MULLVAD_HOST;
2019

@@ -250,33 +249,12 @@ async fn main() -> Result<()> {
250249
.await
251250
.context("Failed to run provisioning for VM")?;
252251

253-
let socks_server: fast_socks5::server::Socks5Server =
254-
fast_socks5::server::Socks5Server::bind(SocketAddr::new(
255-
crate::vm::network::NON_TUN_GATEWAY.into(),
256-
crate::vm::network::SOCKS5_PORT,
257-
))
258-
.await
259-
.context("Failed to start SOCKS5 server")?;
260-
let socks_server = tokio::spawn(async move {
261-
let mut incoming = socks_server.incoming();
262-
263-
while let Some(new_client) = incoming.next().await {
264-
match new_client {
265-
Ok(socket) => {
266-
let fut = socket.upgrade_to_socks5();
267-
tokio::spawn(async move {
268-
match fut.await {
269-
Ok(_socket) => log::info!("socks client disconnected"),
270-
Err(error) => log::error!("socks client failed: {error}"),
271-
}
272-
});
273-
}
274-
Err(error) => {
275-
log::error!("failed to accept socks client: {error}");
276-
}
277-
}
278-
}
279-
});
252+
// For convenience, spawn a SOCKS5 server that is reachable for tests that need it
253+
let socks = socks_server::spawn(SocketAddr::new(
254+
crate::vm::network::NON_TUN_GATEWAY.into(),
255+
crate::vm::network::SOCKS5_PORT,
256+
))
257+
.await?;
280258

281259
let skip_wait = vm_config.provisioner != config::Provisioner::Noop;
282260

@@ -321,7 +299,7 @@ async fn main() -> Result<()> {
321299
if display {
322300
instance.wait().await;
323301
}
324-
socks_server.abort();
302+
socks.abort();
325303
result
326304
}
327305
Commands::FormatTestReports { reports } => {

0 commit comments

Comments
 (0)