diff options
| -rw-r--r-- | test/test-manager/src/tests/mod.rs | 1 | ||||
| -rw-r--r-- | test/test-manager/src/tests/software.rs | 67 |
2 files changed, 68 insertions, 0 deletions
diff --git a/test/test-manager/src/tests/mod.rs b/test/test-manager/src/tests/mod.rs index ee8b7038fe..08251eb27b 100644 --- a/test/test-manager/src/tests/mod.rs +++ b/test/test-manager/src/tests/mod.rs @@ -4,6 +4,7 @@ mod dns; mod helpers; mod install; mod settings; +mod software; mod test_metadata; mod tunnel; mod tunnel_state; diff --git a/test/test-manager/src/tests/software.rs b/test/test-manager/src/tests/software.rs new file mode 100644 index 0000000000..1c52f5032f --- /dev/null +++ b/test/test-manager/src/tests/software.rs @@ -0,0 +1,67 @@ +//! Tests of interoperability with other software + +use super::{helpers, Error, TestContext}; +use mullvad_management_interface::ManagementServiceClient; +use test_macro::test_function; +use test_rpc::{ExecResult, ServiceClient}; + +/// This test fails if there is no connectivity, or name resolution fails, when connected to a VPN. +#[test_function(target_os = "linux")] +pub async fn test_containers( + _: TestContext, + rpc: ServiceClient, + mut mullvad_client: ManagementServiceClient, +) -> Result<(), Error> { + let result = probe_container_connectivity(&rpc).await?; + assert!( + result.success(), + "containers should have connectivity when disconnected from the VPN" + ); + + helpers::connect_and_wait(&mut mullvad_client).await?; + + let result = probe_container_connectivity(&rpc).await?; + assert!( + result.success(), + "containers should have connectivity when connected to the VPN" + ); + + Ok(()) +} + +/// This function executes curl inside podman or docker in the guest/test runner. +async fn probe_container_connectivity(rpc: &ServiceClient) -> Result<ExecResult, Error> { + let has_podman = rpc.exec("bash", ["-c", "which podman"]).await?.success(); + + let result = if has_podman { + // podman run docker.io/curlimages/curl:latest https://am.i.mullvad.net/connected + rpc.exec( + "podman", + [ + "run", + "docker.io/curlimages/curl:latest", + "https://am.i.mullvad.net/connected", + ], + ) + .await? + } else { + // sudo docker run docker.io/curlimages/curl:latest https://am.i.mullvad.net/connected + rpc.exec( + "sudo", + [ + "docker", + "run", + "docker.io/curlimages/curl:latest", + "https://am.i.mullvad.net/connected", + ], + ) + .await? + }; + + if !result.success() { + let stdout = std::str::from_utf8(&result.stdout).unwrap_or("invalid utf8"); + let stderr = std::str::from_utf8(&result.stderr).unwrap_or("invalid utf8"); + log::error!("probe_container_connectivity failed:\n\nstdout:\n\n{stdout}\n\n{stderr}\n"); + } + Ok(result) +} |
