summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Bill Lin <lbill@google.com> 2020-12-11 16:48:34 +0800
committer Bill Lin <lbill@google.com> 2020-12-22 13:03:29 +0800
commitf7bb7555e0cb49f7d0ee911cde0e199cc84d1d2b (patch)
tree2a3529dfa2f68d857b7b0c3b0b30fa44b84d23c4
parent612dbde32af63fe0b33d82deb455e65f5fe869eb (diff)
6-2/ Integrate AppPairs flicker rotation tests
Bug: 172776659 Test: atest com.android.wm.shell.flicker.apppairs Change-Id: I203c6f278fbdc7d22579df335580b6c358e7fc1e
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt56
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt63
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestBase.kt49
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/RotateTwoLaunchedAppTest.kt166
-rw-r--r--libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/AppPairsHelper.kt7
5 files changed, 277 insertions, 64 deletions
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
index e3ac3f056501..5ab1c390a92b 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/CommonAssertions.kt
@@ -17,10 +17,11 @@
package com.android.wm.shell.flicker
import android.graphics.Region
-import com.android.server.wm.flicker.DOCKED_STACK_DIVIDER
+import android.view.Surface
import com.android.server.wm.flicker.dsl.EventLogAssertion
import com.android.server.wm.flicker.dsl.LayersAssertion
import com.android.server.wm.flicker.helpers.WindowUtils
+import com.android.wm.shell.flicker.FlickerTestBase.Companion.DOCKED_STACK_DIVIDER
@JvmOverloads
fun LayersAssertion.appPairsDividerIsVisible(
@@ -87,6 +88,36 @@ fun LayersAssertion.dockedStackDividerIsInvisible(
}
@JvmOverloads
+fun LayersAssertion.appPairsPrimaryBoundsIsVisible(
+ rotation: Int,
+ primaryLayerName: String,
+ bugId: Int = 0,
+ enabled: Boolean = bugId == 0
+) {
+ end("PrimaryAppBounds", bugId, enabled) {
+ val entry = this.trace.entries.firstOrNull()
+ ?: throw IllegalStateException("Trace is empty")
+ val dividerRegion = entry.getVisibleBounds(FlickerTestBase.SPLIT_DIVIDER)
+ this.hasVisibleRegion(primaryLayerName, getPrimaryRegion(dividerRegion, rotation))
+ }
+}
+
+@JvmOverloads
+fun LayersAssertion.appPairsSecondaryBoundsIsVisible(
+ rotation: Int,
+ secondaryLayerName: String,
+ bugId: Int = 0,
+ enabled: Boolean = bugId == 0
+) {
+ end("SecondaryAppBounds", bugId, enabled) {
+ val entry = this.trace.entries.firstOrNull()
+ ?: throw IllegalStateException("Trace is empty")
+ val dividerRegion = entry.getVisibleBounds(FlickerTestBase.SPLIT_DIVIDER)
+ this.hasVisibleRegion(secondaryLayerName, getSecondaryRegion(dividerRegion, rotation))
+ }
+}
+
+@JvmOverloads
fun LayersAssertion.dockedStackPrimaryBoundsIsVisible(
rotation: Int,
primaryLayerName: String,
@@ -118,16 +149,27 @@ fun LayersAssertion.dockedStackSecondaryBoundsIsVisible(
fun getPrimaryRegion(dividerRegion: Region, rotation: Int): Region {
val displayBounds = WindowUtils.getDisplayBounds(rotation)
- return Region(0, 0, displayBounds.getBounds().right,
- dividerRegion.getBounds().bottom - WindowUtils.dockedStackDividerInset)
+ return if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
+ Region(0, 0, displayBounds.getBounds().right,
+ dividerRegion.getBounds().bottom - WindowUtils.dockedStackDividerInset)
+ } else {
+ Region(0, 0, dividerRegion.getBounds().left,
+ dividerRegion.getBounds().right - WindowUtils.dockedStackDividerInset)
+ }
}
fun getSecondaryRegion(dividerRegion: Region, rotation: Int): Region {
val displayBounds = WindowUtils.getDisplayBounds(rotation)
- return Region(0,
- dividerRegion.getBounds().bottom - WindowUtils.dockedStackDividerInset,
- displayBounds.getBounds().right,
- displayBounds.getBounds().bottom - WindowUtils.navigationBarHeight)
+ return if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
+ Region(0,
+ dividerRegion.getBounds().bottom - WindowUtils.dockedStackDividerInset,
+ displayBounds.getBounds().right,
+ displayBounds.getBounds().bottom - WindowUtils.dockedStackDividerInset)
+ } else {
+ Region(dividerRegion.getBounds().right, 0,
+ displayBounds.getBounds().right,
+ displayBounds.getBounds().bottom - WindowUtils.dockedStackDividerInset)
+ }
}
fun EventLogAssertion.focusChanges(
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt
index 379ec95b6792..22b1eb7037fc 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTest.kt
@@ -16,29 +16,26 @@
package com.android.wm.shell.flicker.apppairs
-import android.platform.test.annotations.Presubmit
import android.os.SystemClock
-import android.util.Log
+import android.platform.test.annotations.Presubmit
import android.view.Surface
import androidx.test.filters.RequiresDevice
-import com.android.compatibility.common.util.SystemUtil
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.dsl.runWithFlicker
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
-import com.android.wm.shell.flicker.helpers.AppPairsHelper
-import com.android.wm.shell.flicker.helpers.AppPairsHelper.Companion.TEST_REPETITIONS
-import com.android.wm.shell.flicker.appPairsDividerIsInvisible
-import com.android.wm.shell.flicker.appPairsDividerIsVisible
+import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
import com.android.server.wm.flicker.statusBarLayerIsAlwaysVisible
-import com.android.server.wm.flicker.navBarLayerIsAlwaysVisible
import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
+import com.android.wm.shell.flicker.appPairsDividerIsInvisible
+import com.android.wm.shell.flicker.appPairsDividerIsVisible
+import com.android.wm.shell.flicker.helpers.AppPairsHelper
+import com.android.wm.shell.flicker.helpers.AppPairsHelper.Companion.TEST_REPETITIONS
import org.junit.FixMethodOrder
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.MethodSorters
import org.junit.runners.Parameterized
-import java.io.IOException
/**
* Test AppPairs launch.
@@ -64,15 +61,18 @@ class AppPairsTest(
primaryApp.launchViaIntent()
secondaryApp.launchViaIntent()
nonResizeableApp.launchViaIntent()
- updateTaskId()
+ updateTasksId()
}
}
teardown {
eachRun {
executeShellCommand(composePairsCommand(
primaryTaskId, secondaryTaskId, false /* pair */))
+ executeShellCommand(composePairsCommand(
+ primaryTaskId, nonResizeableTaskId, false /* pair */))
primaryApp.exit()
secondaryApp.exit()
+ nonResizeableApp.exit()
}
}
assertions {
@@ -184,12 +184,12 @@ class AppPairsTest(
TEST_REPETITIONS
}
transitions {
- nonResizeableApp.launchViaIntent()
// TODO pair apps through normal UX flow
executeShellCommand(composePairsCommand(
primaryTaskId, nonResizeableTaskId, true /* pair */))
SystemClock.sleep(AppPairsHelper.TIMEOUT_MS)
}
+
assertions {
layersTrace {
appPairsDividerIsInvisible()
@@ -205,52 +205,23 @@ class AppPairsTest(
}
}
- private fun composePairsCommand(
- primaryApp: String,
- secondaryApp: String,
- pair: Boolean
- ): String = buildString {
- // dumpsys activity service SystemUIService WMShell {pair|unpair} ${TASK_ID_1} ${TASK_ID_2}
- append("dumpsys activity service SystemUIService WMShell ")
- if (pair) {
- append("pair ")
- } else {
- append("unpair ")
- }
- append(primaryApp + " " + secondaryApp)
- }
-
- private fun executeShellCommand(cmd: String) {
- try {
- SystemUtil.runShellCommand(instrumentation, cmd)
- } catch (e: IOException) {
- Log.d("AppPairsTest", "executeShellCommand error!" + e)
- }
- }
-
- private fun updateTaskId() {
- val primaryAppComponent = primaryApp.openAppIntent.component
- val secondaryAppComponent = secondaryApp.openAppIntent.component
- val nonResizeableAppComponent = nonResizeableApp.openAppIntent.component
+ fun updateTasksId() {
if (primaryAppComponent != null) {
- primaryTaskId = appPairsHelper.getTaskIdForActivity(
+ primaryTaskId = getTaskIdForActivity(
primaryAppComponent.packageName, primaryAppComponent.className).toString()
}
if (secondaryAppComponent != null) {
- secondaryTaskId = appPairsHelper.getTaskIdForActivity(
+ secondaryTaskId = getTaskIdForActivity(
secondaryAppComponent.packageName, secondaryAppComponent.className).toString()
}
if (nonResizeableAppComponent != null) {
- nonResizeableTaskId = appPairsHelper.getTaskIdForActivity(
- nonResizeableAppComponent.packageName,
- nonResizeableAppComponent.className).toString()
+ nonResizeableTaskId = getTaskIdForActivity(
+ nonResizeableAppComponent.packageName,
+ nonResizeableAppComponent.className).toString()
}
}
companion object {
- var primaryTaskId = ""
- var secondaryTaskId = ""
- var nonResizeableTaskId = ""
@Parameterized.Parameters(name = "{0}")
@JvmStatic
fun getParams(): Collection<Array<Any>> {
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestBase.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestBase.kt
index 4d46f2856704..35db7978efb7 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestBase.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/AppPairsTestBase.kt
@@ -16,6 +16,9 @@
package com.android.wm.shell.flicker.apppairs
+import android.system.helpers.ActivityHelper
+import android.util.Log
+import com.android.compatibility.common.util.SystemUtil
import com.android.wm.shell.flicker.NonRotationTestBase
import com.android.wm.shell.flicker.TEST_APP_NONRESIZEABLE_LABEL
import com.android.wm.shell.flicker.TEST_APP_SPLITSCREEN_PRIMARY_LABEL
@@ -23,21 +26,59 @@ import com.android.wm.shell.flicker.TEST_APP_SPLITSCREEN_SECONDARY_LABEL
import com.android.wm.shell.flicker.helpers.AppPairsHelper
import com.android.wm.shell.flicker.helpers.SplitScreenHelper
import com.android.wm.shell.flicker.testapp.Components
+import java.io.IOException
abstract class AppPairsTestBase(
rotationName: String,
rotation: Int
) : NonRotationTestBase(rotationName, rotation) {
- protected val appPairsHelper = AppPairsHelper(instrumentation,
+ val activityHelper = ActivityHelper.getInstance()
+
+ val appPairsHelper = AppPairsHelper(instrumentation,
TEST_APP_SPLITSCREEN_PRIMARY_LABEL,
Components.SplitScreenActivity())
- protected val primaryApp = SplitScreenHelper(instrumentation,
+ val primaryApp = SplitScreenHelper(instrumentation,
TEST_APP_SPLITSCREEN_PRIMARY_LABEL,
Components.SplitScreenActivity())
- protected val secondaryApp = SplitScreenHelper(instrumentation,
+ val secondaryApp = SplitScreenHelper(instrumentation,
TEST_APP_SPLITSCREEN_SECONDARY_LABEL,
Components.SplitScreenSecondaryActivity())
- protected val nonResizeableApp = SplitScreenHelper(instrumentation,
+ val nonResizeableApp = SplitScreenHelper(instrumentation,
TEST_APP_NONRESIZEABLE_LABEL,
Components.NonResizeableActivity())
+
+ val primaryAppComponent = primaryApp.openAppIntent.component
+ val secondaryAppComponent = secondaryApp.openAppIntent.component
+ val nonResizeableAppComponent = nonResizeableApp.openAppIntent.component
+
+ var primaryTaskId = ""
+ var secondaryTaskId = ""
+ var nonResizeableTaskId = ""
+
+ fun composePairsCommand(
+ primaryApp: String,
+ secondaryApp: String,
+ pair: Boolean
+ ): String = buildString {
+ // dumpsys activity service SystemUIService WMShell {pair|unpair} ${TASK_ID_1} ${TASK_ID_2}
+ append("dumpsys activity service SystemUIService WMShell ")
+ if (pair) {
+ append("pair ")
+ } else {
+ append("unpair ")
+ }
+ append(primaryApp + " " + secondaryApp)
+ }
+
+ fun executeShellCommand(cmd: String) {
+ try {
+ SystemUtil.runShellCommand(instrumentation, cmd)
+ } catch (e: IOException) {
+ Log.d("AppPairsTest", "executeShellCommand error!" + e)
+ }
+ }
+
+ fun getTaskIdForActivity(pkgName: String, activityName: String): Int {
+ return activityHelper.getTaskIdForActivity(pkgName, activityName)
+ }
}
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/RotateTwoLaunchedAppTest.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/RotateTwoLaunchedAppTest.kt
new file mode 100644
index 000000000000..d07e0dc272c1
--- /dev/null
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/apppairs/RotateTwoLaunchedAppTest.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.wm.shell.flicker.apppairs
+
+import android.os.SystemClock
+import android.view.Surface
+import androidx.test.filters.RequiresDevice
+import com.android.server.wm.flicker.dsl.FlickerBuilder
+import com.android.server.wm.flicker.dsl.runWithFlicker
+import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
+import com.android.server.wm.flicker.navBarLayerRotatesAndScales
+import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
+import com.android.server.wm.flicker.statusBarLayerRotatesScales
+import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
+import com.android.wm.shell.flicker.appPairsDividerIsVisible
+import com.android.wm.shell.flicker.appPairsPrimaryBoundsIsVisible
+import com.android.wm.shell.flicker.appPairsSecondaryBoundsIsVisible
+import com.android.wm.shell.flicker.helpers.AppPairsHelper
+import com.android.wm.shell.flicker.helpers.SplitScreenHelper
+import org.junit.FixMethodOrder
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.MethodSorters
+import org.junit.runners.Parameterized
+
+/**
+ * Test open apps to app pairs and rotate.
+ * To run this test: `atest WMShellFlickerTests:RotateTwoLaunchedAppTest`
+ */
+@RequiresDevice
+@RunWith(Parameterized::class)
+@FixMethodOrder(MethodSorters.NAME_ASCENDING)
+class RotateTwoLaunchedAppTest(
+ rotationName: String,
+ rotation: Int
+) : AppPairsTestBase(rotationName, rotation) {
+ private val appPairsRotationSetup: FlickerBuilder
+ get() = FlickerBuilder(instrumentation).apply {
+ val testSetupRotation = "testSetupRotation"
+ withTestName {
+ testSetupRotation
+ }
+ setup {
+ test {
+ uiDevice.wakeUpAndGoToHomeScreen()
+ primaryApp.launchViaIntent()
+ secondaryApp.launchViaIntent()
+ updateTasksId()
+ }
+ }
+ teardown {
+ eachRun {
+ executeShellCommand(composePairsCommand(
+ primaryTaskId, secondaryTaskId, false /* pair */))
+ primaryApp.exit()
+ secondaryApp.exit()
+ }
+ }
+ }
+
+ @Test
+ fun testRotateInAppPairsMode() {
+ val testTag = "testRotateInAppPairsMode"
+ runWithFlicker(appPairsRotationSetup) {
+ withTestName { testTag }
+ repeat {
+ SplitScreenHelper.TEST_REPETITIONS
+ }
+ transitions {
+ executeShellCommand(composePairsCommand(
+ primaryTaskId, secondaryTaskId, true /* pair */))
+ SystemClock.sleep(AppPairsHelper.TIMEOUT_MS)
+ setRotation(rotation)
+ }
+ assertions {
+ layersTrace {
+ navBarLayerRotatesAndScales(Surface.ROTATION_0, rotation)
+ statusBarLayerRotatesScales(Surface.ROTATION_0, rotation)
+ appPairsDividerIsVisible()
+ appPairsPrimaryBoundsIsVisible(
+ rotation, primaryApp.defaultWindowName, 172776659)
+ appPairsSecondaryBoundsIsVisible(
+ rotation, secondaryApp.defaultWindowName, 172776659)
+ }
+ windowManagerTrace {
+ navBarWindowIsAlwaysVisible()
+ statusBarWindowIsAlwaysVisible()
+ end {
+ showsAppWindow(primaryApp.defaultWindowName)
+ .and().showsAppWindow(secondaryApp.defaultWindowName)
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ fun testRotateAndEnterAppPairsMode() {
+ val testTag = "testRotateAndEnterAppPairsMode"
+ runWithFlicker(appPairsRotationSetup) {
+ withTestName { testTag }
+ repeat {
+ SplitScreenHelper.TEST_REPETITIONS
+ }
+ transitions {
+ setRotation(rotation)
+ executeShellCommand(composePairsCommand(
+ primaryTaskId, secondaryTaskId, true /* pair */))
+ SystemClock.sleep(AppPairsHelper.TIMEOUT_MS)
+ }
+ assertions {
+ layersTrace {
+ navBarLayerRotatesAndScales(Surface.ROTATION_0, rotation)
+ statusBarLayerRotatesScales(Surface.ROTATION_0, rotation)
+ appPairsDividerIsVisible()
+ appPairsPrimaryBoundsIsVisible(
+ rotation, primaryApp.defaultWindowName, 172776659)
+ appPairsSecondaryBoundsIsVisible(
+ rotation, secondaryApp.defaultWindowName, 172776659)
+ }
+ windowManagerTrace {
+ navBarWindowIsAlwaysVisible()
+ statusBarWindowIsAlwaysVisible()
+ end {
+ showsAppWindow(primaryApp.defaultWindowName)
+ .and().showsAppWindow(secondaryApp.defaultWindowName)
+ }
+ }
+ }
+ }
+ }
+
+ fun updateTasksId() {
+ if (primaryAppComponent != null) {
+ primaryTaskId = getTaskIdForActivity(
+ primaryAppComponent.packageName, primaryAppComponent.className).toString()
+ }
+ if (secondaryAppComponent != null) {
+ secondaryTaskId = getTaskIdForActivity(
+ secondaryAppComponent.packageName, secondaryAppComponent.className).toString()
+ }
+ }
+
+ companion object {
+ @Parameterized.Parameters(name = "{0}")
+ @JvmStatic
+ fun getParams(): Collection<Array<Any>> {
+ val supportedRotations = intArrayOf(Surface.ROTATION_90, Surface.ROTATION_270)
+ return supportedRotations.map { arrayOf(Surface.rotationToString(it), it) }
+ }
+ }
+} \ No newline at end of file
diff --git a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/AppPairsHelper.kt b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/AppPairsHelper.kt
index e2cda7ad123d..d77396f96ec2 100644
--- a/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/AppPairsHelper.kt
+++ b/libs/WindowManager/Shell/tests/flicker/src/com/android/wm/shell/flicker/helpers/AppPairsHelper.kt
@@ -18,7 +18,6 @@ package com.android.wm.shell.flicker.helpers
import android.app.Instrumentation
import android.graphics.Region
-import android.system.helpers.ActivityHelper
import com.android.server.wm.flicker.helpers.WindowUtils
import com.android.wm.shell.flicker.testapp.Components
@@ -31,8 +30,6 @@ class AppPairsHelper(
activityLabel,
componentsInfo
) {
- val activityHelper = ActivityHelper.getInstance()
-
fun getPrimaryBounds(dividerBounds: Region): android.graphics.Region {
val primaryAppBounds = Region(0, 0, dividerBounds.bounds.right,
dividerBounds.bounds.bottom + WindowUtils.dockedStackDividerInset)
@@ -47,10 +44,6 @@ class AppPairsHelper(
return secondaryAppBounds
}
- fun getTaskIdForActivity(pkgName: String, activityName: String): Int {
- return activityHelper.getTaskIdForActivity(pkgName, activityName)
- }
-
companion object {
const val TEST_REPETITIONS = 1
const val TIMEOUT_MS = 3_000L