diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-04-04 13:46:40 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-04-04 13:46:40 +0200 |
| commit | f8f47dcb7543193a7b03fd0528a3540dcb5eed01 (patch) | |
| tree | 65d12c88e684f15fd5b86928dcfb64f4b3ff1fed /android/test/e2e | |
| parent | 1e902d3a873ce0a789de0b32cfcf52ab72dacbdf (diff) | |
| parent | af2a71e61c0e5c70716ddd82205583f69c80adf4 (diff) | |
| download | mullvadvpn-f8f47dcb7543193a7b03fd0528a3540dcb5eed01.tar.xz mullvadvpn-f8f47dcb7543193a7b03fd0528a3540dcb5eed01.zip | |
Merge branch 'add-e2e-test-for-shadowsocks-droid-1564'
Diffstat (limited to 'android/test/e2e')
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) } } |
