summaryrefslogtreecommitdiffhomepage
path: root/android
diff options
context:
space:
mode:
authorAlbin <albin@mullvad.net>2022-03-07 10:43:01 +0100
committerAlbin <albin@mullvad.net>2022-04-20 17:09:16 +0200
commit83059632cb2998ec71aff242897dea947ae05fb7 (patch)
tree3b2b98d43c3e1aa5f8d116860ed020ec6d30c5cf /android
parent24f8b8dd5fb827f71b0ae6bb087bc3c6e56ee120 (diff)
downloadmullvadvpn-83059632cb2998ec71aff242897dea947ae05fb7.tar.xz
mullvadvpn-83059632cb2998ec71aff242897dea947ae05fb7.zip
Add Android e2e screenshot rule
This rule will capture screenshot of any failed test and download it to the host executing the test.
Diffstat (limited to 'android')
-rw-r--r--android/buildSrc/src/main/kotlin/Dependencies.kt2
-rw-r--r--android/e2e/build.gradle.kts34
-rw-r--r--android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/EndToEndTest.kt6
-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/misc/CaptureScreenshotOnFailedTestRule.kt31
5 files changed, 76 insertions, 0 deletions
diff --git a/android/buildSrc/src/main/kotlin/Dependencies.kt b/android/buildSrc/src/main/kotlin/Dependencies.kt
index 97ff89bab8..9e9cfefbfb 100644
--- a/android/buildSrc/src/main/kotlin/Dependencies.kt
+++ b/android/buildSrc/src/main/kotlin/Dependencies.kt
@@ -31,6 +31,8 @@ object Dependencies {
"androidx.test:core:${Versions.AndroidX.test}"
const val testRunner =
"androidx.test:runner:${Versions.AndroidX.test}"
+ const val testRules =
+ "androidx.test:rules:${Versions.AndroidX.test}"
const val testUiAutomator =
"androidx.test.uiautomator:uiautomator:${Versions.AndroidX.uiautomator}"
const val testOrchestrator =
diff --git a/android/e2e/build.gradle.kts b/android/e2e/build.gradle.kts
index 655855c1f4..b938203f20 100644
--- a/android/e2e/build.gradle.kts
+++ b/android/e2e/build.gradle.kts
@@ -25,10 +25,44 @@ android {
targetProjectPath = ":app"
}
+val localScreenshotPath = "$buildDir/reports/androidTests/connected/screenshots"
+val deviceScreenshotPath = "/sdcard/Pictures/Screenshots"
+
+tasks.register("createDeviceScreenshotDir", Exec::class) {
+ executable = android.adbExecutable.toString()
+ args = listOf("shell", "mkdir", "-p", deviceScreenshotPath)
+}
+
+tasks.register("createLocalScreenshotDir", Exec::class) {
+ executable = "mkdir"
+ args = listOf("-p", localScreenshotPath)
+}
+
+tasks.register("clearDeviceScreenshots", Exec::class) {
+ executable = android.adbExecutable.toString()
+ args = listOf("shell", "rm", "-r", deviceScreenshotPath)
+}
+
+tasks.register("fetchScreenshots", Exec::class) {
+ executable = android.adbExecutable.toString()
+ args = listOf("pull", "$deviceScreenshotPath/.", localScreenshotPath)
+
+ dependsOn(tasks.getByName("createLocalScreenshotDir"))
+ finalizedBy(tasks.getByName("clearDeviceScreenshots"))
+}
+
+tasks.whenTaskAdded {
+ if (name == "connectedDebugAndroidTest") {
+ dependsOn(tasks.getByName("createDeviceScreenshotDir"))
+ finalizedBy(tasks.getByName("fetchScreenshots"))
+ }
+}
+
dependencies {
implementation(Dependencies.AndroidX.testCore)
implementation(Dependencies.AndroidX.testOrchestrator)
implementation(Dependencies.AndroidX.testRunner)
+ implementation(Dependencies.AndroidX.testRules)
implementation(Dependencies.AndroidX.testUiAutomator)
implementation(Dependencies.Kotlin.stdlib)
}
diff --git a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/EndToEndTest.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/EndToEndTest.kt
index 81a496c4f2..0ff6e0b1ae 100644
--- a/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/EndToEndTest.kt
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/EndToEndTest.kt
@@ -5,12 +5,18 @@ import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.runner.AndroidJUnit4
import androidx.test.uiautomator.UiDevice
import net.mullvad.mullvadvpn.e2e.interactor.AppInteractor
+import net.mullvad.mullvadvpn.e2e.misc.CaptureScreenshotOnFailedTestRule
import org.junit.Before
+import org.junit.Rule
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
abstract class EndToEndTest {
+ @Rule
+ @JvmField
+ val rule = CaptureScreenshotOnFailedTestRule()
+
lateinit var device: UiDevice
lateinit var targetContext: Context
lateinit var app: AppInteractor
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/misc/CaptureScreenshotOnFailedTestRule.kt b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/misc/CaptureScreenshotOnFailedTestRule.kt
new file mode 100644
index 0000000000..82c43c958b
--- /dev/null
+++ b/android/e2e/src/main/java/net/mullvad/mullvadvpn/e2e/misc/CaptureScreenshotOnFailedTestRule.kt
@@ -0,0 +1,31 @@
+package net.mullvad.mullvadvpn.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.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)
+ }
+ }
+}