diff options
| author | Albin <albin@mullvad.net> | 2022-03-07 10:43:01 +0100 |
|---|---|---|
| committer | Albin <albin@mullvad.net> | 2022-04-20 17:09:16 +0200 |
| commit | 83059632cb2998ec71aff242897dea947ae05fb7 (patch) | |
| tree | 3b2b98d43c3e1aa5f8d116860ed020ec6d30c5cf /android | |
| parent | 24f8b8dd5fb827f71b0ae6bb087bc3c6e56ee120 (diff) | |
| download | mullvadvpn-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')
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) + } + } +} |
