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

Commit 78ecb6ef authored by Jorge Gil's avatar Jorge Gil
Browse files

Use TestableLooper.RunWithLooper in unit tests

These tests must run on a looper thread because they're UI related.
TestableLooper takes care of running the class/tests on a looper thread
without manually posting and awaiting a CountDownLatch.

Bug: None
Test: atest DesktopModeWindowDecorViewModelTests
Change-Id: I37127a0f98c25d52f75746f4915e6cba552838f6
parent c1a30723
Loading
Loading
Loading
Loading
+76 −93
Original line number Diff line number Diff line
@@ -40,7 +40,8 @@ import android.hardware.display.VirtualDisplay;
import android.hardware.input.InputManager;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.view.Choreographer;
import android.view.Display;
import android.view.InputChannel;
@@ -67,18 +68,19 @@ import com.android.wm.shell.transition.Transitions;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;

/** Tests of {@link DesktopModeWindowDecorViewModel} */
@SmallTest
@RunWith(AndroidTestingRunner.class)
@TestableLooper.RunWithLooper
public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {

    private static final String TAG = "DesktopModeWindowDecorViewModelTests";
@@ -163,7 +165,6 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        final ActivityManager.RunningTaskInfo taskInfo =
                createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FREEFORM);
        SurfaceControl surfaceControl = mock(SurfaceControl.class);
        runOnMainThread(() -> {
        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);

@@ -174,7 +175,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
        mDesktopModeWindowDecorViewModel.onTaskChanging(
                taskInfo, surfaceControl, startT, finishT);
        });

        verify(mDesktopModeWindowDecorFactory)
                .create(
                        mContext,
@@ -195,7 +196,6 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        final ActivityManager.RunningTaskInfo taskInfo =
                createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_UNDEFINED);
        SurfaceControl surfaceControl = mock(SurfaceControl.class);
        runOnMainThread(() -> {
        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);
        taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
@@ -208,7 +208,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {

        mDesktopModeWindowDecorViewModel.onTaskChanging(
                taskInfo, surfaceControl, startT, finishT);
        });

        verify(mDesktopModeWindowDecorFactory, times(1))
                .create(
                        mContext,
@@ -228,23 +228,20 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        final ActivityManager.RunningTaskInfo taskInfo =
                createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FREEFORM);
        taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_STANDARD);
        runOnMainThread(() -> {
        SurfaceControl surfaceControl = mock(SurfaceControl.class);
        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);

        mDesktopModeWindowDecorViewModel.onTaskOpening(
                taskInfo, surfaceControl, startT, finishT);

        mDesktopModeWindowDecorViewModel.destroyWindowDecoration(taskInfo);
        });

        verify(mMockInputMonitorFactory).create(any(), any());
        verify(mInputMonitor).dispose();
    }

    @Test
    public void testEventReceiversOnMultipleDisplays() throws Exception {
        runOnMainThread(() -> {
        SurfaceView surfaceView = new SurfaceView(mContext);
        final DisplayManager mDm = mContext.getSystemService(DisplayManager.class);
        final VirtualDisplay secondaryDisplay = mDm.createVirtualDisplay(
@@ -277,7 +274,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        } finally {
            secondaryDisplay.release();
        }
        });

        verify(mMockInputMonitorFactory, times(2)).create(any(), any());
        verify(mInputMonitor, times(1)).dispose();
    }
@@ -292,7 +289,6 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
                createTaskInfo(taskId, Display.DEFAULT_DISPLAY, WINDOWING_MODE_FULLSCREEN);
        taskInfo.isFocused = true;
        SurfaceControl surfaceControl = mock(SurfaceControl.class);
        runOnMainThread(() -> {
        final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class);
        final SurfaceControl.Transaction finishT = mock(SurfaceControl.Transaction.class);

@@ -303,7 +299,7 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
        taskInfo.configuration.windowConfiguration.setActivityType(ACTIVITY_TYPE_UNDEFINED);
        mDesktopModeWindowDecorViewModel.onTaskChanging(
                taskInfo, surfaceControl, startT, finishT);
        });

        verify(mDesktopModeWindowDecorFactory, never())
                .create(any(), any(), any(), any(), any(), any(), any(), any(), any());
    }
@@ -326,28 +322,15 @@ public class DesktopModeWindowDecorViewModelTests extends ShellTestCase {
                .create(any(), any(), any(), eq(taskInfo), eq(taskSurface), any(), any(), any(),
                        any());

        runOnMainThread(() -> {
        // Make sure a window decorations exists first by launching a freeform task.
            mDesktopModeWindowDecorViewModel.onTaskOpening(
                    taskInfo, taskSurface, startT, finishT);
        mDesktopModeWindowDecorViewModel.onTaskOpening(taskInfo, taskSurface, startT, finishT);
        // Now call back when as a Recents transition starts.
        recentsCaptor.getValue().onTransitionStarted(transition);
        });

        verify(decoration).incrementRelayoutBlock();
        verify(decoration).addTransitionPausingRelayout(transition);
    }

    private void runOnMainThread(Runnable r) throws Exception {
        final Handler mainHandler = new Handler(Looper.getMainLooper());
        final CountDownLatch latch = new CountDownLatch(1);
        mainHandler.post(() -> {
            r.run();
            latch.countDown();
        });
        latch.await(1, TimeUnit.SECONDS);
    }

    private static ActivityManager.RunningTaskInfo createTaskInfo(int taskId,
            int displayId, @WindowConfiguration.WindowingMode int windowingMode) {
        ActivityManager.RunningTaskInfo taskInfo =