summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-03-07 10:00:47 +0100
committerAlbin <albin@mullvad.net>2022-04-20 17:09:16 +0200
commitbb0db8f6caff2f8b66b35117f282e87aa222a65d (patch)
tree73750868dfc33f22d7dd73f26a9aa0cb81bd7d77 /android
parenta9f906b082f76410855f0b97e71f45ca60bfa727 (diff)
downloadmullvadvpn-bb0db8f6caff2f8b66b35117f282e87aa222a65d.tar.xz
mullvadvpn-bb0db8f6caff2f8b66b35117f282e87aa222a65d.zip
Add Android e2e test module
The purpose of this test module is to be able to trigger end-to-end tests separately from the main app module, mainly because of the flaky nature of end-to-end tests. Tests are easiest executed by running the following gradle command: ./gradlew :e2e:connectedDebugAndroidTest
Diffstat (limited to 'android')
-rw-r--r--android/buildSrc/src/main/kotlin/Dependencies.kt9
-rw-r--r--android/buildSrc/src/main/kotlin/Versions.kt2
-rw-r--r--android/e2e/build.gradle.kts34
-rw-r--r--android/e2e/src/main/AndroidManifest.xml6
-rw-r--r--android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/LaunchAppTest.kt37
-rw-r--r--android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/Constants.kt3
-rw-r--r--android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/PackageConstants.kt3
-rw-r--r--android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/TimeoutConstants.kt3
-rw-r--r--android/settings.gradle.kts1
9 files changed, 98 insertions, 0 deletions
diff --git a/android/buildSrc/src/main/kotlin/Dependencies.kt b/android/buildSrc/src/main/kotlin/Dependencies.kt
index e4d78ecd73..97ff89bab8 100644
--- a/android/buildSrc/src/main/kotlin/Dependencies.kt
+++ b/android/buildSrc/src/main/kotlin/Dependencies.kt
@@ -27,6 +27,14 @@ object Dependencies {
"androidx.test.espresso:espresso-core:${Versions.AndroidX.espresso}"
const val espressoContrib =
"androidx.test.espresso:espresso-contrib:${Versions.AndroidX.espresso}"
+ const val testCore =
+ "androidx.test:core:${Versions.AndroidX.test}"
+ const val testRunner =
+ "androidx.test:runner:${Versions.AndroidX.test}"
+ const val testUiAutomator =
+ "androidx.test.uiautomator:uiautomator:${Versions.AndroidX.uiautomator}"
+ const val testOrchestrator =
+ "androidx.test:orchestrator:${Versions.AndroidX.test}"
}
object Koin {
@@ -59,6 +67,7 @@ object Dependencies {
object Plugin {
const val android = "com.android.tools.build:gradle:${Versions.Plugin.android}"
const val androidApplicationId = "com.android.application"
+ const val androidTestId = "com.android.test"
const val playPublisher =
"com.github.triplet.gradle:play-publisher:${Versions.Plugin.playPublisher}"
const val playPublisherId = "com.github.triplet.play"
diff --git a/android/buildSrc/src/main/kotlin/Versions.kt b/android/buildSrc/src/main/kotlin/Versions.kt
index 8db39a305f..d5c3563202 100644
--- a/android/buildSrc/src/main/kotlin/Versions.kt
+++ b/android/buildSrc/src/main/kotlin/Versions.kt
@@ -27,6 +27,8 @@ object Versions {
const val fragment = "1.3.2"
const val recyclerview = "1.2.1"
const val junit = "1.1.3"
+ const val test = "1.4.0"
+ const val uiautomator = "2.2.0"
}
object Plugin {
diff --git a/android/e2e/build.gradle.kts b/android/e2e/build.gradle.kts
new file mode 100644
index 0000000000..655855c1f4
--- /dev/null
+++ b/android/e2e/build.gradle.kts
@@ -0,0 +1,34 @@
+plugins {
+ id(Dependencies.Plugin.androidTestId)
+ id(Dependencies.Plugin.kotlinAndroidId)
+}
+
+android {
+ compileSdkVersion(Versions.Android.compileSdkVersion)
+
+ defaultConfig {
+ minSdkVersion(Versions.Android.minSdkVersion)
+ targetSdkVersion(Versions.Android.targetSdkVersion)
+ testApplicationId = "net.mullvad.mullvadvpn.e2e"
+ testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ testOptions {
+ execution = "ANDROIDX_TEST_ORCHESTRATOR"
+ }
+
+ compileOptions {
+ sourceCompatibility = JavaVersion.VERSION_1_8
+ targetCompatibility = JavaVersion.VERSION_1_8
+ }
+
+ targetProjectPath = ":app"
+}
+
+dependencies {
+ implementation(Dependencies.AndroidX.testCore)
+ implementation(Dependencies.AndroidX.testOrchestrator)
+ implementation(Dependencies.AndroidX.testRunner)
+ implementation(Dependencies.AndroidX.testUiAutomator)
+ implementation(Dependencies.Kotlin.stdlib)
+}
diff --git a/android/e2e/src/main/AndroidManifest.xml b/android/e2e/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..50c48f741b
--- /dev/null
+++ b/android/e2e/src/main/AndroidManifest.xml
@@ -0,0 +1,6 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="net.mullvad.mullvadvpn.e2e">
+ <uses-permission android:name="android.permission.INTERNET" />
+ <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
+ android:targetPackage="net.mullvad.mullvadvpn" />
+</manifest>
diff --git a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/LaunchAppTest.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/LaunchAppTest.kt
new file mode 100644
index 0000000000..5d19716ff5
--- /dev/null
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/LaunchAppTest.kt
@@ -0,0 +1,37 @@
+package net.mullvad.mullvadvpn.e2e
+
+import android.content.Intent
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.runner.AndroidJUnit4
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.test.uiautomator.Until
+import net.mullvad.mullvadvpn.e2e.constant.APP_LAUNCH_TIMEOUT
+import net.mullvad.mullvadvpn.e2e.constant.MULLVAD_PACKAGE
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class LaunchAppTest {
+ @Test
+ fun testLaunchApp() {
+ val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
+ val targetContext = InstrumentationRegistry.getInstrumentation().targetContext
+ 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
+ )
+ }
+}
diff --git a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/Constants.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/Constants.kt
new file mode 100644
index 0000000000..44b8029799
--- /dev/null
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/Constants.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.e2e.constant
+
+const val LOG_TAG = "mullvad-e2e"
diff --git a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/PackageConstants.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/PackageConstants.kt
new file mode 100644
index 0000000000..47aeaa0237
--- /dev/null
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/PackageConstants.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.e2e.constant
+
+const val MULLVAD_PACKAGE = "net.mullvad.mullvadvpn"
diff --git a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/TimeoutConstants.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/TimeoutConstants.kt
new file mode 100644
index 0000000000..6ede2d3048
--- /dev/null
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/constant/TimeoutConstants.kt
@@ -0,0 +1,3 @@
+package net.mullvad.mullvadvpn.e2e.constant
+
+const val APP_LAUNCH_TIMEOUT = 5000L
diff --git a/android/settings.gradle.kts b/android/settings.gradle.kts
index 15a801b10a..cc8e04d837 100644
--- a/android/settings.gradle.kts
+++ b/android/settings.gradle.kts
@@ -1 +1,2 @@
include(":app")
+include(":e2e")