diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-05-22 15:13:48 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2025-05-22 15:13:48 +0200 |
| commit | 99eab53e5b238c0393a8460b08f358fcb12c242d (patch) | |
| tree | d84d85ca84c25d167d3b831300edb3f45610d757 /android/test | |
| parent | d6c9855a1ec79fa775314e9c0e4206a5a4e97f46 (diff) | |
| parent | 1cc68b0d4ef64b19a3cebc86f48c36025819675e (diff) | |
| download | mullvadvpn-99eab53e5b238c0393a8460b08f358fcb12c242d.tar.xz mullvadvpn-99eab53e5b238c0393a8460b08f358fcb12c242d.zip | |
Merge branch 'e2e-test-to-test-pq-connection-droid-696'
Diffstat (limited to 'android/test')
9 files changed, 128 insertions, 34 deletions
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Story.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Story.kt index 7f919ebaf2..c38fcd776b 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Story.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Story.kt @@ -25,6 +25,16 @@ fun ConnectPage.disablePostQuantumStory() { uiDevice.pressBackTwice() } +fun ConnectPage.enablePostQuantumStory() { + clickSettings() + on<SettingsPage> { clickVpnSettings() } + on<VpnSettingsPage> { + scrollUntilPostQuantumOnCell() + clickPostQuantumOnCell() + } + uiDevice.pressBackTwice() +} + fun ConnectPage.enableShadowsocksStory() { clickSettings() on<SettingsPage> { clickVpnSettings() } diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt index fbd05f483b..8232369cdb 100644 --- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt +++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt @@ -4,6 +4,7 @@ import androidx.test.uiautomator.By import androidx.test.uiautomator.Direction import androidx.test.uiautomator.Until import net.mullvad.mullvadvpn.lib.ui.tag.LAZY_LIST_QUANTUM_ITEM_OFF_TEST_TAG +import net.mullvad.mullvadvpn.lib.ui.tag.LAZY_LIST_QUANTUM_ITEM_ON_TEST_TAG import net.mullvad.mullvadvpn.lib.ui.tag.LAZY_LIST_VPN_SETTINGS_TEST_TAG import net.mullvad.mullvadvpn.lib.ui.tag.LAZY_LIST_WIREGUARD_CUSTOM_PORT_TEXT_TEST_TAG import net.mullvad.mullvadvpn.lib.ui.tag.SWITCH_TEST_TAG @@ -42,6 +43,10 @@ class VpnSettingsPage internal constructor() : Page() { scrollUntilCell(LAZY_LIST_QUANTUM_ITEM_OFF_TEST_TAG) } + fun scrollUntilPostQuantumOnCell() { + scrollUntilCell(LAZY_LIST_QUANTUM_ITEM_ON_TEST_TAG) + } + fun scrollUntilWireGuardObfuscationShadowsocksCell() { scrollUntilCell(WIREGUARD_OBFUSCATION_SHADOWSOCKS_CELL_TEST_TAG) } @@ -58,6 +63,10 @@ class VpnSettingsPage internal constructor() : Page() { uiDevice.clickObjectAwaitIsChecked(By.res(LAZY_LIST_QUANTUM_ITEM_OFF_TEST_TAG)) } + fun clickPostQuantumOnCell() { + uiDevice.clickObjectAwaitIsChecked(By.res(LAZY_LIST_QUANTUM_ITEM_ON_TEST_TAG)) + } + fun clickWireGuardObfuscationShadowsocksCell() { uiDevice.clickObjectAwaitIsChecked(By.res(WIREGUARD_OBFUSCATION_SHADOWSOCKS_CELL_TEST_TAG)) } 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 f23f74dd6a..2d7757ace1 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 @@ -11,6 +11,7 @@ import net.mullvad.mullvadvpn.test.common.page.SettingsPage 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.enablePostQuantumStory import net.mullvad.mullvadvpn.test.common.page.enableShadowsocksStory import net.mullvad.mullvadvpn.test.common.page.on import net.mullvad.mullvadvpn.test.common.rule.ForgetAllVpnAppsInSettingsTestRule @@ -19,6 +20,7 @@ import net.mullvad.mullvadvpn.test.e2e.api.connectioncheck.ConnectionCheckApi import net.mullvad.mullvadvpn.test.e2e.api.relay.RelayApi import net.mullvad.mullvadvpn.test.e2e.misc.AccountTestRule import net.mullvad.mullvadvpn.test.e2e.misc.ClearFirewallRules +import net.mullvad.mullvadvpn.test.e2e.misc.RelayProvider import net.mullvad.mullvadvpn.test.e2e.router.firewall.DropRule import net.mullvad.mullvadvpn.test.e2e.router.firewall.FirewallClient import org.junit.jupiter.api.Assertions.assertEquals @@ -36,6 +38,7 @@ class ConnectionTest : EndToEndTest() { private val connCheckClient = ConnectionCheckApi() private val relayClient = RelayApi() private val firewallClient by lazy { FirewallClient() } + private val relayProvider = RelayProvider() @Test fun testConnect() { @@ -72,6 +75,32 @@ class ConnectionTest : EndToEndTest() { } @Test + fun testConnectUsingPostQuantum() = runTest { + // Given + app.launchAndLogIn(accountTestRule.validAccountNumber) + + // Enable post quantum + on<ConnectPage> { enablePostQuantumStory() } + + // Connect + on<ConnectPage> { clickConnect() } + + device.acceptVpnPermissionDialog() + + var outIpv4Address = "" + + on<ConnectPage> { + waitForConnectedLabel() + outIpv4Address = extractOutIpv4Address() + } + + val result = connCheckClient.connectionCheck() + + // Verify connection + assertEquals(result.ip, outIpv4Address) + } + + @Test @HasDependencyOnLocalAPI @ClearFirewallRules fun testWireGuardObfuscationAutomatic() = runTest { @@ -81,9 +110,9 @@ class ConnectionTest : EndToEndTest() { on<ConnectPage> { clickSelectLocation() } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() @@ -118,9 +147,9 @@ class ConnectionTest : EndToEndTest() { on<ConnectPage> { clickSelectLocation() } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() @@ -170,9 +199,9 @@ class ConnectionTest : EndToEndTest() { on<ConnectPage> { clickSelectLocation() } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() @@ -263,9 +292,9 @@ class ConnectionTest : EndToEndTest() { on<ConnectPage> { clickSelectLocation() } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() 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 cbad74981c..8eef6e2086 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 @@ -68,14 +68,6 @@ abstract class EndToEndTest { ) companion object { - 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" - val firewallClient = FirewallClient() @JvmStatic 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 9a2ec22fef..35c6f323f0 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 @@ -23,6 +23,7 @@ import net.mullvad.mullvadvpn.test.e2e.constant.getTrafficGeneratorPort import net.mullvad.mullvadvpn.test.e2e.misc.AccountTestRule import net.mullvad.mullvadvpn.test.e2e.misc.NetworkTrafficChecker import net.mullvad.mullvadvpn.test.e2e.misc.NoTrafficToHostRule +import net.mullvad.mullvadvpn.test.e2e.misc.RelayProvider import net.mullvad.mullvadvpn.test.e2e.misc.SomeTrafficToHostRule import net.mullvad.mullvadvpn.test.e2e.misc.SomeTrafficToOtherHostsRule import net.mullvad.mullvadvpn.test.e2e.misc.TrafficGenerator @@ -40,6 +41,8 @@ class LeakTest : EndToEndTest() { @JvmField val forgetAllVpnAppsInSettingsTestRule = ForgetAllVpnAppsInSettingsTestRule() + val relayProvider = RelayProvider() + @BeforeEach fun setupVPNSettings() { app.launchAndLogIn(accountTestRule.validAccountNumber) @@ -76,9 +79,9 @@ class LeakTest : EndToEndTest() { } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() @@ -124,9 +127,9 @@ class LeakTest : EndToEndTest() { } on<SelectLocationPage> { - clickLocationExpandButton(DEFAULT_COUNTRY) - clickLocationExpandButton(DEFAULT_CITY) - clickLocationCell(DEFAULT_RELAY) + clickLocationExpandButton(relayProvider.getDefaultRelay().country) + clickLocationExpandButton(relayProvider.getDefaultRelay().city) + clickLocationCell(relayProvider.getDefaultRelay().relay) } device.acceptVpnPermissionDialog() @@ -181,9 +184,9 @@ class LeakTest : EndToEndTest() { on<ConnectPage> { clickSelectLocation() } on<SelectLocationPage> { - clickLocationExpandButton(DAITA_COMPATIBLE_COUNTRY) - clickLocationExpandButton(DAITA_COMPATIBLE_CITY) - clickLocationCell(DAITA_COMPATIBLE_RELAY) + clickLocationExpandButton(relayProvider.getDaitaRelay().country) + clickLocationExpandButton(relayProvider.getDaitaRelay().city) + clickLocationCell(relayProvider.getDaitaRelay().relay) } device.acceptVpnPermissionDialog() 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 1c2cbb6a4a..0e23fca54a 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,15 +1,15 @@ 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.on +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test class WebLinkTest : EndToEndTest() { @Test - @SkipForFlavors(currentFlavor = BuildConfig.FLAVOR_billing, "play") + @Disabled("Disabled due to broken in-browser text detection (DROID-2009)") fun testOpenFaqFromApp() { app.launchAndEnsureOnLoginPage() diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt index b09dd9eae4..dafdd38b80 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/api/relay/RelayApi.kt @@ -17,10 +17,12 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import kotlinx.serialization.json.Json import net.mullvad.mullvadvpn.test.e2e.BuildConfig -import net.mullvad.mullvadvpn.test.e2e.EndToEndTest.Companion.DEFAULT_RELAY import net.mullvad.mullvadvpn.test.e2e.misc.KermitLogger +import net.mullvad.mullvadvpn.test.e2e.misc.RelayProvider class RelayApi { + private val relayProvider = RelayProvider() + private val client: HttpClient = HttpClient(CIO) { install(ContentNegotiation) { json(Json { ignoreUnknownKeys = true }) } @@ -42,10 +44,13 @@ class RelayApi { withContext(Dispatchers.IO) { val body = client.get { url { path(RELAY_PATH) } }.body<String>() val ipRegex = - """${DEFAULT_RELAY}.+?ipv4_addr_in":"(.+?)"""".toRegex(RegexOption.DOT_MATCHES_ALL) + """${relayProvider.getDefaultRelay().relay}.+?ipv4_addr_in":"(.+?)"""" + .toRegex(RegexOption.DOT_MATCHES_ALL) ipRegex.find(body)?.groups?.get(1)?.value - ?: error("Could not find $DEFAULT_RELAY IP address in relay list") + ?: error( + "Could not find ${relayProvider.getDefaultRelay().relay} IP address in relay list" + ) } companion object { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Relays.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Relays.kt new file mode 100644 index 0000000000..fb945af9c7 --- /dev/null +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Relays.kt @@ -0,0 +1,20 @@ +package net.mullvad.mullvadvpn.test.e2e.constant + +import net.mullvad.mullvadvpn.test.e2e.misc.TestRelay + +object Stagemole { + val DEFAULT_RELAY = Relays.gotWg001 + val DAITA_RELAY = Relays.gotWg002RelaySoftware +} + +object Production { + val DEFAULT_RELAY = Relays.gotWg001 + val DAITA_RELAY = Relays.gotWg002 +} + +private object Relays { + val gotWg001 = TestRelay(relay = "se-got-wg-001", country = "Sweden", city = "Gothenburg") + val gotWg002 = TestRelay(relay = "se-got-wg-002", country = "Sweden", city = "Gothenburg") + val gotWg002RelaySoftware = + TestRelay(relay = "se-got-wg-002", country = "Sweden", city = "Gothenburg") +} diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/RelayProvider.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/RelayProvider.kt new file mode 100644 index 0000000000..6aaafde29f --- /dev/null +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/RelayProvider.kt @@ -0,0 +1,26 @@ +package net.mullvad.mullvadvpn.test.e2e.misc + +import net.mullvad.mullvadvpn.test.e2e.BuildConfig +import net.mullvad.mullvadvpn.test.e2e.constant.Production +import net.mullvad.mullvadvpn.test.e2e.constant.Stagemole + +class RelayProvider(val currentFlavor: String = BuildConfig.FLAVOR_billing) { + + fun getDefaultRelay(): TestRelay { + return when (currentFlavor) { + "play" -> Stagemole.DEFAULT_RELAY + "oss" -> Production.DEFAULT_RELAY + else -> error("Invalid flavor: $currentFlavor") + } + } + + fun getDaitaRelay(): TestRelay { + return when (currentFlavor) { + "play" -> Stagemole.DAITA_RELAY + "oss" -> Production.DAITA_RELAY + else -> error("Invalid flavor: $currentFlavor") + } + } +} + +data class TestRelay(val country: String, val city: String, val relay: String) |
