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

Commit 73895dcc authored by Massimo Carli's avatar Massimo Carli Committed by Android (Google) Code Review
Browse files

Merge "[19/n] Make LetterboxControllerRobotTest more generic" into main

parents 95c04019 a061f835
Loading
Loading
Loading
Loading
+10 −25
Original line number Diff line number Diff line
@@ -16,10 +16,8 @@

package com.android.wm.shell.compatui.letterbox

import android.content.Context
import android.graphics.Rect
import android.view.SurfaceControl
import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import org.mockito.kotlin.any
import org.mockito.kotlin.clearInvocations
@@ -31,10 +29,7 @@ import org.mockito.kotlin.verify
/**
 * Robot to test [LetterboxController] implementations.
 */
open class LetterboxControllerRobotTest(
    ctx: Context,
    controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController
) {
abstract class LetterboxControllerRobotTest {

    companion object {
        @JvmStatic
@@ -44,21 +39,21 @@ open class LetterboxControllerRobotTest(
        private val TASK_ID = 20
    }

    private val letterboxConfiguration: LetterboxConfiguration
    private val surfaceBuilder: LetterboxSurfaceBuilder
    private val letterboxController: LetterboxController
    private val transaction: SurfaceControl.Transaction
    private val parentLeash: SurfaceControl
    lateinit var letterboxController: LetterboxController
    val transaction: SurfaceControl.Transaction
    val parentLeash: SurfaceControl

    init {
        letterboxConfiguration = LetterboxConfiguration(ctx)
        surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
        letterboxController = controllerBuilder(surfaceBuilder)
        transaction = getTransactionMock()
        parentLeash = mock<SurfaceControl>()
        spyOn(surfaceBuilder)
    }

    fun initController() {
        letterboxController = buildController()
    }

    abstract fun buildController(): LetterboxController

    fun sendCreateSurfaceRequest(
        displayId: Int = DISPLAY_ID,
        taskId: Int = TASK_ID
@@ -102,16 +97,6 @@ open class LetterboxControllerRobotTest(
        letterboxController.dump()
    }

    fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
        verify(surfaceBuilder, times(times)).createSurface(
            eq(transaction),
            eq(parentLeash),
            name.asAnyMode(),
            callSite.asAnyMode(),
            any()
        )
    }

    fun checkTransactionRemovedInvoked(times: Int = 1) {
        verify(transaction, times(times)).remove(any())
    }
+25 −33
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.wm.shell.compatui.letterbox

import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import android.view.SurfaceControl
@@ -44,24 +43,14 @@ import org.mockito.kotlin.verify
@SmallTest
class LetterboxUtilsTest : ShellTestCase() {

    val firstLetterboxController = mock<LetterboxController>()
    val secondLetterboxController = mock<LetterboxController>()
    val thirdLetterboxController = mock<LetterboxController>()

    private val letterboxControllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController =
        { _ ->
            firstLetterboxController.append(secondLetterboxController)
                .append(thirdLetterboxController)
        }

    @Test
    fun `Appended LetterboxController invoked creation on all the controllers`() {
        runTestScenario { r ->
            r.sendCreateSurfaceRequest()

            r.verifyCreateSurfaceInvokedWithRequest(target = firstLetterboxController)
            r.verifyCreateSurfaceInvokedWithRequest(target = secondLetterboxController)
            r.verifyCreateSurfaceInvokedWithRequest(target = thirdLetterboxController)
            r.verifyCreateSurfaceInvokedWithRequest(target = r.firstLetterboxController)
            r.verifyCreateSurfaceInvokedWithRequest(target = r.secondLetterboxController)
            r.verifyCreateSurfaceInvokedWithRequest(target = r.thirdLetterboxController)
        }
    }

@@ -69,9 +58,9 @@ class LetterboxUtilsTest : ShellTestCase() {
    fun `Appended LetterboxController invoked destroy on all the controllers`() {
        runTestScenario { r ->
            r.sendDestroySurfaceRequest()
            r.verifyDestroySurfaceInvokedWithRequest(target = firstLetterboxController)
            r.verifyDestroySurfaceInvokedWithRequest(target = secondLetterboxController)
            r.verifyDestroySurfaceInvokedWithRequest(target = thirdLetterboxController)
            r.verifyDestroySurfaceInvokedWithRequest(target = r.firstLetterboxController)
            r.verifyDestroySurfaceInvokedWithRequest(target = r.secondLetterboxController)
            r.verifyDestroySurfaceInvokedWithRequest(target = r.thirdLetterboxController)
        }
    }

@@ -79,9 +68,9 @@ class LetterboxUtilsTest : ShellTestCase() {
    fun `Appended LetterboxController invoked update visibility on all the controllers`() {
        runTestScenario { r ->
            r.sendUpdateSurfaceVisibilityRequest(visible = true)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = firstLetterboxController)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = secondLetterboxController)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = thirdLetterboxController)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.firstLetterboxController)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.secondLetterboxController)
            r.verifyUpdateVisibilitySurfaceInvokedWithRequest(target = r.thirdLetterboxController)
        }
    }

@@ -89,9 +78,9 @@ class LetterboxUtilsTest : ShellTestCase() {
    fun `Appended LetterboxController invoked update bounds on all the controllers`() {
        runTestScenario { r ->
            r.sendUpdateSurfaceBoundsRequest(taskBounds = Rect(), activityBounds = Rect())
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = firstLetterboxController)
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = secondLetterboxController)
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = thirdLetterboxController)
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.firstLetterboxController)
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.secondLetterboxController)
            r.verifyUpdateSurfaceBoundsInvokedWithRequest(target = r.thirdLetterboxController)
        }
    }

