Loading tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +71 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.launcher3.ui; import static androidx.test.InstrumentationRegistry.getInstrumentation; import static com.android.launcher3.tapl.LauncherInstrumentation.ContainerType; import static com.android.launcher3.ui.TaplTestsLauncher3.getAppPackageName; import static org.junit.Assert.assertTrue; Loading Loading @@ -45,6 +46,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; Loading @@ -52,6 +54,7 @@ import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; import com.android.launcher3.testcomponent.TestCommandReceiver; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.FailureWatcher; Loading Loading @@ -103,6 +106,10 @@ public abstract class AbstractLauncherUiTest { Utilities.enableRunningInTestHarnessForTests(); mLauncher.setSystemHealthSupplier(() -> TestCommandReceiver.callCommand( TestCommandReceiver.GET_SYSTEM_HEALTH_MESSAGE).getString("result")); mLauncher.setOnSettledStateAction( containerType -> executeOnLauncher( launcher -> checkLauncherIntegrity(launcher, containerType))); } } Loading Loading @@ -379,4 +386,68 @@ public abstract class AbstractLauncherUiTest { protected int getAllAppsScroll(Launcher launcher) { return launcher.getAppsView().getActiveRecyclerView().getCurrentScrollY(); } private static void checkLauncherIntegrity( Launcher launcher, ContainerType expectedContainerType) { if (launcher != null) { final LauncherStateManager stateManager = launcher.getStateManager(); final LauncherState stableState = stateManager.getCurrentStableState(); assertTrue("Stable state != state: " + stableState.getClass().getSimpleName() + ", " + stateManager.getState().getClass().getSimpleName(), stableState == stateManager.getState()); final boolean isResumed = launcher.hasBeenResumed(); assertTrue("hasBeenResumed() != isStarted(), hasBeenResumed(): " + isResumed, isResumed == launcher.isStarted()); assertTrue("hasBeenResumed() != isUserActive(), hasBeenResumed(): " + isResumed, isResumed == launcher.isUserActive()); final int ordinal = stableState.ordinal; switch (expectedContainerType) { case WORKSPACE: case WIDGETS: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.NORMAL_STATE_ORDINAL); break; } case ALL_APPS: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.ALL_APPS_STATE_ORDINAL); break; } case OVERVIEW: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.OVERVIEW_STATE_ORDINAL); break; } case BACKGROUND: { assertTrue("Launcher is resumed in state: " + expectedContainerType, !isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.NORMAL_STATE_ORDINAL); break; } default: throw new IllegalArgumentException( "Illegal container: " + expectedContainerType); } } else { assertTrue( "Container type is not BACKGROUND or FALLBACK_OVERVIEW: " + expectedContainerType, expectedContainerType == ContainerType.BACKGROUND || expectedContainerType == ContainerType.FALLBACK_OVERVIEW); } } } tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +16 −1 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Supplier; /** Loading @@ -86,7 +87,7 @@ public final class LauncherInstrumentation { // Types for launcher containers that the user is interacting with. "Background" is a // pseudo-container corresponding to inactive launcher covered by another app. enum ContainerType { public enum ContainerType { WORKSPACE, ALL_APPS, OVERVIEW, WIDGETS, BACKGROUND, FALLBACK_OVERVIEW } Loading Loading @@ -135,6 +136,8 @@ public final class LauncherInstrumentation { private final Deque<String> mDiagnosticContext = new LinkedList<>(); private Supplier<String> mSystemHealthSupplier; private Consumer<ContainerType> mOnSettledStateAction; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. */ Loading Loading @@ -296,6 +299,10 @@ public final class LauncherInstrumentation { this.mSystemHealthSupplier = supplier; } public void setOnSettledStateAction(Consumer<ContainerType> onSettledStateAction) { mOnSettledStateAction = onSettledStateAction; } private String getSystemHealthMessage() { final String testPackage = getContext().getPackageName(); try { Loading Loading @@ -415,6 +422,14 @@ public final class LauncherInstrumentation { assertTrue(error, error == null); log("verifyContainerType: " + containerType); final UiObject2 container = verifyVisibleObjects(containerType); if (mOnSettledStateAction != null) mOnSettledStateAction.accept(containerType); return container; } private UiObject2 verifyVisibleObjects(ContainerType containerType) { try (Closable c = addContextLayer( "but the current state is not " + containerType.name())) { switch (containerType) { Loading Loading
tests/src/com/android/launcher3/ui/AbstractLauncherUiTest.java +71 −0 Original line number Diff line number Diff line Loading @@ -17,6 +17,7 @@ package com.android.launcher3.ui; import static androidx.test.InstrumentationRegistry.getInstrumentation; import static com.android.launcher3.tapl.LauncherInstrumentation.ContainerType; import static com.android.launcher3.ui.TaplTestsLauncher3.getAppPackageName; import static org.junit.Assert.assertTrue; Loading Loading @@ -45,6 +46,7 @@ import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherModel; import com.android.launcher3.LauncherSettings; import com.android.launcher3.LauncherState; import com.android.launcher3.LauncherStateManager; import com.android.launcher3.MainThreadExecutor; import com.android.launcher3.Utilities; import com.android.launcher3.compat.LauncherAppsCompat; Loading @@ -52,6 +54,7 @@ import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.tapl.LauncherInstrumentation; import com.android.launcher3.tapl.TestHelpers; import com.android.launcher3.testcomponent.TestCommandReceiver; import com.android.launcher3.testing.TestProtocol; import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.util.Wait; import com.android.launcher3.util.rule.FailureWatcher; Loading Loading @@ -103,6 +106,10 @@ public abstract class AbstractLauncherUiTest { Utilities.enableRunningInTestHarnessForTests(); mLauncher.setSystemHealthSupplier(() -> TestCommandReceiver.callCommand( TestCommandReceiver.GET_SYSTEM_HEALTH_MESSAGE).getString("result")); mLauncher.setOnSettledStateAction( containerType -> executeOnLauncher( launcher -> checkLauncherIntegrity(launcher, containerType))); } } Loading Loading @@ -379,4 +386,68 @@ public abstract class AbstractLauncherUiTest { protected int getAllAppsScroll(Launcher launcher) { return launcher.getAppsView().getActiveRecyclerView().getCurrentScrollY(); } private static void checkLauncherIntegrity( Launcher launcher, ContainerType expectedContainerType) { if (launcher != null) { final LauncherStateManager stateManager = launcher.getStateManager(); final LauncherState stableState = stateManager.getCurrentStableState(); assertTrue("Stable state != state: " + stableState.getClass().getSimpleName() + ", " + stateManager.getState().getClass().getSimpleName(), stableState == stateManager.getState()); final boolean isResumed = launcher.hasBeenResumed(); assertTrue("hasBeenResumed() != isStarted(), hasBeenResumed(): " + isResumed, isResumed == launcher.isStarted()); assertTrue("hasBeenResumed() != isUserActive(), hasBeenResumed(): " + isResumed, isResumed == launcher.isUserActive()); final int ordinal = stableState.ordinal; switch (expectedContainerType) { case WORKSPACE: case WIDGETS: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.NORMAL_STATE_ORDINAL); break; } case ALL_APPS: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.ALL_APPS_STATE_ORDINAL); break; } case OVERVIEW: { assertTrue( "Launcher is not resumed in state: " + expectedContainerType, isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.OVERVIEW_STATE_ORDINAL); break; } case BACKGROUND: { assertTrue("Launcher is resumed in state: " + expectedContainerType, !isResumed); assertTrue(TestProtocol.stateOrdinalToString(ordinal), ordinal == TestProtocol.NORMAL_STATE_ORDINAL); break; } default: throw new IllegalArgumentException( "Illegal container: " + expectedContainerType); } } else { assertTrue( "Container type is not BACKGROUND or FALLBACK_OVERVIEW: " + expectedContainerType, expectedContainerType == ContainerType.BACKGROUND || expectedContainerType == ContainerType.FALLBACK_OVERVIEW); } } }
tests/tapl/com/android/launcher3/tapl/LauncherInstrumentation.java +16 −1 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ import java.util.Deque; import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; import java.util.function.Supplier; /** Loading @@ -86,7 +87,7 @@ public final class LauncherInstrumentation { // Types for launcher containers that the user is interacting with. "Background" is a // pseudo-container corresponding to inactive launcher covered by another app. enum ContainerType { public enum ContainerType { WORKSPACE, ALL_APPS, OVERVIEW, WIDGETS, BACKGROUND, FALLBACK_OVERVIEW } Loading Loading @@ -135,6 +136,8 @@ public final class LauncherInstrumentation { private final Deque<String> mDiagnosticContext = new LinkedList<>(); private Supplier<String> mSystemHealthSupplier; private Consumer<ContainerType> mOnSettledStateAction; /** * Constructs the root of TAPL hierarchy. You get all other objects from it. */ Loading Loading @@ -296,6 +299,10 @@ public final class LauncherInstrumentation { this.mSystemHealthSupplier = supplier; } public void setOnSettledStateAction(Consumer<ContainerType> onSettledStateAction) { mOnSettledStateAction = onSettledStateAction; } private String getSystemHealthMessage() { final String testPackage = getContext().getPackageName(); try { Loading Loading @@ -415,6 +422,14 @@ public final class LauncherInstrumentation { assertTrue(error, error == null); log("verifyContainerType: " + containerType); final UiObject2 container = verifyVisibleObjects(containerType); if (mOnSettledStateAction != null) mOnSettledStateAction.accept(containerType); return container; } private UiObject2 verifyVisibleObjects(ContainerType containerType) { try (Closable c = addContextLayer( "but the current state is not " + containerType.name())) { switch (containerType) { Loading