From 798fe83b4bae6b6c79d40f8228edc3884208ecc5 Mon Sep 17 00:00:00 2001 From: Nataniel Borges Date: Thu, 17 Feb 2022 18:41:59 +0100 Subject: [PATCH] Crash test when wait condition not met This makes triaging issues unrelated to the test (e.g., transition crash) easier since all failing assertions are clustered with the same stack trace Bug: 219773854 Test: atest FlickerTests WMShellFlickerTests Change-Id: I65bb1b5e87997c856ce080b24d549ba1c978955a Merged-In: I65bb1b5e87997c856ce080b24d549ba1c978955a --- ...ppPairsTestSupportPairNonResizeableApps.kt | 15 ++++++++++++- .../wm/shell/flicker/helpers/ImeAppHelper.kt | 4 ++-- .../wm/shell/flicker/helpers/PipAppHelper.kt | 22 ++++++++++++++----- .../wm/shell/flicker/pip/EnterPipTest.kt | 13 ++++++++++- .../pip/ExitPipViaExpandButtonClickTest.kt | 2 +- .../shell/flicker/pip/ExitPipViaIntentTest.kt | 4 ++-- .../wm/shell/flicker/pip/PipTransition.kt | 6 ++--- .../wm/flicker/close/CloseAppTransition.kt | 2 +- .../server/wm/flicker/helpers/ImeAppHelper.kt | 1 - .../flicker/helpers/TwoActivitiesAppHelper.kt | 2 +- .../wm/flicker/ime/ReOpenImeWindowTest.kt | 2 +- .../ime/SwitchImeWindowsFromGestureNavTest.kt | 21 ++++++++++++++---- .../launch/ActivitiesTransitionTest.kt | 11 +++++++--- .../wm/flicker/launch/OpenAppTransition.kt | 2 +- 14 files changed, 78 insertions(+), 29 deletions(-) diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt index 65eb9aa991c2e..57bcbc093a621 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestSupportPairNonResizeableApps.kt @@ -17,6 +17,7 @@ package com.android.wm.shell.flicker.apppairs import android.platform.test.annotations.Presubmit +import android.view.Display import androidx.test.filters.FlakyTest import androidx.test.filters.RequiresDevice import com.android.server.wm.flicker.FlickerParametersRunnerFactory @@ -24,6 +25,7 @@ import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group1 import com.android.server.wm.flicker.dsl.FlickerBuilder +import com.android.server.wm.traces.common.WindowManagerConditionsFactory import com.android.wm.shell.flicker.appPairsDividerIsVisibleAtEnd import com.android.wm.shell.flicker.helpers.AppPairsHelper import com.android.wm.shell.flicker.helpers.MultiWindowHelper.Companion.resetMultiWindowConfig @@ -60,7 +62,18 @@ class AppPairsTestSupportPairNonResizeableApps( // TODO pair apps through normal UX flow executeShellCommand( composePairsCommand(primaryTaskId, nonResizeableTaskId, pair = true)) - nonResizeableApp?.run { wmHelper.waitForFullScreenApp(nonResizeableApp.component) } + val waitConditions = mutableListOf( + WindowManagerConditionsFactory.isWindowVisible(primaryApp.component), + WindowManagerConditionsFactory.isLayerVisible(primaryApp.component), + WindowManagerConditionsFactory.isAppTransitionIdle(Display.DEFAULT_DISPLAY)) + + nonResizeableApp?.let { + waitConditions.add( + WindowManagerConditionsFactory.isWindowVisible(nonResizeableApp.component)) + waitConditions.add( + WindowManagerConditionsFactory.isLayerVisible(nonResizeableApp.component)) + } + wmHelper.waitFor(*waitConditions.toTypedArray()) } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/ImeAppHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/ImeAppHelper.kt index 0f00edea136fe..cc5b9f9eb26d5 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/ImeAppHelper.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/ImeAppHelper.kt @@ -62,7 +62,7 @@ open class ImeAppHelper(instrumentation: Instrumentation) : BaseAppHelper( if (wmHelper == null) { device.waitForIdle() } else { - require(wmHelper.waitImeShown()) { "IME did not appear" } + wmHelper.waitImeShown() } } @@ -79,7 +79,7 @@ open class ImeAppHelper(instrumentation: Instrumentation) : BaseAppHelper( if (wmHelper == null) { uiDevice.waitForIdle() } else { - require(wmHelper.waitImeGone()) { "IME did did not close" } + wmHelper.waitImeGone() } } else { // While pressing the back button should close the IME on TV as well, it may also lead diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt index 7e232ea321816..e9d438a569d55 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/PipAppHelper.kt @@ -58,17 +58,27 @@ class PipAppHelper(instrumentation: Instrumentation) : BaseAppHelper( } } - /** {@inheritDoc} */ - override fun launchViaIntent( + /** + * Launches the app through an intent instead of interacting with the launcher and waits + * until the app window is in PIP mode + */ + @JvmOverloads + fun launchViaIntentAndWaitForPip( wmHelper: WindowManagerStateHelper, - expectedWindowName: String, - action: String?, + expectedWindowName: String = "", + action: String? = null, stringExtras: Map ) { - super.launchViaIntent(wmHelper, expectedWindowName, action, stringExtras) - wmHelper.waitPipShown() + launchViaIntentAndWaitShown(wmHelper, expectedWindowName, action, stringExtras, + waitConditions = arrayOf(WindowManagerStateHelper.pipShownCondition)) } + /** + * Expand the PIP window back to full screen via intent and wait until the app is visible + */ + fun exitPipToFullScreenViaIntent(wmHelper: WindowManagerStateHelper) = + launchViaIntentAndWaitShown(wmHelper) + private fun focusOnObject(selector: BySelector): Boolean { // We expect all the focusable UI elements to be arranged in a way so that it is possible // to "cycle" over all them by clicking the D-Pad DOWN button, going back up to "the top" diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt index f2c50935a3e9d..274d34ba3c5b6 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/EnterPipTest.kt @@ -64,7 +64,18 @@ class EnterPipTest(testSpec: FlickerTestParameter) : PipTransition(testSpec) { * Defines the transition used to run the test */ override val transition: FlickerBuilder.() -> Unit - get() = buildTransition(eachRun = true, stringExtras = emptyMap()) { + get() = { + setupAndTeardown(this) + setup { + eachRun { + pipApp.launchViaIntent(wmHelper) + } + } + teardown { + eachRun { + pipApp.exit(wmHelper) + } + } transitions { pipApp.clickEnterPipButton(wmHelper) } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt index 4f98b70e222ad..e2d08346efb66 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaExpandButtonClickTest.kt @@ -74,7 +74,7 @@ class ExitPipViaExpandButtonClickTest( // This will bring PipApp to fullscreen pipApp.expandPipWindowToApp(wmHelper) // Wait until the other app is no longer visible - wmHelper.waitForSurfaceAppeared(testApp.component.toWindowName()) + wmHelper.waitForSurfaceAppeared(testApp.component) } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt index e00d7491839f4..3fe6f02eccf7d 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/ExitPipViaIntentTest.kt @@ -72,9 +72,9 @@ class ExitPipViaIntentTest(testSpec: FlickerTestParameter) : ExitPipToAppTransit } transitions { // This will bring PipApp to fullscreen - pipApp.launchViaIntent(wmHelper) + pipApp.exitPipToFullScreenViaIntent(wmHelper) // Wait until the other app is no longer visible - wmHelper.waitForSurfaceAppeared(testApp.component.toWindowName()) + wmHelper.waitForWindowSurfaceDisappeared(testApp.component) } } diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt index bb66f7bbc01fe..654fa4ec94465 100644 --- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt +++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/pip/PipTransition.kt @@ -122,15 +122,14 @@ abstract class PipTransition(protected val testSpec: FlickerTestParameter) { setup { test { - removeAllTasksButHome() if (!eachRun) { - pipApp.launchViaIntent(wmHelper, stringExtras = stringExtras) + pipApp.launchViaIntentAndWaitForPip(wmHelper, stringExtras = stringExtras) wmHelper.waitPipShown() } } eachRun { if (eachRun) { - pipApp.launchViaIntent(wmHelper, stringExtras = stringExtras) + pipApp.launchViaIntentAndWaitForPip(wmHelper, stringExtras = stringExtras) wmHelper.waitPipShown() } } @@ -145,7 +144,6 @@ abstract class PipTransition(protected val testSpec: FlickerTestParameter) { if (!eachRun) { pipApp.exit(wmHelper) } - removeAllTasksButHome() } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt index 8d60466eff958..4cddd8506df7f 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt @@ -60,7 +60,7 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) } teardown { test { - testApp.exit() + testApp.exit(wmHelper) } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt index 7ee6451b2797c..5bd365c7eefd6 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/ImeAppHelper.kt @@ -64,7 +64,6 @@ open class ImeAppHelper @JvmOverloads constructor( device.waitForIdle() } else { wmHelper.waitImeShown() - wmHelper.waitForAppTransitionIdle() } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt index b66c45c7c9f08..a135e0af067b6 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/helpers/TwoActivitiesAppHelper.kt @@ -53,8 +53,8 @@ class TwoActivitiesAppHelper @JvmOverloads constructor( button.click() device.wait(Until.gone(launchActivityButton), FIND_TIMEOUT) - wmHelper.waitForFullScreenApp(secondActivityComponent) wmHelper.waitFor( + WindowManagerStateHelper.isAppFullScreen(secondActivityComponent), WindowManagerConditionsFactory.isAppTransitionIdle(Display.DEFAULT_DISPLAY), WindowManagerConditionsFactory.hasLayersAnimating().negate() ) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt index ba5698cafa157..a9564fdd2332c 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt @@ -88,7 +88,7 @@ class ReOpenImeWindowTest(private val testSpec: FlickerTestParameter) { } transitions { device.reopenAppFromOverview(wmHelper) - require(wmHelper.waitImeShown()) { "IME didn't show in time" } + wmHelper.waitImeShown() } teardown { test { diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt index 19e2c92304d47..7e3ed8252f4c2 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt @@ -18,6 +18,7 @@ package com.android.server.wm.flicker.ime import android.app.Instrumentation import android.platform.test.annotations.Presubmit +import android.view.Display import android.view.Surface import android.view.WindowManagerPolicyConstants import androidx.test.filters.RequiresDevice @@ -35,6 +36,8 @@ import com.android.server.wm.flicker.helpers.setRotation import com.android.server.wm.flicker.navBarWindowIsVisible import com.android.server.wm.flicker.statusBarWindowIsVisible import com.android.server.wm.traces.common.FlickerComponentName +import com.android.server.wm.traces.common.WindowManagerConditionsFactory +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import org.junit.FixMethodOrder import org.junit.Test @@ -64,12 +67,22 @@ class SwitchImeWindowsFromGestureNavTest(private val testSpec: FlickerTestParame eachRun { this.setRotation(testSpec.startRotation) testApp.launchViaIntent(wmHelper) - wmHelper.waitForFullScreenApp(testApp.component) - wmHelper.waitForAppTransitionIdle() + val testAppVisible = wmHelper.waitFor( + WindowManagerStateHelper.isAppFullScreen(testApp.component), + WindowManagerConditionsFactory.isAppTransitionIdle( + Display.DEFAULT_DISPLAY)) + require(testAppVisible) { + "Expected ${testApp.component.toWindowName()} to be visible" + } imeTestApp.launchViaIntent(wmHelper) - wmHelper.waitForFullScreenApp(testApp.component) - wmHelper.waitForAppTransitionIdle() + val imeAppVisible = wmHelper.waitFor( + WindowManagerStateHelper.isAppFullScreen(imeTestApp.component), + WindowManagerConditionsFactory.isAppTransitionIdle( + Display.DEFAULT_DISPLAY)) + require(imeAppVisible) { + "Expected ${imeTestApp.component.toWindowName()} to be visible" + } imeTestApp.openIME(device, wmHelper) } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt index b5e13be7dca0c..cc808a0ce871c 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/ActivitiesTransitionTest.kt @@ -18,6 +18,7 @@ package com.android.server.wm.flicker.launch import android.app.Instrumentation import android.platform.test.annotations.Presubmit +import android.view.Display import androidx.test.filters.RequiresDevice import androidx.test.platform.app.InstrumentationRegistry import com.android.server.wm.flicker.entireScreenCovered @@ -30,7 +31,9 @@ import com.android.server.wm.flicker.annotation.Group4 import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.helpers.TwoActivitiesAppHelper import com.android.server.wm.flicker.testapp.ActivityOptions +import com.android.server.wm.traces.common.WindowManagerConditionsFactory import com.android.server.wm.traces.parser.toFlickerComponent +import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith @@ -77,14 +80,16 @@ class ActivitiesTransitionTest(val testSpec: FlickerTestParameter) { } teardown { test { - testApp.exit() + testApp.exit(wmHelper) } } transitions { testApp.openSecondActivity(device, wmHelper) device.pressBack() - wmHelper.waitForAppTransitionIdle() - wmHelper.waitForFullScreenApp(testApp.component) + val firstActivityVisible = wmHelper.waitFor( + WindowManagerConditionsFactory.isAppTransitionIdle(Display.DEFAULT_DISPLAY), + WindowManagerStateHelper.isAppFullScreen(testApp.component)) + require(firstActivityVisible) { "Expected ${testApp.component} to be visible" } } } } diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt index 53560cc14c44b..4313b8dbc8835 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppTransition.kt @@ -56,7 +56,7 @@ abstract class OpenAppTransition(protected val testSpec: FlickerTestParameter) { } teardown { test { - testApp.exit() + testApp.exit(wmHelper) } } }