diff options
| author | Albin <albin@mullvad.net> | 2022-11-23 19:57:01 +0100 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2023-01-10 15:32:29 +0100 |
| commit | 6e09d1941569d5138b961bb7d2d56526663ef1c8 (patch) | |
| tree | 3eea5fa1a5bb9018bdc031562aaa001319a8ea44 /android/test/e2e/src | |
| parent | 0b55897e8a53bcc126d1954f99639d482a3b623e (diff) | |
| download | mullvadvpn-6e09d1941569d5138b961bb7d2d56526663ef1c8.tar.xz mullvadvpn-6e09d1941569d5138b961bb7d2d56526663ef1c8.zip | |
Move common test logic to :test:common
Diffstat (limited to 'android/test/e2e/src')
14 files changed, 21 insertions, 203 deletions
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 feabbc5335..0da55954fb 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 @@ -2,7 +2,7 @@ package net.mullvad.mullvadvpn.test.e2e import androidx.test.uiautomator.By import junit.framework.Assert.assertEquals -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.e2e.interactor.WebViewInteractor import net.mullvad.mullvadvpn.test.e2e.misc.CleanupAccountTestRule import org.junit.Rule @@ -17,7 +17,7 @@ class ConnectionTest : EndToEndTest() { @Test fun testConnectAndVerifyWithConnectionCheck() { // Given - app.launchAndEnsureLoggedIn() + app.launchAndEnsureLoggedIn(validTestAccountToken) // When device.findObjectWithTimeout(By.text("Secure my connection")).click() 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 8adf065663..35ba3fbe46 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 @@ -4,12 +4,13 @@ import android.content.Context import androidx.test.platform.app.InstrumentationRegistry import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.UiDevice +import net.mullvad.mullvadvpn.test.common.interactor.AppInteractor +import net.mullvad.mullvadvpn.test.common.rule.CaptureScreenshotOnFailedTestRule import net.mullvad.mullvadvpn.test.e2e.constant.INVALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY +import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG import net.mullvad.mullvadvpn.test.e2e.constant.VALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY import net.mullvad.mullvadvpn.test.e2e.extension.getRequiredArgument -import net.mullvad.mullvadvpn.test.e2e.interactor.AppInteractor import net.mullvad.mullvadvpn.test.e2e.interactor.WebViewInteractor -import net.mullvad.mullvadvpn.test.e2e.misc.CaptureScreenshotOnFailedTestRule import org.junit.Before import org.junit.Rule import org.junit.runner.RunWith @@ -19,7 +20,7 @@ abstract class EndToEndTest { @Rule @JvmField - val rule = CaptureScreenshotOnFailedTestRule() + val rule = CaptureScreenshotOnFailedTestRule(LOG_TAG) lateinit var device: UiDevice lateinit var targetContext: Context @@ -40,9 +41,7 @@ abstract class EndToEndTest { app = AppInteractor( device, - targetContext, - validTestAccountToken, - invalidTestAccountToken + targetContext ) web = WebViewInteractor( diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt index d16795e5dd..e8fe5b3c7e 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/LoginTest.kt @@ -3,8 +3,8 @@ package net.mullvad.mullvadvpn.test.e2e import androidx.test.runner.AndroidJUnit4 import androidx.test.uiautomator.By import junit.framework.Assert.assertNotNull -import net.mullvad.mullvadvpn.test.e2e.constant.LOGIN_FAILURE_TIMEOUT -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.common.constant.LOGIN_FAILURE_TIMEOUT +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import net.mullvad.mullvadvpn.test.e2e.misc.CleanupAccountTestRule import org.junit.Rule import org.junit.Test @@ -45,7 +45,7 @@ class LoginTest : EndToEndTest() { @Test fun testLogout() { // Given - app.launchAndEnsureLoggedIn() + app.launchAndEnsureLoggedIn(validTestAccountToken) // When app.clickSettingsCog() 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 a6a04bf094..8ab05520de 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,7 +1,7 @@ package net.mullvad.mullvadvpn.test.e2e import androidx.test.uiautomator.By -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout import org.junit.Test class WebLinkTest : EndToEndTest() { diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ConnCheckConstants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ConnCheckConstants.kt new file mode 100644 index 0000000000..825b6a20c7 --- /dev/null +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ConnCheckConstants.kt @@ -0,0 +1,5 @@ +package net.mullvad.mullvadvpn.test.e2e.constant + +const val CONN_CHECK_URL = "https://mullvad.net/en/check/" +const val CONN_CHECK_IS_CONNECTED = "Using Mullvad VPN" +const val CONN_CHECK_IS_NOT_CONNECTED = "Not using Mullvad VPN" diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt index 23f29fca3c..98fd52a333 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/Constants.kt @@ -1,6 +1,5 @@ package net.mullvad.mullvadvpn.test.e2e.constant const val LOG_TAG = "mullvad-e2e" -const val CONN_CHECK_URL = "https://mullvad.net/en/check/" const val VALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY = "valid_test_account_token" const val INVALID_TEST_ACCOUNT_TOKEN_ARGUMENT_KEY = "invalid_test_account_token" diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/PackageConstants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/PackageConstants.kt deleted file mode 100644 index 5476c37687..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/PackageConstants.kt +++ /dev/null @@ -1,3 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.constant - -const val MULLVAD_PACKAGE = "net.mullvad.mullvadvpn" diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ResourceConstants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ResourceConstants.kt deleted file mode 100644 index 7b27a581ad..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/ResourceConstants.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.constant - -const val SETTINGS_COG_ID = "net.mullvad.mullvadvpn:id/settings" -const val TUNNEL_INFO_ID = "net.mullvad.mullvadvpn:id/tunnel_info" -const val TUNNEL_OUT_ADDRESS_ID = "net.mullvad.mullvadvpn:id/out_address" diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/TimeoutConstants.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/TimeoutConstants.kt deleted file mode 100644 index 6599a26bcd..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/constant/TimeoutConstants.kt +++ /dev/null @@ -1,7 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.constant - -const val APP_LAUNCH_TIMEOUT = 5000L -const val CONNECTION_TIMEOUT = 30000L -const val DEFAULT_INTERACTION_TIMEOUT = 3000L -const val LOGIN_TIMEOUT = 30000L -const val LOGIN_FAILURE_TIMEOUT = 60000L diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/extension/UiAutomatorExtensions.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/extension/UiAutomatorExtensions.kt deleted file mode 100644 index 5d96f4cc45..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/extension/UiAutomatorExtensions.kt +++ /dev/null @@ -1,55 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.extension - -import androidx.test.uiautomator.By -import androidx.test.uiautomator.BySelector -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.e2e.constant.DEFAULT_INTERACTION_TIMEOUT - -fun UiDevice.findObjectByCaseInsensitiveText(text: String): UiObject2 { - return findObjectWithTimeout(By.text(Pattern.compile(text, Pattern.CASE_INSENSITIVE))) -} - -fun UiObject2.findObjectByCaseInsensitiveText(text: String): UiObject2 { - return findObjectWithTimeout(By.text(Pattern.compile(text, Pattern.CASE_INSENSITIVE))) -} - -fun UiDevice.findObjectWithTimeout( - selector: BySelector, - timeout: Long = DEFAULT_INTERACTION_TIMEOUT -): UiObject2 { - - wait( - Until.hasObject(selector), - timeout - ) - - return try { - findObject(selector) - } catch (e: NullPointerException) { - throw IllegalArgumentException( - "No matches for selector within timeout ($timeout): $selector" - ) - } -} - -fun UiObject2.findObjectWithTimeout( - selector: BySelector, - timeout: Long = DEFAULT_INTERACTION_TIMEOUT -): UiObject2 { - - wait( - Until.hasObject(selector), - timeout - ) - - return try { - findObject(selector) - } catch (e: NullPointerException) { - throw IllegalArgumentException( - "No matches for selector within timeout ($timeout): $selector" - ) - } -} diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/AppInteractor.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/AppInteractor.kt deleted file mode 100644 index a6739b91e5..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/AppInteractor.kt +++ /dev/null @@ -1,83 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.interactor - -import android.content.Context -import android.content.Intent -import android.widget.ImageButton -import androidx.test.uiautomator.By -import androidx.test.uiautomator.UiDevice -import androidx.test.uiautomator.Until -import net.mullvad.mullvadvpn.test.e2e.constant.APP_LAUNCH_TIMEOUT -import net.mullvad.mullvadvpn.test.e2e.constant.CONNECTION_TIMEOUT -import net.mullvad.mullvadvpn.test.e2e.constant.LOGIN_TIMEOUT -import net.mullvad.mullvadvpn.test.e2e.constant.MULLVAD_PACKAGE -import net.mullvad.mullvadvpn.test.e2e.constant.SETTINGS_COG_ID -import net.mullvad.mullvadvpn.test.e2e.constant.TUNNEL_INFO_ID -import net.mullvad.mullvadvpn.test.e2e.constant.TUNNEL_OUT_ADDRESS_ID -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectWithTimeout - -class AppInteractor( - private val device: UiDevice, - private val targetContext: Context, - private val validTestAccountToken: String, - private val invalidTestAccountToken: String -) { - fun launch() { - device.pressHome() - // Wait for launcher - device.wait( - Until.hasObject(By.pkg(device.launcherPackageName).depth(0)), - APP_LAUNCH_TIMEOUT - ) - val intent = - targetContext.packageManager.getLaunchIntentForPackage(MULLVAD_PACKAGE)?.apply { - // Clear out any previous instances - addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK) - } - targetContext.startActivity(intent) - device.wait( - Until.hasObject(By.pkg(MULLVAD_PACKAGE).depth(0)), - APP_LAUNCH_TIMEOUT - ) - } - - fun launchAndEnsureLoggedIn(accountToken: String = validTestAccountToken) { - launch() - attemptLogin(accountToken) - ensureLoggedIn() - } - - fun attemptLogin(accountToken: String = validTestAccountToken) { - device.findObjectWithTimeout(By.text("Login")) - val loginObject = device.findObjectWithTimeout(By.clazz("android.widget.EditText")) - .apply { text = accountToken } - loginObject.parent.findObject(By.clazz(ImageButton::class.java)).click() - } - - fun ensureLoggedIn() { - device.findObjectWithTimeout(By.text("UNSECURED CONNECTION"), LOGIN_TIMEOUT) - } - - fun extractIpAddress(): String { - device.findObjectWithTimeout(By.res(TUNNEL_INFO_ID)).click() - return device.findObjectWithTimeout( - By.res(TUNNEL_OUT_ADDRESS_ID), - CONNECTION_TIMEOUT - ).text.extractIpAddress() - } - - fun clickSettingsCog() { - device.findObjectWithTimeout(By.res(SETTINGS_COG_ID)).click() - } - - fun clickListItemByText(text: String) { - device.findObjectWithTimeout(By.text(text)).click() - } - - fun clickActionButtonByText(text: String) { - device.findObjectWithTimeout(By.text(text)).click() - } - - private fun String.extractIpAddress(): String { - return split(" ")[1].split(" ")[0] - } -} diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/SystemSettingsInteractor.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/SystemSettingsInteractor.kt index bbe941d488..9e5f0aa665 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/SystemSettingsInteractor.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/SystemSettingsInteractor.kt @@ -5,7 +5,7 @@ import android.content.Context import android.content.Intent import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectByCaseInsensitiveText +import net.mullvad.mullvadvpn.test.common.extension.findObjectByCaseInsensitiveText class SystemSettingsInteractor( private val uiDevice: UiDevice, diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/WebViewInteractor.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/WebViewInteractor.kt index fd809b13dd..f244aed5e7 100644 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/WebViewInteractor.kt +++ b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/interactor/WebViewInteractor.kt @@ -7,11 +7,10 @@ import android.webkit.WebView import androidx.test.uiautomator.By import androidx.test.uiautomator.UiDevice import net.mullvad.mullvadvpn.TestActivity -import net.mullvad.mullvadvpn.test.e2e.constant.CONNECTION_CHECK_IS_CONNECTED +import net.mullvad.mullvadvpn.test.common.extension.findObjectByCaseInsensitiveText +import net.mullvad.mullvadvpn.test.common.extension.findObjectWithTimeout +import net.mullvad.mullvadvpn.test.e2e.constant.CONN_CHECK_IS_CONNECTED import net.mullvad.mullvadvpn.test.e2e.constant.CONN_CHECK_URL -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectByCaseInsensitiveText -import net.mullvad.mullvadvpn.test.e2e.extension.findObjectWithTimeout - class WebViewInteractor( private val context: Context, private val device: UiDevice @@ -37,7 +36,7 @@ class WebViewInteractor( val wireGuardIpv4ConnectionRow = webView.findObjects(By.clazz(View::class.java)) .first { it.text?.endsWith("(WireGuard)") == true } val wireGuardIpv4Address = wireGuardIpv4ConnectionRow.text.split(" ")[0].trim() - return ConnCheckState(stateText.text == CONNECTION_CHECK_IS_CONNECTED, wireGuardIpv4Address) + return ConnCheckState(stateText.text == CONN_CHECK_IS_CONNECTED, wireGuardIpv4Address) } data class ConnCheckState( diff --git a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CaptureScreenshotOnFailedTestRule.kt b/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CaptureScreenshotOnFailedTestRule.kt deleted file mode 100644 index 5be65f7ec8..0000000000 --- a/android/test/e2e/src/main/kotlin/net/mullvad/mullvadvpn/test/e2e/misc/CaptureScreenshotOnFailedTestRule.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.mullvad.mullvadvpn.test.e2e.misc - -import android.util.Log -import androidx.test.runner.screenshot.BasicScreenCaptureProcessor -import androidx.test.runner.screenshot.ScreenCaptureProcessor -import androidx.test.runner.screenshot.Screenshot -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter -import net.mullvad.mullvadvpn.test.e2e.constant.LOG_TAG -import org.junit.rules.TestWatcher -import org.junit.runner.Description - -class CaptureScreenshotOnFailedTestRule : TestWatcher() { - override fun failed(e: Throwable?, description: Description?) { - Log.d(LOG_TAG, "Capturing screenshot of failed test: " + description?.methodName) - val timestamp = DateTimeFormatter.ISO_DATE_TIME.format(LocalDateTime.now()).replace(":", "") - val screenshotName = "$timestamp-${description?.methodName}" - captureScreenshot(screenshotName) - } - - private fun captureScreenshot(screenShotName: String) { - try { - val screenCapture = Screenshot.capture().apply { name = screenShotName } - val processorSet: MutableSet<ScreenCaptureProcessor> = HashSet() - processorSet.add(BasicScreenCaptureProcessor()) - screenCapture.process(processorSet) - } catch (ex: Exception) { - Log.d(LOG_TAG, "Error capturing screenshot: " + ex.message) - } - } -} |
