summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorDavid Göransson <david.goransson@mullvad.net>2025-05-13 09:59:19 +0200
committerDavid Göransson <david.goransson@mullvad.net>2025-05-13 09:59:19 +0200
commit5b854035efdd63a65eb70c4b3f4f35c94500934b (patch)
tree42cd8cde7d2d34050ee998e5d671098abaae189d /android
parent3a7029e28bef6406f9a03a42afd1db341f3b0391 (diff)
parente10866a9e07ca806d72abb493b0083cab19f1753 (diff)
downloadmullvadvpn-5b854035efdd63a65eb70c4b3f4f35c94500934b.tar.xz
mullvadvpn-5b854035efdd63a65eb70c4b3f4f35c94500934b.zip
Merge branch 'fix-wait-for-stable-null-pointer'
Diffstat (limited to 'android')
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt22
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt4
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt16
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt4
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/ConnectionTest.kt14
-rw-r--r--android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LeakTest.kt8
6 files changed, 37 insertions, 31 deletions
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt
index c14be06208..37c2283962 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt
@@ -2,11 +2,14 @@ package net.mullvad.mullvadvpn.test.common.extension
import androidx.test.uiautomator.By
import androidx.test.uiautomator.BySelector
+import androidx.test.uiautomator.StableResult
import androidx.test.uiautomator.StaleObjectException
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiObject2
import androidx.test.uiautomator.UiObject2Condition
import androidx.test.uiautomator.Until
+import androidx.test.uiautomator.waitForAppToBeVisible
+import androidx.test.uiautomator.waitForStableInActiveWindow
import co.touchlab.kermit.Logger
import java.lang.Thread.sleep
import java.util.regex.Pattern
@@ -104,3 +107,22 @@ fun UiObject2.findObjectWithTimeout(
)
}
}
+
+fun UiDevice.acceptVpnPermissionDialog() {
+ findObjectWithTimeout(By.text("Connection request"))
+ // Accept Creating the VPN Permission profile
+ findObjectWithTimeout(By.text("OK")).click()
+ waitForAppToBeVisible(currentPackageName)
+}
+
+fun UiDevice.waitForStableInActiveWindowSafe(): StableResult? =
+ try {
+ // Wait for stable is not very stable, but it is our best best to wait for animation to
+ // settle. For now we will just catch the exception and sleep for a bit and hope for the
+ // best.
+ waitForStableInActiveWindow()
+ } catch (e: Exception) {
+ Logger.e("waitForStableInActiveWindow failed", e)
+ sleep(1000)
+ null
+ }
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt
index c865fb0e50..e01ab6dec7 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/Page.kt
@@ -2,7 +2,7 @@ package net.mullvad.mullvadvpn.test.common.page
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
-import androidx.test.uiautomator.waitForStableInActiveWindow
+import net.mullvad.mullvadvpn.test.common.extension.waitForStableInActiveWindowSafe
sealed class Page {
val uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
@@ -14,7 +14,7 @@ inline fun <reified T : Page> on(scope: T.() -> Unit = {}) {
val page = T::class.java.getConstructor().newInstance()
// Wait for the screen to settle and so we don't proceed with actions too early. Otherwise, we
// might start clicking on the screen before it is in a resumed state.
- page.uiDevice.waitForStableInActiveWindow()
+ page.uiDevice.waitForStableInActiveWindowSafe()
page.assertIsDisplayed()
page.scope()
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt
deleted file mode 100644
index 046d6e8197..0000000000
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.mullvad.mullvadvpn.test.common.page
-
-import androidx.test.uiautomator.By
-import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
-
-class SystemVpnConfigurationAlert internal constructor() : Page() {
- private val okSelector = By.text("OK")
-
- override fun assertIsDisplayed() {
- uiDevice.findObjectWithTimeout(okSelector)
- }
-
- fun clickOk() {
- uiDevice.findObjectWithTimeout(okSelector).click()
- }
-}
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt
index 2f5f8c4133..39ad3cd83a 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TooManyDevicesPage.kt
@@ -1,9 +1,9 @@
package net.mullvad.mullvadvpn.test.common.page
import androidx.test.uiautomator.By
-import androidx.test.uiautomator.waitForStableInActiveWindow
import net.mullvad.mullvadvpn.test.common.extension.expectObjectToDisappearWithTimeout
import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+import net.mullvad.mullvadvpn.test.common.extension.waitForStableInActiveWindowSafe
class TooManyDevicesPage internal constructor() : Page() {
private val tooManyDevicesSelector = By.text("Too many devices")
@@ -37,7 +37,7 @@ fun TooManyDevicesPage.removeDeviceFlow(deviceName: String) {
clickRemoveDevice(deviceName)
// Wait for the confirmation dialog to appear
- uiDevice.waitForStableInActiveWindow()
+ uiDevice.waitForStableInActiveWindowSafe()
// Confirm logout
uiDevice.findObjectWithTimeout(By.text("Yes, log out device")).click()
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 0908d8f4ed..0d0f3d6262 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
@@ -4,10 +4,10 @@ import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
import net.mullvad.mullvadvpn.test.common.constant.EXTREMELY_LONG_TIMEOUT
+import net.mullvad.mullvadvpn.test.common.extension.acceptVpnPermissionDialog
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.VpnSettingsPage
import net.mullvad.mullvadvpn.test.common.page.disableObfuscationStory
import net.mullvad.mullvadvpn.test.common.page.enableLocalNetworkSharingStory
@@ -42,7 +42,7 @@ class ConnectionTest : EndToEndTest() {
on<ConnectPage> { clickConnect() }
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
on<ConnectPage> { waitForConnectedLabel() }
}
@@ -54,7 +54,7 @@ class ConnectionTest : EndToEndTest() {
on<ConnectPage> { clickConnect() }
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
var outIpv4Address = ""
@@ -84,7 +84,7 @@ class ConnectionTest : EndToEndTest() {
clickLocationCell(DEFAULT_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
var relayIpAddress: String? = null
@@ -121,7 +121,7 @@ class ConnectionTest : EndToEndTest() {
clickLocationCell(DEFAULT_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
var relayIpAddress: String? = null
@@ -173,7 +173,7 @@ class ConnectionTest : EndToEndTest() {
clickLocationCell(DEFAULT_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
var relayIpAddress: String? = null
@@ -222,7 +222,7 @@ class ConnectionTest : EndToEndTest() {
on<ConnectPage> { clickConnect() }
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
// Ensure it is not possible to connect to relay
on<ConnectPage> {
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 0ccc42e80b..3d5eb70cfa 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
@@ -3,11 +3,11 @@ package net.mullvad.mullvadvpn.test.e2e
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.delay
import kotlinx.coroutines.test.runTest
+import net.mullvad.mullvadvpn.test.common.extension.acceptVpnPermissionDialog
import net.mullvad.mullvadvpn.test.common.misc.Attachment
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.VpnSettingsPage
import net.mullvad.mullvadvpn.test.common.page.WireGuardCustomPortDialog
import net.mullvad.mullvadvpn.test.common.page.disableObfuscationStory
@@ -78,7 +78,7 @@ class LeakTest : EndToEndTest() {
clickLocationCell(DEFAULT_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
on<ConnectPage> { waitForConnectedLabel() }
@@ -126,7 +126,7 @@ class LeakTest : EndToEndTest() {
clickLocationCell(DEFAULT_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
on<ConnectPage> { waitForConnectedLabel() }
@@ -183,7 +183,7 @@ class LeakTest : EndToEndTest() {
clickLocationCell(DAITA_COMPATIBLE_RELAY)
}
- on<SystemVpnConfigurationAlert> { clickOk() }
+ device.acceptVpnPermissionDialog()
on<ConnectPage> { waitForConnectedLabel() }