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

Commit 4a7fafcb authored by Nataniel Borges's avatar Nataniel Borges
Browse files

Fix StaleObjectException on bubble tests

A UiObject2 instance is recycled internally and reusing it multiple times causes instability. Instead, obtain the instance before each use.

Also fix warnings by using Kotlin-style code

Test: atest WMShellFlickerTests:com.android.wm.shell.flicker.bubble
Bug: 203544263
Change-Id: Ie0c88d02ea420a4b5f5f9de77bbbafe4b7412118
parent 93ef9920
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.uiautomator.By
import androidx.test.uiautomator.UiObject2
import androidx.test.uiautomator.Until
import com.android.server.wm.flicker.Flicker
import com.android.server.wm.flicker.FlickerBuilderProvider
import com.android.server.wm.flicker.FlickerTestParameter
import com.android.server.wm.flicker.FlickerTestParameterFactory
@@ -47,13 +48,9 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
    protected val notifyManager = INotificationManager.Stub.asInterface(
            ServiceManager.getService(Context.NOTIFICATION_SERVICE))

    protected val packageManager = context.getPackageManager()
    protected val uid = packageManager.getApplicationInfo(
    protected val uid = context.packageManager.getApplicationInfo(
            testApp.component.packageName, 0).uid

    protected lateinit var addBubbleBtn: UiObject2
    protected lateinit var cancelAllBtn: UiObject2

    protected abstract val transition: FlickerBuilder.(Map<String, Any?>) -> Unit

    @JvmOverloads
@@ -67,10 +64,8 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
                    notifyManager.setBubblesAllowed(testApp.component.packageName,
                            uid, NotificationManager.BUBBLE_PREFERENCE_ALL)
                    testApp.launchViaIntent(wmHelper)
                    addBubbleBtn = device.wait(Until.findObject(
                            By.text("Add Bubble")), FIND_OBJECT_TIMEOUT)
                    cancelAllBtn = device.wait(Until.findObject(
                            By.text("Cancel All Bubble")), FIND_OBJECT_TIMEOUT)
                    waitAndGetAddBubbleBtn()
                    waitAndGetCancelAllBtn()
                }
            }

@@ -84,6 +79,11 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
        }
    }

    protected fun Flicker.waitAndGetAddBubbleBtn(): UiObject2? = device.wait(Until.findObject(
            By.text("Add Bubble")), FIND_OBJECT_TIMEOUT)
    protected fun Flicker.waitAndGetCancelAllBtn(): UiObject2? = device.wait(Until.findObject(
            By.text("Cancel All Bubble")), FIND_OBJECT_TIMEOUT)

    @FlickerBuilderProvider
    fun buildFlicker(): FlickerBuilder {
        return FlickerBuilder(instrumentation).apply {
@@ -102,7 +102,6 @@ abstract class BaseBubbleScreen(protected val testSpec: FlickerTestParameter) {
        }

        const val FIND_OBJECT_TIMEOUT = 2000L
        const val WINDOW_UPDAT_TIMEOUT = 2000L
        const val SYSTEM_UI_PACKAGE = SYSTEMUI_PACKAGE
        const val BUBBLE_RES_NAME = "bubble_view"
    }
+6 −5
Original line number Diff line number Diff line
@@ -46,18 +46,19 @@ import org.junit.runners.Parameterized
@Group4
class DismissBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {

    val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    val displaySize = DisplayMetrics()
    private val wm = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
    private val displaySize = DisplayMetrics()

    override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
        get() = buildTransition() {
        get() = buildTransition {
            setup {
                eachRun {
                    addBubbleBtn?.run { addBubbleBtn.click() } ?: error("Add Bubble not found")
                    val addBubbleBtn = waitAndGetAddBubbleBtn()
                    addBubbleBtn?.click() ?: error("Add Bubble not found")
                }
            }
            transitions {
                wm?.run { wm.getDefaultDisplay().getMetrics(displaySize) } ?: error("WM not found")
                wm.run { wm.getDefaultDisplay().getMetrics(displaySize) }
                val dist = Point((displaySize.widthPixels / 2), displaySize.heightPixels)
                val showBubble = device.wait(Until.findObject(
                        By.res(SYSTEM_UI_PACKAGE, BUBBLE_RES_NAME)), FIND_OBJECT_TIMEOUT)
+3 −2
Original line number Diff line number Diff line
@@ -45,10 +45,11 @@ import org.junit.runners.Parameterized
class ExpandBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {

    override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
        get() = buildTransition() {
        get() = buildTransition {
            setup {
                test {
                    addBubbleBtn?.run { addBubbleBtn.click() } ?: error("Bubble widget not found")
                    val addBubbleBtn = waitAndGetAddBubbleBtn()
                    addBubbleBtn?.click() ?: error("Add Bubble not found")
                }
            }
            transitions {
+9 −8
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.wm.shell.flicker.bubble

import android.os.SystemClock
import androidx.test.filters.FlakyTest
import androidx.test.filters.RequiresDevice
import androidx.test.uiautomator.By
@@ -44,31 +43,33 @@ import org.junit.runners.Parameterized
class LaunchBubbleFromLockScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {

    override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
        get() = buildTransition() {
        get() = buildTransition {
            setup {
                eachRun {
                    val addBubbleBtn = waitAndGetAddBubbleBtn()
                    addBubbleBtn?.click() ?: error("Bubble widget not found")
                    device.sleep()
                    SystemClock.sleep(2000)
                    device.wakeUp()
                    wmHelper.waitFor("noAppWindowsOnTop") {
                        it.wmState.topVisibleAppWindow.isEmpty()
                    }
                }
            }
            transitions {
                val notification = device.wait(Until.findObject(
                    By.text("BubbleChat")), FIND_OBJECT_TIMEOUT)
                notification?.click() ?: error("Notification not found")
                instrumentation.getUiAutomation().syncInputTransactions()
                instrumentation.uiAutomation.syncInputTransactions()
                val showBubble = device.wait(Until.findObject(
                        By.res("com.android.systemui", "bubble_view")), FIND_OBJECT_TIMEOUT)
                showBubble?.click() ?: error("Bubble notify not found")
                instrumentation.getUiAutomation().syncInputTransactions()
                instrumentation.uiAutomation.syncInputTransactions()
                val cancelAllBtn = waitAndGetCancelAllBtn()
                cancelAllBtn?.click() ?: error("Cancel widget not found")
            }
        }

    @FlakyTest
    @Test
    fun testAppisVisibleAtEnd() {
    fun testAppIsVisibleAtEnd() {
        testSpec.assertLayersEnd {
            this.isVisible(testApp.component)
        }
+3 −2
Original line number Diff line number Diff line
@@ -42,9 +42,10 @@ import org.junit.runners.Parameterized
class LaunchBubbleScreen(testSpec: FlickerTestParameter) : BaseBubbleScreen(testSpec) {

    override val transition: FlickerBuilder.(Map<String, Any?>) -> Unit
        get() = buildTransition() {
        get() = buildTransition {
            transitions {
                addBubbleBtn?.run { addBubbleBtn.click() } ?: error("Bubble widget not found")
                val addBubbleBtn = waitAndGetAddBubbleBtn()
                addBubbleBtn?.click() ?: error("Bubble widget not found")
            }
        }

Loading