summaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2023-10-23 22:05:31 +0200
committerDavid Lönnhager <david.l@mullvad.net>2023-10-24 09:45:17 +0200
commit51b34719239a8780ef3885017d2d450cae6da87c (patch)
treeafb9f0a787ddd71a2a0ae7ab0316279abe05a63a /test
parent2be7509cfe48e08f442d1a78af1b7c12644c5e73 (diff)
downloadmullvadvpn-51b34719239a8780ef3885017d2d450cae6da87c.tar.xz
mullvadvpn-51b34719239a8780ef3885017d2d450cae6da87c.zip
Make WireGuard interface temporary during test run
Diffstat (limited to 'test')
-rw-r--r--test/test-manager/src/vm/network/macos.rs63
1 files changed, 45 insertions, 18 deletions
diff --git a/test/test-manager/src/vm/network/macos.rs b/test/test-manager/src/vm/network/macos.rs
index 5e4bdae786..bfef3a9ddb 100644
--- a/test/test-manager/src/vm/network/macos.rs
+++ b/test/test-manager/src/vm/network/macos.rs
@@ -36,6 +36,9 @@ pub const NON_TUN_GATEWAY: Ipv4Addr = Ipv4Addr::new(192, 168, 64, 1);
/// Name of the wireguard interface on the host
pub const CUSTOM_TUN_INTERFACE_NAME: &str = "utun123";
+/// Timeout for wireguard-go to create an interface
+const INTERFACE_SETUP_TIMEOUT: Duration = Duration::from_secs(5);
+
/// Set up WireGuard relay and dummy hosts.
pub async fn setup_test_network() -> Result<()> {
log::debug!("Setting up test network");
@@ -84,28 +87,52 @@ async fn enable_forwarding() -> Result<()> {
async fn create_wireguard_interface() -> Result<()> {
log::debug!("Creating custom WireGuard tunnel");
- // Check if the tunnel already exists
- let mut cmd = Command::new("/sbin/ifconfig");
- cmd.arg(CUSTOM_TUN_INTERFACE_NAME);
- let output = cmd
- .output()
- .await
- .context("Check if wireguard tunnel exists")?;
- if output.status.success() {
- log::debug!("Tunnel {CUSTOM_TUN_INTERFACE_NAME} already exists");
- } else {
+ let mut go_proc = tokio::spawn(async move {
let mut cmd = Command::new("/usr/bin/sudo");
- cmd.args(["wireguard-go", CUSTOM_TUN_INTERFACE_NAME]);
+ cmd.kill_on_drop(true);
+ cmd.args(["wireguard-go", "-f", CUSTOM_TUN_INTERFACE_NAME]);
let output = cmd.output().await.context("Run wireguard-go")?;
- if !output.status.success() {
- return Err(anyhow!(
- "wireguard-go failed: {}",
- output.status.code().unwrap()
- ));
+ if output.status.success() {
+ Ok(())
+ } else {
+ Err(anyhow!(
+ "wireguard-go failed with status {:?}",
+ output.status.code()
+ ))
}
- }
+ });
- Ok(())
+ let mut tunnel_check: tokio::task::JoinHandle<Result<()>> = tokio::spawn(async move {
+ loop {
+ // Check if the tunnel already exists
+ let mut cmd = Command::new("/sbin/ifconfig");
+ cmd.arg(CUSTOM_TUN_INTERFACE_NAME);
+ let output = cmd
+ .output()
+ .await
+ .context("Check if wireguard tunnel exists")?;
+ if output.status.success() {
+ log::debug!("Created custom WireGuard tunnel interface");
+ return Ok(());
+ }
+ tokio::time::sleep(Duration::from_secs(1)).await;
+ }
+ });
+
+ let result = tokio::time::timeout(
+ INTERFACE_SETUP_TIMEOUT,
+ future::select(&mut go_proc, &mut tunnel_check),
+ )
+ .await
+ .context("WireGuard interface setup timed out")?;
+
+ let result = match result {
+ Either::Left((result, _)) | Either::Right((result, _)) => result,
+ };
+
+ tunnel_check.abort();
+
+ result?
}
pub async fn configure_tunnel() -> Result<()> {