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

Commit ded47e0d authored by Sergey Nikolaienkov's avatar Sergey Nikolaienkov Committed by Android (Google) Code Review
Browse files

Merge "Report if SystemUI crashes during TV Pip tests"

parents e0c10181 44ede0b9
Loading
Loading
Loading
Loading
+46 −0
Original line number Diff line number Diff line
@@ -16,13 +16,19 @@

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

import android.app.ActivityManager
import android.app.IActivityManager
import android.app.IProcessObserver
import android.content.pm.PackageManager.FEATURE_LEANBACK
import android.content.pm.PackageManager.FEATURE_LEANBACK_ONLY
import android.os.SystemClock
import android.view.Surface.ROTATION_0
import android.view.Surface.rotationToString
import com.android.server.wm.flicker.helpers.wakeUpAndGoToHomeScreen
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.Assert.assertFalse
import org.junit.Assume
import org.junit.Before

@@ -33,21 +39,61 @@ abstract class TvPipTestBase(rotationName: String, rotation: Int)
        get() = packageManager.run {
            hasSystemFeature(FEATURE_LEANBACK) || hasSystemFeature(FEATURE_LEANBACK_ONLY)
        }
    private val systemUiProcessObserver = SystemUiProcessObserver()

    @Before
    open fun setUp() {
        Assume.assumeTrue(isTelevision)

        systemUiProcessObserver.start()

        uiDevice.wakeUpAndGoToHomeScreen()
    }

    @After
    open fun tearDown() {
        Assume.assumeTrue(isTelevision)

        testApp.forceStop()

        // Wait for 1 second, and check if the SystemUI has been alive and well since the start.
        SystemClock.sleep(AFTER_TEXT_PROCESS_CHECK_DELAY)
        systemUiProcessObserver.stop()
        assertFalse("SystemUI has died during test execution", systemUiProcessObserver.hasDied)
    }

    protected fun fail(message: String): Nothing = throw AssertionError(message)

    inner class SystemUiProcessObserver : IProcessObserver.Stub() {
        private val activityManager: IActivityManager = ActivityManager.getService()
        private val uiAutomation = instrumentation.uiAutomation
        private val systemUiUid = packageManager.getPackageUid(SYSTEM_UI_PACKAGE_NAME, 0)
        var hasDied: Boolean = false

        fun start() {
            hasDied = false
            uiAutomation.adoptShellPermissionIdentity(
                    android.Manifest.permission.SET_ACTIVITY_WATCHER)
            activityManager.registerProcessObserver(this)
        }

        fun stop() {
            activityManager.unregisterProcessObserver(this)
            uiAutomation.dropShellPermissionIdentity()
        }

        override fun onForegroundActivitiesChanged(pid: Int, uid: Int, foreground: Boolean) {}

        override fun onForegroundServicesChanged(pid: Int, uid: Int, serviceTypes: Int) {}

        override fun onProcessDied(pid: Int, uid: Int) {
            if (uid == systemUiUid) hasDied = true
        }
    }

    companion object {
        private const val AFTER_TEXT_PROCESS_CHECK_DELAY = 1_000L // 1 sec

        @JvmStatic
        protected val rotationParams: Collection<Array<Any>> =
                listOf(arrayOf(rotationToString(ROTATION_0), ROTATION_0))