summaryrefslogtreecommitdiffhomepage
path: root/android/test/e2e
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-04-04 13:46:40 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2025-04-04 13:46:40 +0200
commitf8f47dcb7543193a7b03fd0528a3540dcb5eed01 (patch)
tree65d12c88e684f15fd5b86928dcfb64f4b3ff1fed /android/test/e2e
parent1e902d3a873ce0a789de0b32cfcf52ab72dacbdf (diff)
parentaf2a71e61c0e5c70716ddd82205583f69c80adf4 (diff)
downloadmullvadvpn-f8f47dcb7543193a7b03fd0528a3540dcb5eed01.tar.xz
mullvadvpn-f8f47dcb7543193a7b03fd0528a3540dcb5eed01.zip
Merge branch 'add-e2e-test-for-shadowsocks-droid-1564'
Diffstat (limited to 'android/test/e2e')
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt45
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt59
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/DropRule.kt10
3 files changed, 59 insertions, 55 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 0ed78f6db3..688b83c875 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
@@ -10,6 +10,9 @@ 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.VpnSettingsPage
+import net.mullvad.mullvadvpn.test.common.page.disableObfuscationStory
+import net.mullvad.mullvadvpn.test.common.page.enableLocalNetworkSharingStory
+import net.mullvad.mullvadvpn.test.common.page.enableShadowsocksStory
import net.mullvad.mullvadvpn.test.common.page.on
import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule
import net.mullvad.mullvadvpn.test.e2e.annotations.HasDependencyOnLocalAPI
@@ -71,7 +74,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
@ClearFirewallRules
fun testWireGuardObfuscationAutomatic() = runBlocking {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- app.enableLocalNetworkSharing()
+ on<ConnectPage> { enableLocalNetworkSharingStory() }
on<ConnectPage> { clickSelectLocation() }
@@ -108,7 +111,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
@ClearFirewallRules
fun testWireGuardObfuscationOff() = runBlocking {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- app.enableLocalNetworkSharing()
+ on<ConnectPage> { enableLocalNetworkSharingStory() }
on<ConnectPage> { clickSelectLocation() }
@@ -161,7 +164,7 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
fun testUDPOverTCP() =
runBlocking<Unit> {
app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
- app.enableLocalNetworkSharing()
+ on<ConnectPage> { enableLocalNetworkSharingStory() }
on<ConnectPage> { clickSelectLocation() }
@@ -205,8 +208,44 @@ class ConnectionTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
}
}
+ @Test
+ @HasDependencyOnLocalAPI
+ @ClearFirewallRules
+ fun testShadowsocks() =
+ runBlocking<Unit> {
+ app.launchAndEnsureLoggedIn(accountTestRule.validAccountNumber)
+ on<ConnectPage> { enableLocalNetworkSharingStory() }
+
+ on<ConnectPage> { disableObfuscationStory() }
+
+ // Block all WireGuard traffic
+ val firewallRule = DropRule.blockWireGuardTrafficRule(ANY_IP_ADDRESS)
+ firewallClient.createRule(firewallRule)
+
+ on<ConnectPage> { clickConnect() }
+
+ on<SystemVpnConfigurationAlert> { clickOk() }
+
+ // Ensure it is not possible to connect to relay
+ on<ConnectPage> {
+ delay(UNSUCCESSFUL_CONNECTION_TIMEOUT.milliseconds)
+ waitForConnectingLabel()
+ clickCancel()
+ }
+
+ on<ConnectPage> { enableShadowsocksStory() }
+
+ // Ensure we can now connect with Shadowsocks enabled
+ on<ConnectPage> {
+ clickConnect()
+ waitForConnectedLabel(timeout = EXTREMELY_LONG_TIMEOUT)
+ clickDisconnect()
+ }
+ }
+
companion object {
const val VERY_FORGIVING_WIREGUARD_OFF_CONNECTION_TIMEOUT = 60000L
const val UNSUCCESSFUL_CONNECTION_TIMEOUT = 60000L
+ const val ANY_IP_ADDRESS = "0.0.0.0/0"
}
}
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 f109ff3b74..79471a2363 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,12 +5,15 @@ 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.VpnSettingsPage
import net.mullvad.mullvadvpn.test.common.page.WireGuardCustomPortDialog
+import net.mullvad.mullvadvpn.test.common.page.disableObfuscationStory
+import net.mullvad.mullvadvpn.test.common.page.disablePostQuantumStory
+import net.mullvad.mullvadvpn.test.common.page.enableDAITAStory
+import net.mullvad.mullvadvpn.test.common.page.enableShadowsocksStory
import net.mullvad.mullvadvpn.test.common.page.on
import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule
import net.mullvad.mullvadvpn.test.e2e.annotations.HasDependencyOnLocalAPI
@@ -181,9 +184,8 @@ class LeakTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
runBlocking<Unit> {
app.launch()
// Obfuscation and Post-Quantum are by default set to automatic. Explicitly set to off.
- disableObfuscation()
- disablePostQuantum()
-
+ on<ConnectPage> { disableObfuscationStory() }
+ on<ConnectPage> { disablePostQuantumStory() }
on<ConnectPage> { clickSelectLocation() }
on<SelectLocationPage> {
@@ -207,9 +209,8 @@ class LeakTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
) // Give it some time for generating traffic in tunnel before changing
// settings
- enableDAITA()
- enableShadowsocks()
-
+ on<ConnectPage> { enableDAITAStory() }
+ on<ConnectPage> { enableShadowsocksStory() }
on<ConnectPage> { waitForConnectedLabel() }
delay(
@@ -232,48 +233,4 @@ class LeakTest : EndToEndTest(BuildConfig.FLAVOR_infrastructure) {
NoTrafficToHostRule(targetIpAddress),
)
}
-
- 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/router/firewall/DropRule.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/DropRule.kt
index 627ecdc0fe..1431d9bf1b 100644
--- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/DropRule.kt
+++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/router/firewall/DropRule.kt
@@ -14,13 +14,21 @@ import net.mullvad.mullvadvpn.test.e2e.router.NetworkingProtocol
data class DropRule(
@SerialName("src") val source: String,
@SerialName("dst") val destination: String,
+ @SerialName("block_wireguard") val blockWireGuard: Boolean = false,
val protocols: List<NetworkingProtocol>,
@EncodeDefault val label: String = "urn:uuid:${SessionIdentifier.fromDeviceIdentifier()}",
) {
companion object {
fun blockUDPTrafficRule(to: String): DropRule {
val testDeviceIpAddress = Networking.getDeviceIpv4Address()
- return DropRule(testDeviceIpAddress, to, listOf(NetworkingProtocol.UDP))
+ return DropRule(
+ source = testDeviceIpAddress,
+ destination = to,
+ protocols = listOf(NetworkingProtocol.UDP),
+ )
}
+
+ fun blockWireGuardTrafficRule(to: String): DropRule =
+ blockUDPTrafficRule(to).copy(blockWireGuard = true)
}
}