diff options
Diffstat (limited to 'android/test/common')
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" |