@@ -99,9 +88,9 @@ class LetterboxUtilsTest : ShellTestCase() {
    fun `Appended LetterboxController invoked update dump on all the controllers`() {
        runTestScenario { r ->
            r.invokeDump()
            r.verifyDumpInvoked(target = firstLetterboxController)
            r.verifyDumpInvoked(target = secondLetterboxController)
            r.verifyDumpInvoked(target = thirdLetterboxController)
            r.verifyDumpInvoked(target = r.firstLetterboxController)
            r.verifyDumpInvoked(target = r.secondLetterboxController)
            r.verifyDumpInvoked(target = r.thirdLetterboxController)
        }
    }

@@ -138,21 +127,20 @@ class LetterboxUtilsTest : ShellTestCase() {
     * Runs a test scenario providing a Robot.
     */
    fun runTestScenario(consumer: Consumer<AppendLetterboxControllerRobotTest>) {
        val robot = AppendLetterboxControllerRobotTest(mContext, letterboxControllerBuilder)
        consumer.accept(robot)
        consumer.accept(AppendLetterboxControllerRobotTest().apply { initController() })
    }

    class AppendLetterboxControllerRobotTest(
        ctx: Context,
        builder: (LetterboxSurfaceBuilder) -> LetterboxController
    ) : LetterboxControllerRobotTest(ctx, builder) {
    class AppendLetterboxControllerRobotTest : LetterboxControllerRobotTest() {

        val firstLetterboxController = mock<LetterboxController>()
        val secondLetterboxController = mock<LetterboxController>()
        val thirdLetterboxController = mock<LetterboxController>()

        private var testableMap = mutableMapOf<Int, Int>()
        private var onItemState: Int? = null
        private var onMissingStateKey: Int? = null
        private var onMissingStateMap: MutableMap<Int, Int>? = null

        private val transaction = getTransactionMock()
        private val surface = SurfaceControl()

        fun verifyCreateSurfaceInvokedWithRequest(
@@ -230,5 +218,9 @@ class LetterboxUtilsTest : ShellTestCase() {
        fun verifySetWindowCrop(expectedWidth: Int, expectedHeight: Int) {
            verify(transaction).setWindowCrop(surface, expectedWidth, expectedHeight)
        }

        override fun buildController(): LetterboxController =
            firstLetterboxController.append(secondLetterboxController)
                .append(thirdLetterboxController)
    }
}
+25 −43
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

package com.android.wm.shell.compatui.letterbox

import android.content.Context
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.wm.shell.ShellTestCase
@@ -64,65 +63,48 @@ class MixedLetterboxControllerTest : ShellTestCase() {
     * Runs a test scenario providing a Robot.
     */
    fun runTestScenario(consumer: Consumer<MixedLetterboxControllerRobotTest>) {
        val robot = MixedLetterboxControllerRobotTest(mContext, ObjectToTestHolder())
        consumer.accept(robot)
        consumer.accept(MixedLetterboxControllerRobotTest().apply { initController() })
    }

    class MixedLetterboxControllerRobotTest(
        ctx: Context,
        private val objectToTestHolder: ObjectToTestHolder
    ) : LetterboxControllerRobotTest(ctx, objectToTestHolder.controllerBuilder) {
    class MixedLetterboxControllerRobotTest : LetterboxControllerRobotTest() {
        val singleLetterboxController: SingleSurfaceLetterboxController =
            mock<SingleSurfaceLetterboxController>()
        val multipleLetterboxController: MultiSurfaceLetterboxController =
            mock<MultiSurfaceLetterboxController>()
        val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>()

        fun configureStrategyFor(letterboxMode: LetterboxMode) {
            doReturn(letterboxMode).`when`(objectToTestHolder.controllerStrategy)
                .getLetterboxImplementationMode()
            doReturn(letterboxMode).`when`(controllerStrategy).getLetterboxImplementationMode()
        }

        fun checkCreateInvokedOnSingleController(times: Int = 1) {
            verify(
                objectToTestHolder.singleLetterboxController,
                times(times)
            ).createLetterboxSurface(any(), any(), any())
            verify(singleLetterboxController, times(times)).createLetterboxSurface(
                any(),
                any(),
                any()
            )
        }

        fun checkCreateInvokedOnMultiController(times: Int = 1) {
            verify(
                objectToTestHolder.multipleLetterboxController,
                times(times)
            ).createLetterboxSurface(any(), any(), any())
            verify(multipleLetterboxController, times(times)).createLetterboxSurface(
                any(),
                any(),
                any()
            )
        }

        fun checkDestroyInvokedOnSingleController(times: Int = 1) {
            verify(
                objectToTestHolder.singleLetterboxController,
                times(times)
            ).destroyLetterboxSurface(any(), any())
            verify(singleLetterboxController, times(times)).destroyLetterboxSurface(any(), any())
        }

        fun checkDestroyInvokedOnMultiController(times: Int = 1) {
            verify(
                objectToTestHolder.multipleLetterboxController,
                times(times)
            ).destroyLetterboxSurface(any(), any())
        }
            verify(multipleLetterboxController, times(times)).destroyLetterboxSurface(any(), any())
        }

    data class ObjectToTestHolder(
        val singleLetterboxController: SingleSurfaceLetterboxController =
        mock<SingleSurfaceLetterboxController>(),
        val multipleLetterboxController: MultiSurfaceLetterboxController =
        mock<MultiSurfaceLetterboxController>(),
        val controllerStrategy: LetterboxControllerStrategy = mock<LetterboxControllerStrategy>()
    ) {

        private val mixedController =
            MixedLetterboxController(
        override fun buildController(): LetterboxController = MixedLetterboxController(
            singleLetterboxController,
            multipleLetterboxController,
            controllerStrategy
        )

        val controllerBuilder: (LetterboxSurfaceBuilder) -> LetterboxController =
            { _ -> mixedController }
    }
}
+35 −4
Original line number Diff line number Diff line
@@ -16,13 +16,20 @@

package com.android.wm.shell.compatui.letterbox

import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import java.util.function.Consumer
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.times
import org.mockito.kotlin.verify

/**
 * Tests for [MultiSurfaceLetterboxController].
@@ -147,9 +154,33 @@ class MultiSurfaceLetterboxControllerTest : ShellTestCase() {
    /**
     * Runs a test scenario providing a Robot.
     */
    fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) {
        val robot =
            LetterboxControllerRobotTest(mContext, { sb -> MultiSurfaceLetterboxController(sb) })
        consumer.accept(robot)
    fun runTestScenario(consumer: Consumer<MultiLetterboxControllerRobotTest>) {
        consumer.accept(MultiLetterboxControllerRobotTest(mContext).apply { initController() })
    }

    class MultiLetterboxControllerRobotTest(context: Context) :
        LetterboxControllerRobotTest() {

        private val letterboxConfiguration: LetterboxConfiguration
        private val surfaceBuilder: LetterboxSurfaceBuilder

        init {
            letterboxConfiguration = LetterboxConfiguration(context)
            surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
            spyOn(surfaceBuilder)
        }

        override fun buildController(): LetterboxController =
            MultiSurfaceLetterboxController(surfaceBuilder)

        fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
            verify(surfaceBuilder, times(times)).createSurface(
                eq(transaction),
                eq(parentLeash),
                name.asAnyMode(),
                callSite.asAnyMode(),
                any()
            )
        }
    }
}
+35 −4
Original line number Diff line number Diff line
@@ -16,13 +16,20 @@

package com.android.wm.shell.compatui.letterbox

import android.content.Context
import android.graphics.Rect
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn
import com.android.wm.shell.ShellTestCase
import com.android.wm.shell.compatui.letterbox.LetterboxMatchers.asAnyMode
import java.util.function.Consumer
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.eq
import org.mockito.kotlin.times
import org.mockito.kotlin.verify

/**
 * Tests for [SingleSurfaceLetterboxController].
@@ -120,9 +127,33 @@ class SingleSurfaceLetterboxControllerTest : ShellTestCase() {
    /**
     * Runs a test scenario providing a Robot.
     */
    fun runTestScenario(consumer: Consumer<LetterboxControllerRobotTest>) {
        val robot =
            LetterboxControllerRobotTest(mContext, { sb -> SingleSurfaceLetterboxController(sb) })
        consumer.accept(robot)
    fun runTestScenario(consumer: Consumer<SingleLetterboxControllerRobotTest>) {
        consumer.accept(SingleLetterboxControllerRobotTest(mContext).apply { initController() })
    }

    class SingleLetterboxControllerRobotTest(context: Context) :
        LetterboxControllerRobotTest() {

        private val letterboxConfiguration: LetterboxConfiguration
        private val surfaceBuilder: LetterboxSurfaceBuilder

        init {
            letterboxConfiguration = LetterboxConfiguration(context)
            surfaceBuilder = LetterboxSurfaceBuilder(letterboxConfiguration)
            spyOn(surfaceBuilder)
        }

        override fun buildController(): LetterboxController =
            SingleSurfaceLetterboxController(surfaceBuilder)

        fun checkSurfaceBuilderInvoked(times: Int = 1, name: String = "", callSite: String = "") {
            verify(surfaceBuilder, times(times)).createSurface(
                eq(transaction),
                eq(parentLeash),
                name.asAnyMode(),
                callSite.asAnyMode(),
                any()
            )
        }
    }
}