summaryrefslogtreecommitdiffhomepage
path: root/android/test/common
diff options
context:
space:
mode:
Diffstat (limited to 'android/test/common')
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/extension/UiAutomatorExtensions.kt3
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt45
2 files changed, 37 insertions, 11 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 143f4355d3..ff17a9f497 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
@@ -17,6 +17,9 @@ fun UiObject2.findObjectByCaseInsensitiveText(text: String): UiObject2 {
return findObjectWithTimeout(By.text(Pattern.compile(text, Pattern.CASE_INSENSITIVE)))
}
+fun UiDevice.hasObjectWithTimeout(selector: BySelector, timeout: Long = DEFAULT_TIMEOUT): Boolean =
+ wait(Until.hasObject(selector), timeout)
+
fun UiDevice.findObjectWithTimeout(
selector: BySelector,
timeout: Long = DEFAULT_TIMEOUT,
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt
index eea44a7b98..c96718da61 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/rule/ForgetAllVpnAppsInSettingsTestRule.kt
@@ -5,11 +5,16 @@ import android.provider.Settings
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.UiObject2
+import androidx.test.uiautomator.Until
import java.util.regex.Pattern
+import net.mullvad.mullvadvpn.test.common.constant.DEFAULT_TIMEOUT
import net.mullvad.mullvadvpn.test.common.extension.findObjectByCaseInsensitiveText
import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+import net.mullvad.mullvadvpn.test.common.extension.hasObjectWithTimeout
import org.junit.jupiter.api.extension.BeforeTestExecutionCallback
import org.junit.jupiter.api.extension.ExtensionContext
+import org.junit.jupiter.api.fail
class ForgetAllVpnAppsInSettingsTestRule : BeforeTestExecutionCallback {
override fun beforeTestExecution(context: ExtensionContext) {
@@ -20,22 +25,40 @@ class ForgetAllVpnAppsInSettingsTestRule : BeforeTestExecutionCallback {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
)
- val vpnSettingsButtons =
- device.findObjects(By.res(SETTINGS_PACKAGE, VPN_SETTINGS_BUTTON_ID))
- vpnSettingsButtons.forEach { button ->
- button.click()
- try {
- device.findObjectWithTimeout(By.text(FORGET_VPN_VPN_BUTTON_TEXT)).click()
- device.findObjectByCaseInsensitiveText(FORGET_VPN_VPN_CONFIRM_BUTTON_TEXT).click()
- } catch (_: Exception) {
- device.findObjectWithTimeout(By.text(DELETE_VPN_PROFILE_TEXT)).click()
- device.findObjectWithTimeout(By.text(DELETE_VPN_CONFIRM_BUTTON_TEXT_REGEXP)).click()
+ val vpnSettingsSelector = By.res(SETTINGS_PACKAGE, VPN_SETTINGS_BUTTON_ID)
+ device.wait(Until.hasObject(vpnSettingsSelector), DEFAULT_TIMEOUT)
+ val vpnSettingsButtons = device.findObjects(vpnSettingsSelector)
+
+ vpnSettingsButtons
+ .filter { !it.isHardcodedVpn() }
+ .forEach { button ->
+ button.click()
+
+ if (device.hasObjectWithTimeout(By.text(FORGET_VPN_VPN_BUTTON_TEXT))) {
+ device.findObjectWithTimeout(By.text(FORGET_VPN_VPN_BUTTON_TEXT)).click()
+ device
+ .findObjectByCaseInsensitiveText(FORGET_VPN_VPN_CONFIRM_BUTTON_TEXT)
+ .click()
+ } else if (device.hasObjectWithTimeout(By.text(DELETE_VPN_PROFILE_TEXT))) {
+ device.findObjectWithTimeout(By.text(DELETE_VPN_PROFILE_TEXT)).click()
+ device
+ .findObjectWithTimeout(By.text(DELETE_VPN_CONFIRM_BUTTON_TEXT_REGEXP))
+ .click()
+ } else {
+ fail("Unable to find forget or delete button")
+ }
}
- }
}
+ private fun UiObject2.isHardcodedVpn(): Boolean =
+ parent.parent.children.any { uiObject ->
+ HARDCODED_VPN_PROFILE_NAMES.any { uiObject.hasObject(By.text(it)) }
+ }
+
companion object {
+ private val HARDCODED_VPN_PROFILE_NAMES = listOf("VPN by Google")
+
private const val FORGET_VPN_VPN_BUTTON_TEXT = "Forget VPN"
private const val DELETE_VPN_PROFILE_TEXT = "Delete VPN profile"
private const val FORGET_VPN_VPN_CONFIRM_BUTTON_TEXT = "Forget"