Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5b727ad authored by Nataniel Borges's avatar Nataniel Borges
Browse files

Create base test class with general assertions

Also, move common pip tv test class to tv package

Bug: 234735502
Test: atest FlickerTests
Change-Id: Id3219cf44cb9a117efc5408afd957841b1ad76ed
parent e172dbcc
Loading
Loading
Loading
Loading
+161 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2022 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

import android.app.Instrumentation
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.FlickerTestParameter
import com.android.server.wm.flicker.dsl.FlickerBuilder
import com.android.server.wm.flicker.entireScreenCovered
import com.android.server.wm.flicker.navBarLayerIsVisibleAtStartAndEnd
import com.android.server.wm.flicker.navBarLayerPositionAtStartAndEnd
import com.android.server.wm.flicker.navBarWindowIsAlwaysVisible
import com.android.server.wm.flicker.statusBarLayerIsVisibleAtStartAndEnd
import com.android.server.wm.flicker.statusBarLayerPositionAtStartAndEnd
import com.android.server.wm.flicker.statusBarWindowIsAlwaysVisible
import com.android.server.wm.flicker.taskBarLayerIsVisibleAtStartAndEnd
import com.android.server.wm.flicker.taskBarWindowIsAlwaysVisible
import com.android.server.wm.traces.common.ComponentMatcher
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import org.junit.Assume

/**
 * Base test class containing common assertions for [ComponentMatcher.NAV_BAR],
 * [ComponentMatcher.TASK_BAR], [ComponentMatcher.STATUS_BAR], and general assertions
 * (layers visible in consecutive states, entire screen covered, etc.)
 */
abstract class BaseTest @JvmOverloads constructor(
    protected val testSpec: FlickerTestParameter,
    protected val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation(),
    protected val tapl: LauncherInstrumentation = LauncherInstrumentation()
) {
    init {
        testSpec.setIsTablet(
            WindowManagerStateHelper(instrumentation).currentState.wmState.isTablet
        )
    }

    /**
     * Specification of the test transition to execute
     */
    abstract val transition: FlickerBuilder.() -> Unit

    /**
     * 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 {
            setup {
                test {
                    testSpec.setIsTablet(wmHelper.currentState.wmState.isTablet)
                }
            }
            transition()
        }
    }

    /**
     * Checks that all parts of the screen are covered during the transition
     */
    open fun entireScreenCovered() = testSpec.entireScreenCovered()

    /**
     * Checks that the [ComponentMatcher.NAV_BAR] layer is visible during the whole transition
     */
    open fun navBarLayerIsVisibleAtStartAndEnd() {
        Assume.assumeFalse(testSpec.isTablet)
        testSpec.navBarLayerIsVisibleAtStartAndEnd()
    }

    /**
     * Checks the position of the [ComponentMatcher.NAV_BAR] at the start and end of the transition
     */
    open fun navBarLayerPositionAtStartAndEnd() {
        Assume.assumeFalse(testSpec.isTablet)
        testSpec.navBarLayerPositionAtStartAndEnd()
    }

    /**
     * Checks that the [ComponentMatcher.NAV_BAR] window is visible during the whole transition
     *
     * Note: Phones only
     */
    open fun navBarWindowIsAlwaysVisible() {
        Assume.assumeFalse(testSpec.isTablet)
        testSpec.navBarWindowIsAlwaysVisible()
    }

    /**
     * Checks that the [ComponentMatcher.TASK_BAR] layer is visible during the whole transition
     */
    open fun taskBarLayerIsVisibleAtStartAndEnd() {
        Assume.assumeTrue(testSpec.isTablet)
        testSpec.taskBarLayerIsVisibleAtStartAndEnd()
    }

    /**
     * Checks that the [ComponentMatcher.TASK_BAR] window is visible during the whole transition
     *
     * Note: Large screen only
     */
    open fun taskBarWindowIsAlwaysVisible() {
        Assume.assumeTrue(testSpec.isTablet)
        testSpec.taskBarWindowIsAlwaysVisible()
    }

    /**
     * Checks that the [ComponentMatcher.STATUS_BAR] layer is visible during the whole transition
     */
    open fun statusBarLayerIsVisibleAtStartAndEnd() =
        testSpec.statusBarLayerIsVisibleAtStartAndEnd()

    /**
     * Checks the position of the [ComponentMatcher.STATUS_BAR] at the start and end of the transition
     */
    open fun statusBarLayerPositionAtStartAndEnd() = testSpec.statusBarLayerPositionAtStartAndEnd()

    /**
     * Checks that the [ComponentMatcher.STATUS_BAR] window is visible during the whole transition
     */
    open fun statusBarWindowIsAlwaysVisible() {
        testSpec.statusBarWindowIsAlwaysVisible()
    }

    /**
     * Checks that all layers that are visible on the trace, are visible for at least 2
     * consecutive entries.
     */
    open fun visibleLayersShownMoreThanOneConsecutiveEntry() {
        testSpec.assertLayers {
            this.visibleLayersShownMoreThanOneConsecutiveEntry()
        }
    }

    /**
     * Checks that all windows that are visible on the trace, are visible for at least 2
     * consecutive entries.
     */
    open fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
        testSpec.assertWm {
            this.visibleWindowsShownMoreThanOneConsecutiveEntry()
        }
    }
}
+0 −37
Original line number Original line Diff line number Diff line
/*
 * 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.pip

import com.android.wm.shell.flicker.FlickerTestBase
import com.android.wm.shell.flicker.helpers.PipAppHelper
import org.junit.Before

abstract class PipTestBase(
    rotationName: String,
    rotation: Int
) : FlickerTestBase(rotationName, rotation) {
    protected val testApp = PipAppHelper(instrumentation)

    @Before
    override fun televisionSetUp() {
        /**
         * The super implementation assumes ([org.junit.Assume]) that not running on TV, thus
         * disabling the test on TV. This test, however, *should run on TV*, so we overriding this
         * method and simply leaving it blank.
         */
    }
}
+14 −21
Original line number Original line Diff line number Diff line
/*
/*
 * Copyright (C) 2020 The Android Open Source Project
 * Copyright (C) 2022 The Android Open Source Project
 *
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * you may not use this file except in compliance with the License.
@@ -14,29 +14,18 @@
 * limitations under the License.
 * limitations under the License.
 */
 */


