From 529466f86e9c646cc2e882a3fdecf018b4c103e2 Mon Sep 17 00:00:00 2001 From: Mohamed Metwalli <mohamed.metwalli@sap.com> Date: Mon, 4 Jan 2021 20:40:25 +0100 Subject: [PATCH] Support cleaning device status bar before taking screenshot --- ...ardingDeltaInteroperabilityFragmentTest.kt | 4 ++ .../ui/onboarding/OnboardingFragmentTest.kt | 4 ++ .../OnboardingNotificationsFragmentTest.kt | 4 ++ .../OnboardingPrivacyFragmentTest.kt | 4 ++ .../onboarding/OnboardingTestFragmentTest.kt | 4 ++ .../OnboardingTracingFragmentTest.kt | 4 ++ .../testhelpers/SystemUIDemoModeHelper.kt | 56 +++++++++++++++++++ .../java/testhelpers/SystemUIDemoModeRule.kt | 27 +++++++++ 8 files changed, 107 insertions(+) create mode 100644 Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt create mode 100644 Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt index 7c7e8aab2..7ea43ae38 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingDeltaInteroperabilityFragmentTest.kt @@ -19,6 +19,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.TestDispatcherProvider import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab @@ -33,6 +34,9 @@ class OnboardingDeltaInteroperabilityFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setup() { MockKAnnotations.init(this, relaxed = true) diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt index afbfe6575..15810f431 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingFragmentTest.kt @@ -18,6 +18,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab import tools.fastlane.screengrab.locale.LocaleTestRule @@ -29,6 +30,9 @@ class OnboardingFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setUp() { setupMockViewModel(object : OnboardingFragmentViewModel.Factory { diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt index 33eb47d75..36b9ab7b6 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingNotificationsFragmentTest.kt @@ -16,6 +16,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab import tools.fastlane.screengrab.locale.LocaleTestRule @@ -27,6 +28,9 @@ class OnboardingNotificationsFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setup() { setupMockViewModel(object : OnboardingNotificationsViewModel.Factory { diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt index aa3166ad0..31f7e4244 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingPrivacyFragmentTest.kt @@ -15,6 +15,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab import tools.fastlane.screengrab.locale.LocaleTestRule @@ -26,6 +27,9 @@ class OnboardingPrivacyFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setup() { setupMockViewModel(object : OnboardingPrivacyViewModel.Factory { diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt index 9cc641ea4..3c0a2631f 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTestFragmentTest.kt @@ -16,6 +16,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab import tools.fastlane.screengrab.locale.LocaleTestRule @@ -27,6 +28,9 @@ class OnboardingTestFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setup() { setupMockViewModel(object : OnboardingTestViewModel.Factory { diff --git a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt index 18877ff1e..fe0c93bf5 100644 --- a/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt +++ b/Corona-Warn-App/src/androidTest/java/de/rki/coronawarnapp/ui/onboarding/OnboardingTracingFragmentTest.kt @@ -24,6 +24,7 @@ import org.junit.Test import org.junit.runner.RunWith import testhelpers.BaseUITest import testhelpers.Screenshot +import testhelpers.SystemUIDemoModeRule import testhelpers.TestDispatcherProvider import testhelpers.launchFragmentInContainer2 import tools.fastlane.screengrab.Screengrab @@ -39,6 +40,9 @@ class OnboardingTracingFragmentTest : BaseUITest() { @JvmField val localeTestRule = LocaleTestRule() + @get:Rule + val systemUIDemoModeRule = SystemUIDemoModeRule() + @Before fun setup() { MockKAnnotations.init(this, relaxed = true) diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt new file mode 100644 index 000000000..d98a657ea --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeHelper.kt @@ -0,0 +1,56 @@ +package testhelpers + +import android.os.ParcelFileDescriptor +import androidx.test.platform.app.InstrumentationRegistry +import java.io.BufferedReader +import java.io.InputStreamReader + +/** + * System UI Demo Mode helper that uses instrumentation commands to clean device status bar. + * @see <a href="https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/docs/demo_mode.md" >Demo mode</a> + * @see <a href="https://developer.android.com/studio/debug/dev-options#general" >Dev options</a> + */ +class SystemUIDemoModeHelper { + + /** + * Allows System UI demo mode and configure how the status bar should look like + */ + fun enter() { + executeShellCommand("settings put global sysui_demo_allowed 1") + sendCommand("exit") + sendCommand("enter") + sendCommand("notifications", "visible" to "false") + sendCommand("network", "wifi" to "show", "level" to "4", "fully" to "true") + sendCommand("battery", "level" to "100", "plugged" to "false") + sendCommand("clock", "hhmm" to "1000") + } + + /** + * Exist system UI demo mode + */ + fun exit() { + sendCommand("exit") + } + + private fun sendCommand(command: String, vararg extras: Pair<String, Any>) { + val exec = StringBuilder("am broadcast -a com.android.systemui.demo -e command $command") + for ((key, value) in extras) { + exec.append(" -e $key $value") + } + executeShellCommand(exec.toString()) + } + + private fun executeShellCommand(command: String) { + waitForCompletion(InstrumentationRegistry.getInstrumentation().uiAutomation.executeShellCommand(command)) + } + + private fun waitForCompletion(descriptor: ParcelFileDescriptor) { + BufferedReader( + InputStreamReader( + ParcelFileDescriptor.AutoCloseInputStream(descriptor) + ) + ).use { + it.readText() + } + } +} diff --git a/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt new file mode 100644 index 000000000..779235757 --- /dev/null +++ b/Corona-Warn-App/src/androidTest/java/testhelpers/SystemUIDemoModeRule.kt @@ -0,0 +1,27 @@ +package testhelpers + +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +/** + * Enters UI demo mode (clean up device status bar) + * before running screenshot tests and exists after it afterwards + */ +class SystemUIDemoModeRule : TestRule { + + private val helper = SystemUIDemoModeHelper() + + override fun apply(base: Statement, description: Description): Statement = + object : Statement() { + override fun evaluate() { + try { + helper.enter() + base.evaluate() + helper.exit() + } catch (e: Exception) { + e.printStackTrace() + } + } + } +} -- GitLab