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

Commit 5d44463a authored by Evan Rosky's avatar Evan Rosky
Browse files

De-Mock PhysicalDisplaySwitch transit tests

These tests had everything mocked out so they weren't
really testing anything besides some very specific
implementation details. This meant that any changes
to implementation required changes to the test and the
mocks. Also, if the mocked-out impl didn't do what was
expected, the tests wouldn't catch it.

This CL changes these tests to use WindowTestsBase so
that it can run against "real" code. Then this converts
mock-impl verifications to assertions on the *effects* of
calling the tested APIs.

Bug: 325114242
Test: atest PhysicalDisplaySwitchTransitionLauncherTest
Change-Id: I656cc8a1cfb836e1c0625519ff721a84c3c0d0cb
parent 22ce6097
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -267,7 +267,8 @@ class TransitionController {
        mSyncEngine.addOnIdleListener(this::tryStartCollectFromQueue);
    }

    private void detachPlayer() {
    @VisibleForTesting
    void detachPlayer() {
        if (mTransitionPlayer == null) return;
        // Immediately set to null so that nothing inadvertently starts/queues.
        mTransitionPlayer = null;
+43 −58
Original line number Diff line number Diff line
@@ -16,33 +16,23 @@

package com.android.server.wm;

import static android.view.WindowManager.TRANSIT_CHANGE;

import static com.android.internal.R.bool.config_unfoldTransitionEnabled;
import static com.android.server.wm.DeviceStateController.DeviceState.REAR;
import static com.android.server.wm.DeviceStateController.DeviceState.FOLDED;
import static com.android.server.wm.DeviceStateController.DeviceState.HALF_FOLDED;
import static com.android.server.wm.DeviceStateController.DeviceState.OPEN;

import static com.google.common.truth.Truth.assertThat;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.when;

import android.animation.ValueAnimator;
import android.annotation.Nullable;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.window.TransitionRequestInfo.DisplayChange;

import static com.android.internal.R.bool.config_unfoldTransitionEnabled;
import static com.android.server.wm.DeviceStateController.DeviceState.REAR;

import androidx.test.filters.SmallTest;

@@ -50,7 +40,6 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

@@ -62,20 +51,19 @@ import org.mockito.MockitoAnnotations;
 */
@SmallTest
@Presubmit
public class PhysicalDisplaySwitchTransitionLauncherTest {
@RunWith(WindowTestRunner.class)
public class PhysicalDisplaySwitchTransitionLauncherTest extends WindowTestsBase {

    @Mock
    DisplayContent mDisplayContent;
    @Mock
    Context mContext;
    @Mock
    Resources mResources;
    @Mock
    ActivityTaskManagerService mActivityTaskManagerService;
    @Mock
    BLASTSyncEngine mSyncEngine;
    @Mock

    WindowTestsBase.TestTransitionPlayer mPlayer;
    TransitionController mTransitionController;
    DisplayContent mDisplayContent;

    private PhysicalDisplaySwitchTransitionLauncher mTarget;
    private float mOriginalAnimationScale;
@@ -83,9 +71,14 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mTransitionController = new WindowTestsBase.TestTransitionController(mAtm);
        mTransitionController.setSyncEngine(mSyncEngine);
        mPlayer = new WindowTestsBase.TestTransitionPlayer(
                mTransitionController, mAtm.mWindowOrganizerController);
        when(mContext.getResources()).thenReturn(mResources);
        mTarget = new PhysicalDisplaySwitchTransitionLauncher(mDisplayContent,
                mActivityTaskManagerService, mContext, mTransitionController);
        mDisplayContent = new TestDisplayContent.Builder(mAtm, 100, 150).build();
        mTarget = new PhysicalDisplaySwitchTransitionLauncher(mDisplayContent, mAtm, mContext,
                mTransitionController);
        mOriginalAnimationScale = ValueAnimator.getDurationScale();
    }

@@ -100,24 +93,23 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
        mTarget.foldStateChanged(FOLDED);

        mTarget.foldStateChanged(OPEN);
        final Rect origBounds = new Rect();
        mDisplayContent.getBounds(origBounds);
        origBounds.offsetTo(0, 0);
        mTarget.requestDisplaySwitchTransitionIfNeeded(
                /* displayId= */ 123,
                /* oldDisplayWidth= */ 100,
                /* oldDisplayHeight= */ 150,
                mDisplayContent.getDisplayId(),
                origBounds.width(),
                origBounds.height(),
                /* newDisplayWidth= */ 200,
                /* newDisplayHeight= */ 250
        );

        ArgumentCaptor<DisplayChange> displayChangeArgumentCaptor =
                ArgumentCaptor.forClass(DisplayChange.class);
        verify(mTransitionController).requestTransitionIfNeeded(eq(TRANSIT_CHANGE), /* flags= */
                eq(0), eq(mDisplayContent), eq(mDisplayContent), /* remoteTransition= */ isNull(),
                displayChangeArgumentCaptor.capture());
        assertThat(displayChangeArgumentCaptor.getValue().getDisplayId()).isEqualTo(123);
        assertThat(displayChangeArgumentCaptor.getValue().getStartAbsBounds()).isEqualTo(
                new Rect(0, 0, 100, 150));
        assertThat(displayChangeArgumentCaptor.getValue().getEndAbsBounds()).isEqualTo(
                new Rect(0, 0, 200, 250));
        assertNotNull(mPlayer.mLastRequest);
        assertEquals(mDisplayContent.getDisplayId(),
                mPlayer.mLastRequest.getDisplayChange().getDisplayId());
        assertEquals(origBounds, mPlayer.mLastRequest.getDisplayChange().getStartAbsBounds());
        assertEquals(new Rect(0, 0, 200, 250),
                mPlayer.mLastRequest.getDisplayChange().getEndAbsBounds());
    }

    @Test
@@ -148,7 +140,7 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
        mTarget.foldStateChanged(FOLDED);
        mTarget.foldStateChanged(OPEN);
        requestDisplaySwitch();
        clearInvocations(mTransitionController);
        mPlayer.mLastRequest = null;

        requestDisplaySwitch();

@@ -220,7 +212,6 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {

    @Test
    public void testDisplaySwitchAfterUnfolding_otherCollectingTransition_collectsDisplaySwitch() {
        givenCollectingTransition(createTransition(TRANSIT_CHANGE));
        givenAllAnimationsEnabled();
        mTarget.foldStateChanged(FOLDED);

@@ -228,7 +219,8 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
        requestDisplaySwitch();

        // Collects to the current transition
        verify(mTransitionController).collect(mDisplayContent);
        assertTrue(mTransitionController.getCollectingTransition().mParticipants.contains(
                mDisplayContent));
    }


@@ -245,20 +237,18 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
    }

    private void assertTransitionRequested() {
        verify(mTransitionController).requestTransitionIfNeeded(anyInt(), anyInt(), any(), any(),
                any(), any());
        assertNotNull(mPlayer.mLastRequest);
    }

    private void assertTransitionNotRequested() {
        verify(mTransitionController, never()).requestTransitionIfNeeded(anyInt(), anyInt(), any(),
                any(), any(), any());
        assertNull(mPlayer.mLastRequest);
    }

    private void requestDisplaySwitch() {
        mTarget.requestDisplaySwitchTransitionIfNeeded(
                /* displayId= */ 123,
                /* oldDisplayWidth= */ 100,
                /* oldDisplayHeight= */ 150,
                mDisplayContent.getDisplayId(),
                mDisplayContent.getBounds().width(),
                mDisplayContent.getBounds().height(),
                /* newDisplayWidth= */ 200,
                /* newDisplayHeight= */ 250
        );
@@ -280,16 +270,11 @@ public class PhysicalDisplaySwitchTransitionLauncherTest {
    }

    private void givenShellTransitionsEnabled(boolean enabled) {
        when(mTransitionController.isShellTransitionsEnabled()).thenReturn(enabled);
    }

    private void givenCollectingTransition(@Nullable Transition transition) {
        when(mTransitionController.isCollecting()).thenReturn(transition != null);
        when(mTransitionController.getCollectingTransition()).thenReturn(transition);
        if (enabled) {
            mTransitionController.registerTransitionPlayer(mPlayer, null /* proc */);
        } else {
            mTransitionController.detachPlayer();
        }

    private Transition createTransition(int type) {
        return new Transition(type, /* flags= */ 0, mTransitionController, mSyncEngine);
    }

    private void givenDisplayContentHasContent(boolean hasContent) {