summaryrefslogtreecommitdiffhomepage
path: root/android/test/common
diff options
context:
space:
mode:
authorNiklas Berglund <niklas.berglund@gmail.com>2024-12-04 16:26:03 +0100
committerNiklas Berglund <niklas.berglund@gmail.com>2024-12-06 11:26:02 +0100
commit3fe26159aebec37b6c147fc6418b35e29da23f61 (patch)
tree87e6d5218e853a5ed192f8bbe5aab7e8c6bd53a1 /android/test/common
parent4baba02936cffc9ca056bb6dc7b5e1db6d05ac41 (diff)
downloadmullvadvpn-3fe26159aebec37b6c147fc6418b35e29da23f61.tar.xz
mullvadvpn-3fe26159aebec37b6c147fc6418b35e29da23f61.zip
Migrate ConnectionTest e2e tests to use POP
Diffstat (limited to 'android/test/common')
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt71
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt7
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt14
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt25
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt20
-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/TopBar.kt24
-rw-r--r--android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt56
8 files changed, 224 insertions, 9 deletions
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt
index fe1fafcc7f..320c01d7aa 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/ConnectPage.kt
@@ -1,10 +1,79 @@
package net.mullvad.mullvadvpn.test.common.page
import androidx.test.uiautomator.By
+import net.mullvad.mullvadvpn.test.common.constant.VERY_LONG_TIMEOUT
import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
class ConnectPage internal constructor() : Page() {
+ private val disconnectSelector = By.text("Disconnect")
+ private val cancelSelector = By.text("Cancel")
+ private val connectedSelector = By.text("CONNECTED")
+ private val connectingSelector = By.text("CONNECTING...")
+
override fun assertIsDisplayed() {
- uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag"))
+ uiDevice.findObjectWithTimeout(By.res(CONNECT_CARD_HEADER_TEST_TAG))
+ }
+
+ fun clickSelectLocation() {
+ uiDevice.findObjectWithTimeout(By.res(SELECT_LOCATION_BUTTON_TEST_TAG)).click()
+ }
+
+ fun clickConnect() {
+ uiDevice.findObjectWithTimeout(By.res(CONNECT_BUTTON_TEST_TAG)).click()
+ }
+
+ fun clickDisconnect() {
+ uiDevice.findObjectWithTimeout(disconnectSelector).click()
+ }
+
+ fun clickCancel() {
+ uiDevice.findObjectWithTimeout(cancelSelector).click()
+ }
+
+ fun waitForConnectedLabel(timeout: Long = VERY_LONG_TIMEOUT) {
+ uiDevice.findObjectWithTimeout(connectedSelector, timeout)
+ }
+
+ fun waitForConnectingLabel() {
+ uiDevice.findObjectWithTimeout(connectingSelector)
+ }
+
+ /**
+ * Extracts the in IPv4 address from the connection card. It is a prerequisite that the
+ * connection card is in collapsed state.
+ */
+ fun extractInIpv4Address(): String {
+ uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag")).click()
+ val inString =
+ uiDevice
+ .findObjectWithTimeout(
+ By.res("location_info_connection_in_test_tag"),
+ VERY_LONG_TIMEOUT,
+ )
+ .text
+
+ val extractedIpAddress = inString.split(" ")[0].split(":")[0]
+ return extractedIpAddress
+ }
+
+ /**
+ * Extracts the out IPv4 address from the connection card. It is a prerequisite that the
+ * connection card is in collapsed state.
+ */
+ fun extractOutIpv4Address(): String {
+ uiDevice.findObjectWithTimeout(By.res("connect_card_header_test_tag")).click()
+ return uiDevice
+ .findObjectWithTimeout(
+ // Text exist and contains IP address
+ By.res("location_info_connection_out_test_tag").textContains("."),
+ VERY_LONG_TIMEOUT,
+ )
+ .text
+ }
+
+ companion object {
+ const val CONNECT_CARD_HEADER_TEST_TAG = "connect_card_header_test_tag"
+ const val SELECT_LOCATION_BUTTON_TEST_TAG = "select_location_button_test_tag"
+ const val CONNECT_BUTTON_TEST_TAG = "connect_button_test_tag"
}
}
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt
index 9fdffe1eae..1098e4d1cc 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/LoginPage.kt
@@ -8,6 +8,9 @@ import net.mullvad.mullvadvpn.test.common.constant.EXTREMELY_LONG_TIMEOUT
import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
class LoginPage internal constructor() : Page() {
+ private val invalidAccountNumberSelector = By.text("Invalid account number")
+ private val loginSelector = By.text("Login")
+
fun enterAccountNumber(accountNumber: String) {
uiDevice.findObjectWithTimeout(By.clazz("android.widget.EditText")).text = accountNumber
}
@@ -20,10 +23,10 @@ class LoginPage internal constructor() : Page() {
}
fun verifyShowingInvalidAccount() {
- uiDevice.findObjectWithTimeout(By.text("Invalid account number"), EXTREMELY_LONG_TIMEOUT)
+ uiDevice.findObjectWithTimeout(invalidAccountNumberSelector, EXTREMELY_LONG_TIMEOUT)
}
override fun assertIsDisplayed() {
- uiDevice.findObjectWithTimeout(By.text("Login"))
+ uiDevice.findObjectWithTimeout(loginSelector)
}
}
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt
index 43ec183c50..f5ca662113 100644
--- a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/PrivacyPage.kt
@@ -7,12 +7,16 @@ import net.mullvad.mullvadvpn.test.common.constant.DEFAULT_TIMEOUT
import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
class PrivacyPage internal constructor() : Page() {
+ private val privacySelector = By.text("Privacy")
+ private val agreeSelector = By.text("Agree and continue")
+ private val allowSelector = By.text("Allow")
+
override fun assertIsDisplayed() {
- uiDevice.findObjectWithTimeout(By.text("Privacy"))
+ uiDevice.findObjectWithTimeout(privacySelector)
}
fun clickAgreeOnPrivacyDisclaimer() {
- uiDevice.findObjectWithTimeout(By.text("Agree and continue")).click()
+ uiDevice.findObjectWithTimeout(agreeSelector).click()
}
fun clickAllowOnNotificationPermissionPromptIfApiLevel33AndAbove(
@@ -23,12 +27,10 @@ class PrivacyPage internal constructor() : Page() {
return
}
- val selector = By.text("Allow")
-
- uiDevice.wait(Until.hasObject(selector), timeout)
+ uiDevice.wait(Until.hasObject(allowSelector), timeout)
try {
- uiDevice.findObjectWithTimeout(selector).click()
+ uiDevice.findObjectWithTimeout(allowSelector).click()
} catch (e: IllegalArgumentException) {
throw IllegalArgumentException(
"Failed to allow notification permission within timeout ($timeout)"
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt
new file mode 100644
index 0000000000..e10a53ec4d
--- /dev/null
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SelectLocationPage.kt
@@ -0,0 +1,25 @@
+package net.mullvad.mullvadvpn.test.common.page
+
+import androidx.test.uiautomator.By
+import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+
+class SelectLocationPage internal constructor() : Page() {
+ override fun assertIsDisplayed() {
+ uiDevice.findObjectWithTimeout(By.res(SELECT_LOCATION_SCREEN_TEST_TAG))
+ }
+
+ fun clickLocationExpandButton(locationName: String) {
+ val locationCell = uiDevice.findObjectWithTimeout(By.text(locationName)).parent.parent
+ val expandButton = locationCell.findObjectWithTimeout(By.res(EXPAND_BUTTON_TEST_TAG))
+ expandButton.click()
+ }
+
+ fun clickLocationCell(locationName: String) {
+ uiDevice.findObjectWithTimeout(By.text(locationName)).click()
+ }
+
+ companion object {
+ const val SELECT_LOCATION_SCREEN_TEST_TAG = "select_location_screen_test_tag"
+ const val EXPAND_BUTTON_TEST_TAG = "expand_button_test_tag"
+ }
+}
diff --git a/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt
new file mode 100644
index 0000000000..86a317d153
--- /dev/null
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SettingsPage.kt
@@ -0,0 +1,20 @@
+package net.mullvad.mullvadvpn.test.common.page
+
+import androidx.test.uiautomator.By
+import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+
+class SettingsPage internal constructor() : Page() {
+ private val settingsSelector = By.text("Settings")
+
+ override fun assertIsDisplayed() {
+ uiDevice.findObjectWithTimeout(settingsSelector)
+ }
+
+ fun clickVpnSettings() {
+ uiDevice.findObjectWithTimeout(By.res(VPN_SETTINGS_CELL_TEST_TAG)).click()
+ }
+
+ companion object {
+ const val VPN_SETTINGS_CELL_TEST_TAG = "vpn_settings_cell_test_tag"
+ }
+}
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
new file mode 100644
index 0000000000..046d6e8197
--- /dev/null
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/SystemVpnConfigurationAlert.kt
@@ -0,0 +1,16 @@
+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/TopBar.kt b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TopBar.kt
new file mode 100644
index 0000000000..c602e26def
--- /dev/null
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/TopBar.kt
@@ -0,0 +1,24 @@
+package net.mullvad.mullvadvpn.test.common.page
+
+import androidx.test.uiautomator.By
+import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+
+class TopBar internal constructor() : Page() {
+ override fun assertIsDisplayed() {
+ uiDevice.findObjectWithTimeout(By.res(TOP_BAR_TEST_TAG))
+ }
+
+ fun clickSettings() {
+ uiDevice.findObjectWithTimeout(By.res(TOP_BAR_SETTINGS_BUTTON)).click()
+ }
+
+ fun clickAccount() {
+ uiDevice.findObjectWithTimeout(By.res(TOP_BAR_ACCOUNT_BUTTON)).click()
+ }
+
+ companion object {
+ const val TOP_BAR_TEST_TAG = "top_bar_test_tag"
+ const val TOP_BAR_ACCOUNT_BUTTON = "top_bar_account_button"
+ const val TOP_BAR_SETTINGS_BUTTON = "top_bar_settings_button"
+ }
+}
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
new file mode 100644
index 0000000000..698c84aa6b
--- /dev/null
+++ b/android/test/common/src/main/kotlin/net/mullvad/mullvadvpn/test/common/page/VpnSettingsPage.kt
@@ -0,0 +1,56 @@
+package net.mullvad.mullvadvpn.test.common.page
+
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.Direction
+import androidx.test.uiautomator.Until
+import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout
+
+class VpnSettingsPage internal constructor() : Page() {
+ private val vpnSettingsSelector = By.text("VPN settings")
+ private val localNetworkSharingSelector = By.text("Local network sharing")
+
+ override fun assertIsDisplayed() {
+ uiDevice.findObjectWithTimeout(vpnSettingsSelector)
+ }
+
+ fun clickLocalNetworkSharingSwitch() {
+ val localNetworkSharingCell =
+ uiDevice.findObjectWithTimeout(localNetworkSharingSelector).parent
+ val localNetworkSharingSwitch =
+ localNetworkSharingCell.findObjectWithTimeout(By.res(SWITCH_TEST_TAG))
+
+ localNetworkSharingSwitch.click()
+ }
+
+ fun scrollUntilWireguardObfuscationUdpOverTcpCell() {
+ scrollUntilCell(WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG)
+ }
+
+ fun scrollUntilWireguardObfuscationOffCell() {
+ scrollUntilCell(WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG)
+ }
+
+ fun clickWireguardObfuscationUdpOverTcpCell() {
+ uiDevice
+ .findObjectWithTimeout(By.res(WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG))
+ .click()
+ }
+
+ fun clickWireguardObfuscationOffCell() {
+ uiDevice.findObjectWithTimeout(By.res(WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG)).click()
+ }
+
+ private fun scrollUntilCell(testTag: String) {
+ val scrollView2 = uiDevice.findObjectWithTimeout(By.res(SETTINGS_SCROLL_VIEW_TEST_TAG))
+ scrollView2.scrollUntil(Direction.DOWN, Until.hasObject(By.res(testTag)))
+ }
+
+ companion object {
+ const val SETTINGS_SCROLL_VIEW_TEST_TAG = "lazy_list_vpn_settings_test_tag"
+ const val WIREGUARD_OBFUSCATION_UDP_OVER_TCP_CELL_TEST_TAG =
+ "wireguard_obfuscation_udp_over_tcp_cell_test_tag"
+ const val WIREGUARD_OBFUSCATION_OFF_CELL_TEST_TAG =
+ "wireguard_obfuscation_off_cell_test_tag"
+ const val SWITCH_TEST_TAG = "switch_test_tag"
+ }
+}