From a58f157d7af0aa1b0142abaa6758b4e2231512d5 Mon Sep 17 00:00:00 2001 From: Nataniel Borges Date: Sun, 10 Jul 2022 16:37:22 +0000 Subject: [PATCH] Add support for Tablets on app close tests Moreover, refactor the test to reuse the base test class with general assertions Bug: 234735502 Test: atest FlickerTests Change-Id: I01c354cc3e08ca4bc6dd495ac8f968dd9e311f85 --- .../server/wm/flicker/CommonAssertions.kt | 64 +++++++-- .../flicker/close/CloseAppBackButtonTest.kt | 18 +-- .../flicker/close/CloseAppHomeButtonTest.kt | 8 +- .../wm/flicker/close/CloseAppTransition.kt | 122 ++---------------- 4 files changed, 71 insertions(+), 141 deletions(-) diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt index 24df51c40f8f2..4f1bb28adcc45 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/CommonAssertions.kt @@ -26,7 +26,7 @@ import com.android.server.wm.traces.common.IComponentMatcher * Checks that [ComponentMatcher.STATUS_BAR] window is visible and above the app windows in * all WM trace entries */ -fun FlickerTestParameter.statusBarWindowIsVisible() { +fun FlickerTestParameter.statusBarWindowIsAlwaysVisible() { assertWm { this.isAboveAppWindowVisible(ComponentMatcher.STATUS_BAR) } @@ -36,12 +36,22 @@ fun FlickerTestParameter.statusBarWindowIsVisible() { * Checks that [ComponentMatcher.NAV_BAR] window is visible and above the app windows in * all WM trace entries */ -fun FlickerTestParameter.navBarWindowIsVisible() { +fun FlickerTestParameter.navBarWindowIsAlwaysVisible() { assertWm { this.isAboveAppWindowVisible(ComponentMatcher.NAV_BAR) } } +/** + * Checks that [ComponentMatcher.TASK_BAR] window is visible and above the app windows in + * all WM trace entries + */ +fun FlickerTestParameter.taskBarWindowIsAlwaysVisible() { + assertWm { + this.isAboveAppWindowVisible(ComponentMatcher.TASK_BAR) + } +} + /** * If [allStates] is true, checks if the stack space of all displays is fully covered * by any visible layer, during the whole transitions @@ -79,7 +89,7 @@ fun FlickerTestParameter.entireScreenCovered(allStates: Boolean = true) { * Checks that [ComponentMatcher.NAV_BAR] layer is visible at the start and end of the SF * trace */ -fun FlickerTestParameter.navBarLayerIsVisible() { +fun FlickerTestParameter.navBarLayerIsVisibleAtStartAndEnd() { assertLayersStart { this.isVisible(ComponentMatcher.NAV_BAR) } @@ -88,11 +98,37 @@ fun FlickerTestParameter.navBarLayerIsVisible() { } } +/** + * Checks that [ComponentMatcher.TASK_BAR] layer is visible at the start and end of the SF + * trace + */ +fun FlickerTestParameter.taskBarLayerIsVisibleAtStartAndEnd() { + assertLayersStart { + this.isVisible(ComponentMatcher.TASK_BAR) + } + assertLayersEnd { + this.isVisible(ComponentMatcher.TASK_BAR) + } +} + +/** + * Checks that [ComponentMatcher.TASK_BAR] layer is visible at the start and end of the SF + * trace + */ +fun FlickerTestParameter.navTaskLayerIsVisibleAtStartAndEnd() { + assertLayersStart { + this.isVisible(ComponentMatcher.TASK_BAR) + } + assertLayersEnd { + this.isVisible(ComponentMatcher.TASK_BAR) + } +} + /** * Checks that [ComponentMatcher.STATUS_BAR] layer is visible at the start and end of the SF * trace */ -fun FlickerTestParameter.statusBarLayerIsVisible() { +fun FlickerTestParameter.statusBarLayerIsVisibleAtStartAndEnd() { assertLayersStart { this.isVisible(ComponentMatcher.STATUS_BAR) } @@ -105,7 +141,7 @@ fun FlickerTestParameter.statusBarLayerIsVisible() { * Asserts that the [ComponentMatcher.NAV_BAR] layer is at the correct position at the start * of the SF trace */ -fun FlickerTestParameter.navBarLayerPositionStart() { +fun FlickerTestParameter.navBarLayerPositionAtStart() { assertLayersStart { val display = this.entry.displays.firstOrNull { !it.isVirtual } ?: error("There is no display!") @@ -118,7 +154,7 @@ fun FlickerTestParameter.navBarLayerPositionStart() { * Asserts that the [ComponentMatcher.NAV_BAR] layer is at the correct position at the end * of the SF trace */ -fun FlickerTestParameter.navBarLayerPositionEnd() { +fun FlickerTestParameter.navBarLayerPositionAtEnd() { assertLayersEnd { val display = this.entry.displays.minByOrNull { it.id } ?: throw RuntimeException("There is no display!") @@ -131,16 +167,16 @@ fun FlickerTestParameter.navBarLayerPositionEnd() { * Asserts that the [ComponentMatcher.NAV_BAR] layer is at the correct position at the start * and end of the SF trace */ -fun FlickerTestParameter.navBarLayerRotatesAndScales() { - navBarLayerPositionStart() - navBarLayerPositionEnd() +fun FlickerTestParameter.navBarLayerPositionAtStartAndEnd() { + navBarLayerPositionAtStart() + navBarLayerPositionAtEnd() } /** * Asserts that the [ComponentMatcher.STATUS_BAR] layer is at the correct position at the start * of the SF trace */ -fun FlickerTestParameter.statusBarLayerPositionStart() { +fun FlickerTestParameter.statusBarLayerPositionAtStart() { assertLayersStart { val display = this.entry.displays.minByOrNull { it.id } ?: throw RuntimeException("There is no display!") @@ -153,7 +189,7 @@ fun FlickerTestParameter.statusBarLayerPositionStart() { * Asserts that the [ComponentMatcher.STATUS_BAR] layer is at the correct position at the end * of the SF trace */ -fun FlickerTestParameter.statusBarLayerPositionEnd() { +fun FlickerTestParameter.statusBarLayerPositionAtEnd() { assertLayersEnd { val display = this.entry.displays.minByOrNull { it.id } ?: throw RuntimeException("There is no display!") @@ -166,9 +202,9 @@ fun FlickerTestParameter.statusBarLayerPositionEnd() { * Asserts that the [ComponentMatcher.STATUS_BAR] layer is at the correct position at the start * and end of the SF trace */ -fun FlickerTestParameter.statusBarLayerRotatesScales() { - statusBarLayerPositionStart() - statusBarLayerPositionEnd() +fun FlickerTestParameter.statusBarLayerPositionAtStartAndEnd() { + statusBarLayerPositionAtStart() + statusBarLayerPositionAtEnd() } /** diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt index d0f1dfddaed02..37b8b4cf4bf23 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppBackButtonTest.kt @@ -25,8 +25,7 @@ import com.android.server.wm.flicker.FlickerTestParameterFactory import com.android.server.wm.flicker.annotation.Group4 import com.android.server.wm.flicker.dsl.FlickerBuilder import com.android.server.wm.flicker.helpers.isShellTransitionsEnabled -import org.junit.Assume.assumeFalse -import org.junit.Assume.assumeTrue +import org.junit.Assume import org.junit.FixMethodOrder import org.junit.Test import org.junit.runner.RunWith @@ -68,6 +67,7 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group4 class CloseAppBackButtonTest(testSpec: FlickerTestParameter) : CloseAppTransition(testSpec) { + /** {@inheritDoc} */ override val transition: FlickerBuilder.() -> Unit get() = { super.transition(this) @@ -82,22 +82,22 @@ class CloseAppBackButtonTest(testSpec: FlickerTestParameter) : CloseAppTransitio /** {@inheritDoc} */ @FlakyTest(bugId = 206753786) @Test - override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + override fun navBarLayerPositionAtStartAndEnd() = super.navBarLayerPositionAtStartAndEnd() /** {@inheritDoc} */ @FlakyTest(bugId = 206753786) @Test - override fun statusBarLayerRotatesScales() { + override fun statusBarLayerPositionAtStartAndEnd() { // This test doesn't work in shell transitions because of b/206753786 - assumeFalse(isShellTransitionsEnabled) - super.statusBarLayerRotatesScales() + Assume.assumeFalse(isShellTransitionsEnabled) + super.statusBarLayerPositionAtStartAndEnd() } @FlakyTest(bugId = 214452854) @Test - fun statusBarLayerRotatesScales_shellTransit() { - assumeTrue(isShellTransitionsEnabled) - super.statusBarLayerRotatesScales() + fun statusBarLayerPositionAtStartAndEnd_shellTransit() { + Assume.assumeTrue(isShellTransitionsEnabled) + super.statusBarLayerPositionAtStartAndEnd() } /** {@inheritDoc} */ diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt index b178e8c7ecedb..a4c809a7caba7 100644 --- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt +++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt @@ -64,6 +64,7 @@ import org.junit.runners.Parameterized @FixMethodOrder(MethodSorters.NAME_ASCENDING) @Group4 class CloseAppHomeButtonTest(testSpec: FlickerTestParameter) : CloseAppTransition(testSpec) { + /** {@inheritDoc} */ override val transition: FlickerBuilder.() -> Unit get() = { super.transition(this) @@ -82,14 +83,13 @@ class CloseAppHomeButtonTest(testSpec: FlickerTestParameter) : CloseAppTransitio /** {@inheritDoc} */ @FlakyTest(bugId = 206753786) @Test - override fun navBarLayerRotatesAndScales() = super.navBarLayerRotatesAndScales() + override fun navBarLayerPositionAtStartAndEnd() = super.navBarLayerPositionAtStartAndEnd() /** {@inheritDoc} */ @FlakyTest(bugId = 206753786) @Test - override fun statusBarLayerRotatesScales() { - super.statusBarLayerRotatesScales() - } + override fun statusBarLayerPositionAtStartAndEnd() = + super.statusBarLayerPositionAtStartAndEnd() /** {@inheritDoc} */ @FlakyTest(bugId = 229762973) 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 b166cbab006c5..7ff0934743996 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 @@ -16,39 +16,25 @@ package com.android.server.wm.flicker.close -import android.app.Instrumentation import android.platform.test.annotations.Presubmit -import androidx.test.platform.app.InstrumentationRegistry -import com.android.launcher3.tapl.LauncherInstrumentation -import com.android.server.wm.flicker.FlickerBuilderProvider +import com.android.server.wm.flicker.BaseTest import com.android.server.wm.flicker.FlickerTestParameter import com.android.server.wm.flicker.dsl.FlickerBuilder -import com.android.server.wm.flicker.entireScreenCovered import com.android.server.wm.flicker.helpers.SimpleAppHelper import com.android.server.wm.flicker.helpers.StandardAppHelper import com.android.server.wm.flicker.helpers.setRotation -import com.android.server.wm.flicker.navBarLayerIsVisible -import com.android.server.wm.flicker.navBarLayerRotatesAndScales -import com.android.server.wm.flicker.navBarWindowIsVisible import com.android.server.wm.flicker.replacesLayer -import com.android.server.wm.flicker.statusBarLayerIsVisible -import com.android.server.wm.flicker.statusBarLayerRotatesScales -import com.android.server.wm.flicker.statusBarWindowIsVisible import com.android.server.wm.traces.common.ComponentMatcher.Companion.LAUNCHER import org.junit.Test /** * Base test class for transitions that close an app back to the launcher screen */ -abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) { - protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation() +abstract class CloseAppTransition(testSpec: FlickerTestParameter) : BaseTest(testSpec) { protected open val testApp: StandardAppHelper = SimpleAppHelper(instrumentation) - protected val tapl = LauncherInstrumentation() - /** - * Specification of the test transition to execute - */ - protected open val transition: FlickerBuilder.() -> Unit = { + /** {@inheritDoc} */ + override val transition: FlickerBuilder.() -> Unit = { setup { test { tapl.setExpectedRotation(testSpec.startRotation) @@ -65,98 +51,6 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) } } - /** - * Entry point for the test runner. It will use this method to initialize and cache - * flicker executions - */ - @FlickerBuilderProvider - fun buildFlicker(): FlickerBuilder { - return FlickerBuilder(instrumentation).apply { - transition() - } - } - - /** - * Checks that the navigation bar window is visible during the whole transition - */ - @Presubmit - @Test - open fun navBarWindowIsVisible() { - testSpec.navBarWindowIsVisible() - } - - /** - * Checks that the status bar window is visible during the whole transition - */ - @Presubmit - @Test - open fun statusBarWindowIsVisible() { - testSpec.statusBarWindowIsVisible() - } - - /** - * Checks that the navigation bar layer is visible during the whole transition - */ - @Presubmit - @Test - open fun navBarLayerIsVisible() { - testSpec.navBarLayerIsVisible() - } - - /** - * Checks that the status bar layer is visible during the whole transition - */ - @Presubmit - @Test - open fun statusBarLayerIsVisible() { - testSpec.statusBarLayerIsVisible() - } - - /** - * Checks the position of the navigation bar at the start and end of the transition - */ - @Presubmit - @Test - open fun navBarLayerRotatesAndScales() = testSpec.navBarLayerRotatesAndScales() - - /** - * Checks the position of the status bar at the start and end of the transition - */ - @Presubmit - @Test - open fun statusBarLayerRotatesScales() = testSpec.statusBarLayerRotatesScales() - - /** - * Checks that all windows that are visible on the trace, are visible for at least 2 - * consecutive entries. - */ - @Presubmit - @Test - open fun visibleWindowsShownMoreThanOneConsecutiveEntry() { - testSpec.assertWm { - this.visibleWindowsShownMoreThanOneConsecutiveEntry() - } - } - - /** - * Checks that all layers that are visible on the trace, are visible for at least 2 - * consecutive entries. - */ - @Presubmit - @Test - open fun visibleLayersShownMoreThanOneConsecutiveEntry() { - testSpec.assertLayers { - this.visibleLayersShownMoreThanOneConsecutiveEntry() - } - } - - /** - * Checks that all parts of the screen are covered during the transition - */ - @Presubmit - @Test - open fun entireScreenCovered() = testSpec.entireScreenCovered() - /** * Checks that [testApp] is the top visible app window at the start of the transition and * that it is replaced by [LAUNCHER] during the transition @@ -166,8 +60,8 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) open fun launcherReplacesAppWindowAsTopWindow() { testSpec.assertWm { this.isAppWindowOnTop(testApp) - .then() - .isAppWindowOnTop(LAUNCHER) + .then() + .isAppWindowOnTop(LAUNCHER) } } @@ -180,8 +74,8 @@ abstract class CloseAppTransition(protected val testSpec: FlickerTestParameter) open fun launcherWindowBecomesVisible() { testSpec.assertWm { this.isAppWindowNotOnTop(LAUNCHER) - .then() - .isAppWindowOnTop(LAUNCHER) + .then() + .isAppWindowOnTop(LAUNCHER) } }