package com.android.wm.shell.flicker
package com.android.wm.shell.flicker.pip.tv


import android.app.Instrumentation
import android.app.Instrumentation
import android.content.pm.PackageManager
import android.content.pm.PackageManager
import android.content.pm.PackageManager.FEATURE_LEANBACK
import android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY
import android.view.Surface
import android.view.Surface
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.UiDevice
import androidx.test.uiautomator.UiDevice
import org.junit.Assume.assumeFalse
import com.android.wm.shell.flicker.helpers.PipAppHelper
import org.junit.Before
import org.junit.Before
import org.junit.runners.Parameterized
import org.junit.runners.Parameterized


/**
abstract class PipTestBase(
 * Base class of all Flicker test that performs common functions for all flicker tests:
 *
 * - Caches transitions so that a transition is run once and the transition results are used by
 * tests multiple times. This is needed for parameterized tests which call the BeforeClass methods
 * multiple times.
 * - Keeps track of all test artifacts and deletes ones which do not need to be reviewed.
 * - Fails tests if results are not available for any test due to jank.
 */
abstract class FlickerTestBase(
    protected val rotationName: String,
    protected val rotationName: String,
    protected val rotation: Int
    protected val rotation: Int
) {
) {
@@ -45,16 +34,20 @@ abstract class FlickerTestBase(
    val packageManager: PackageManager = instrumentation.context.packageManager
    val packageManager: PackageManager = instrumentation.context.packageManager
    protected val isTelevision: Boolean by lazy {
    protected val isTelevision: Boolean by lazy {
        packageManager.run {
        packageManager.run {
            hasSystemFeature(FEATURE_LEANBACK) || hasSystemFeature(FEATURE_LEANBACK_ONLY)
            hasSystemFeature(PackageManager.FEATURE_LEANBACK) ||
                hasSystemFeature(PackageManager.FEATURE_LEANBACK_ONLY)
        }
        }
    }
    }
    protected val testApp = PipAppHelper(instrumentation)


    @Before
    open fun televisionSetUp() {
        /**
        /**
     * By default WmShellFlickerTests do not run on TV devices.
         * The super implementation assumes ([org.junit.Assume]) that not running on TV, thus
     * If the test should run on TV - it should override this method.
         * disabling the test on TV. This test, however, *should run on TV*, so we overriding this
         * method and simply leaving it blank.
         */
         */
    @Before
    }
    open fun televisionSetUp() = assumeFalse(isTelevision)


    companion object {
    companion object {
        @Parameterized.Parameters(name = "{0}")
        @Parameterized.Parameters(name = "{0}")
+0 −1
Original line number Original line Diff line number Diff line
@@ -25,7 +25,6 @@ import android.view.Surface.rotationToString
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.server.wm.traces.parser.windowmanager.WindowManagerStateHelper
import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME
import com.android.wm.shell.flicker.SYSTEM_UI_PACKAGE_NAME
import com.android.wm.shell.flicker.pip.PipTestBase
import org.junit.After
import org.junit.After
import org.junit.Assert.assertFalse
import org.junit.Assert.assertFalse
import org.junit.Assume.assumeTrue
import org.junit.Assume.assumeTrue