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 7c7e8aab29246f2df44d4a93b28f3b3ccea8bd4c..7ea43ae382148ef75a7c98fde5dd45e9311c8e94 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 afbfe65752b24483f144534c066ab35ec801e85c..15810f4313b49a52dfb46eb3b07ed76055baa18c 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 33eb47d759bd56c4967cd36204b5c24f08213dcc..36b9ab7b6e98ee868d5cd88be9a49ba19a5a9405 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 aa3166ad0332e52f8d5f07b61c3b31e485e972e9..31f7e424436ef647f6cd6cf974f3f8401213f5d5 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 9cc641ea4cc50bf7a69cb7680ee68928fd0c8f16..3c0a2631fd760247bbad8faa5c668342854fea77 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 18877ff1e005256a69db78ec6ef24eb1d6c4ea9e..fe0c93bf5a7eea060e658b66c1f67af0d6d45154 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 0000000000000000000000000000000000000000..d98a657ea90aac323f1aa298c38fabe622763c33 --- /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 0000000000000000000000000000000000000000..7792357574ac9074ce9fdca6c6fd0a2fd209c9bb --- /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() + } + } + } +}