summaryrefslogtreecommitdiffhomepage
path: root/test/test-manager/src/tests
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-01-03 14:07:24 +0100
committerDavid Lönnhager <david.l@mullvad.net>2024-01-12 13:24:37 +0100
commitc220b26c47af5db07a0ca4342f504e41ec725d87 (patch)
tree629da855b26eb9bd6466104f613a5c0491090b6e /test/test-manager/src/tests
parentc25de4da4f09cd55b5209c985833beae0741ef21 (diff)
downloadmullvadvpn-c220b26c47af5db07a0ca4342f504e41ec725d87.tar.xz
mullvadvpn-c220b26c47af5db07a0ca4342f504e41ec725d87.zip
Add e2e test for containers on Linux
Diffstat (limited to 'test/test-manager/src/tests')
-rw-r--r--test/test-manager/src/tests/mod.rs1
-rw-r--r--test/test-manager/src/tests/software.rs67
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)
+}