summaryrefslogtreecommitdiffhomepage
path: root/android/test/e2e/src
diff options
context:
space:
mode:
authorNiklas Berglund <niklas.berglund@gmail.com>2024-12-13 17:31:37 +0100
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-01-13 11:04:24 +0100
commitdd3ee9577ff3e99b048a8653ad0a393e47169ac2 (patch)
treebf71258782b3d5241859eb9206f28b71f0f6ac3d /android/test/e2e/src
parentfaf8f909b83af3401920485dbfc816ffd55d5cb7 (diff)
downloadmullvadvpn-dd3ee9577ff3e99b048a8653ad0a393e47169ac2.tar.xz
mullvadvpn-dd3ee9577ff3e99b048a8653ad0a393e47169ac2.zip
Add leak test for when VPN settings change
Diffstat (limited to 'android/test/e2e/src')
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt28
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt4
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt104
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LogoutTest.kt4
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt4
5 files changed, 118 insertions, 26 deletions
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt
index 1ba78818a2..0ed78f6db3 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt
@@ -9,7 +9,6 @@ import net.mullvad.mullvadvpn.test.common.page.ConnectPage
import net.mullvad.mullvadvpn.test.common.page.SelectLocationPage
import net.mullvad.mullvadvpn.test.common.page.SettingsPage
import net.mullvad.mullvadvpn.test.common.page.SystemVpnConfigurationAlert
-import net.mullvad.mullvadvpn.test.common.page.TopBar
import net.mullvad.mullvadvpn.test.common.page.VpnSettingsPage
import net.mullvad.mullvadvpn.test.common.page.on
import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule
@@ -72,7 +71,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
@ClearFirewallRules
fun testWireGuardObfuscationAutomatic() = runBlocking {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- enableLocalNetworkSharing()
+ app.enableLocalNetworkSharing()
on<ConnectPage> { clickSelectLocation() }
@@ -109,7 +108,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
@ClearFirewallRules
fun testWireGuardObfuscationOff() = runBlocking {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- enableLocalNetworkSharing()
+ app.enableLocalNetworkSharing()
on<ConnectPage> { clickSelectLocation() }
@@ -134,13 +133,13 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
firewallClient.createRule(firewallRule)
// Enable UDP-over-TCP
- on<TopBar> { clickSettings() }
+ on<ConnectPage> { clickSettings() }
on<SettingsPage> { clickVpnSettings() }
on<VpnSettingsPage> {
- scrollUntilWireguardObfuscationOffCell()
- clickWireguardObfuscationOffCell()
+ scrollUntilWireGuardObfuscationOffCell()
+ clickWireGuardObfuscationOffCell()
}
device.pressBack()
@@ -162,7 +161,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
fun testUDPOverTCP() =
runBlocking<Unit> {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- enableLocalNetworkSharing()
+ app.enableLocalNetworkSharing()
on<ConnectPage> { clickSelectLocation() }
@@ -187,12 +186,12 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
firewallClient.createRule(firewallRule)
// Enable UDP-over-TCP
- on<TopBar> { clickSettings() }
+ on<ConnectPage> { clickSettings() }
on<SettingsPage> { clickVpnSettings() }
on<VpnSettingsPage> {
- scrollUntilWireguardObfuscationUdpOverTcpCell()
+ scrollUntilWireGuardObfuscationUdpOverTcpCell()
clickWireguardObfuscationUdpOverTcpCell()
}
@@ -206,17 +205,6 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
}
}
- private fun enableLocalNetworkSharing() {
- on<TopBar> { clickSettings() }
-
- on<SettingsPage> { clickVpnSettings() }
-
- on<VpnSettingsPage> { clickLocalNetworkSharingSwitch() }
-
- device.pressBack()
- device.pressBack()
- }
-
companion object {
const val VERY_FORGIVING_WIREGUARD_OFF_CONNECTION_TIMEOUT = 60000L
const val UNSUCCESSFUL_CONNECTION_TIMEOUT = 60000L
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
index dfa050f9bc..f74355ae2a 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/EndToEndTest.kt
@@ -57,5 +57,9 @@ abstract class EndToEndTest(private val infra: String) {
const val DEFAULT_COUNTRY = "Sweden"
const val DEFAULT_CITY = "Gothenburg"
const val DEFAULT_RELAY = "se-got-wg-001"
+
+ const val DAITA_COMPATIBLE_COUNTRY = "Relay Software Country"
+ const val DAITA_COMPATIBLE_CITY = "Relay Software city"
+ const val DAITA_COMPATIBLE_RELAY = "se-got-wg-002"
}
}
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt
index 51b6d84708..46f1271257 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt
@@ -5,10 +5,10 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import net.mullvad.mullvadvpn.test.common.misc.Attachment
import net.mullvad.mullvadvpn.test.common.page.ConnectPage
+import net.mullvad.mullvadvpn.test.common.page.DaitaSettingsPage
import net.mullvad.mullvadvpn.test.common.page.SelectLocationPage
import net.mullvad.mullvadvpn.test.common.page.SettingsPage
import net.mullvad.mullvadvpn.test.common.page.SystemVpnConfigurationAlert
-import net.mullvad.mullvadvpn.test.common.page.TopBar
import net.mullvad.mullvadvpn.test.common.page.VpnSettingsPage
import net.mullvad.mullvadvpn.test.common.page.WireGuardCustomPortDialog
import net.mullvad.mullvadvpn.test.common.page.on
@@ -36,7 +36,7 @@ class LeakTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
fun setupVPNSettings() {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- on<TopBar> { clickSettings() }
+ on<ConnectPage> { clickSettings() }
on<SettingsPage> { clickVpnSettings() }
@@ -159,4 +159,104 @@ class LeakTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
val leakRules = listOf(NoTrafficToHostRule(targetIpAddress))
LeakCheck.assertLeaks(capturedStreams, leakRules)
}
+
+ @Test
+ @HasDependencyOnLocalAPI
+ fun testLeakWhenVpnSettingsChange() =
+ runBlocking<Unit> {
+ app.launch()
+ // Obfuscation and Post-Quantum are by default set to automatic. Explicitly set to off.
+ disableObfuscation()
+ disablePostQuantum()
+
+ on<ConnectPage> { clickSelectLocation() }
+
+ on<SelectLocationPage> {
+ clickLocationExpandButton(DAITA_COMPATIBLE_COUNTRY)
+ clickLocationExpandButton(DAITA_COMPATIBLE_CITY)
+ clickLocationCell(DAITA_COMPATIBLE_RELAY)
+ }
+
+ on<SystemVpnConfigurationAlert> { clickOk() }
+
+ on<ConnectPage> { waitForConnectedLabel() }
+
+ // Capture generated traffic to a specific host
+ val targetIpAddress = BuildConfig.TRAFFIC_GENERATION_IP_ADDRESS
+ val targetPort = 80
+ val captureResult: PacketCaptureResult =
+ PacketCapture().capturePackets {
+ TrafficGenerator(targetIpAddress, targetPort).generateTraffic(10.milliseconds) {
+ delay(
+ 1000.milliseconds
+ ) // Give it some time for generating traffic in tunnel before changing
+ // settings
+
+ enableDAITA()
+ enableShadowsocks()
+
+ on<ConnectPage> { waitForConnectedLabel() }
+
+ delay(
+ 1000.milliseconds
+ ) // Give it some time for generating traffic in tunnel after enabling
+ // settings
+ }
+ }
+
+ val capturedStreams = captureResult.streams
+ val capturedPcap = captureResult.pcap
+ val timestamp = System.currentTimeMillis()
+ Attachment.saveAttachment(
+ "capture-testLeakWhenVpnSettingsChange-$timestamp.pcap",
+ capturedPcap,
+ )
+
+ val leakRules = listOf(NoTrafficToHostRule(targetIpAddress))
+ LeakCheck.assertLeaks(capturedStreams, leakRules)
+ }
+
+ private fun disableObfuscation() {
+ on<ConnectPage> { clickSettings() }
+ on<SettingsPage> { clickVpnSettings() }
+ on<VpnSettingsPage> {
+ scrollUntilWireGuardObfuscationUdpOverTcpCell()
+ clickWireGuardObfuscationOffCell()
+ }
+
+ device.pressBack()
+ device.pressBack()
+ }
+
+ private fun disablePostQuantum() {
+ on<ConnectPage> { clickSettings() }
+ on<SettingsPage> { clickVpnSettings() }
+ on<VpnSettingsPage> {
+ scrollUntilPostQuantumOffCell()
+ clickPostQuantumOffCell()
+ }
+
+ device.pressBack()
+ device.pressBack()
+ }
+
+ private fun enableShadowsocks() {
+ on<ConnectPage> { clickSettings() }
+ on<SettingsPage> { clickVpnSettings() }
+ on<VpnSettingsPage> {
+ scrollUntilWireGuardObfuscationShadowsocksCell()
+ clickWireGuardObfuscationShadowsocksCell()
+ }
+
+ device.pressBack()
+ device.pressBack()
+ }
+
+ private fun enableDAITA() {
+ on<ConnectPage> { clickSettings() }
+ on<SettingsPage> { clickDaita() }
+ on<DaitaSettingsPage> { clickEnableSwitch() }
+ device.pressBack()
+ device.pressBack()
+ }
}
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LogoutTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LogoutTest.kt
index af03c462c6..f99cfc5161 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LogoutTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LogoutTest.kt
@@ -1,8 +1,8 @@
package net.mullvad.mullvadvpn.test.e2e
import net.mullvad.mullvadvpn.test.common.page.AccountPage
+import net.mullvad.mullvadvpn.test.common.page.ConnectPage
import net.mullvad.mullvadvpn.test.common.page.LoginPage
-import net.mullvad.mullvadvpn.test.common.page.TopBar
import net.mullvad.mullvadvpn.test.common.page.on
import net.mullvad.mullvadvpn.test.e2e.misc.AccountTestRule
import org.junit.jupiter.api.Test
@@ -17,7 +17,7 @@ class LogoutTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
// Given
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- on<TopBar> { clickAccount() }
+ on<ConnectPage> { clickAccount() }
on<AccountPage> { clickLogOut() }
diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt
index 402939db7a..8d8467392c 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/WebLinkTest.kt
@@ -1,9 +1,9 @@
package net.mullvad.mullvadvpn.test.e2e
import net.mullvad.mullvadvpn.test.common.annotation.SkipForFlavors
+import net.mullvad.mullvadvpn.test.common.page.LoginPage
import net.mullvad.mullvadvpn.test.common.page.MullvadWebsite
import net.mullvad.mullvadvpn.test.common.page.SettingsPage
-import net.mullvad.mullvadvpn.test.common.page.TopBar
import net.mullvad.mullvadvpn.test.common.page.on
import org.junit.jupiter.api.Test
@@ -13,7 +13,7 @@ class WebLinkTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
fun testOpenFaqFromApp() {
app.launchAndEnsureOnLoginPage()
- on<TopBar> { clickSettings() }
+ on<LoginPage> { clickSettings() }
on<SettingsPage> { clickFaqAndGuides() }