From 1ce67a612220e7c9bd576d867cddf0fb74ccb866 Mon Sep 17 00:00:00 2001 From: Alex Chau Date: Thu, 12 Oct 2023 11:29:14 +0100 Subject: [PATCH] Use SandboxContext in AbstractDeviceProfileTest - Added a initializeForTesting method to SandboxContext - Also made SandboxContext non-abstract, so it can be used in tests to inject mock MainThreadInitializedObject into the SandboxContext, this should avoid mocked MainThreadInitializedObject bled into another test Test: presubmit Flag: None Bug: 303328913 Change-Id: I37157d81b08b80f1e90eacca7dc2ce482cd08aa4 --- .../util/MainThreadInitializedObject.java | 11 +++++- .../launcher3/AbstractDeviceProfileTest.kt | 36 ++++++++----------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/com/android/launcher3/util/MainThreadInitializedObject.java b/src/com/android/launcher3/util/MainThreadInitializedObject.java index 1cb99944c0..b966d8e25a 100644 --- a/src/com/android/launcher3/util/MainThreadInitializedObject.java +++ b/src/com/android/launcher3/util/MainThreadInitializedObject.java @@ -93,7 +93,7 @@ public class MainThreadInitializedObject { * Abstract Context which allows custom implementations for * {@link MainThreadInitializedObject} providers */ - public static abstract class SandboxContext extends ContextWrapper { + public static class SandboxContext extends ContextWrapper { private static final String TAG = "SandboxContext"; @@ -165,5 +165,14 @@ public class MainThreadInitializedObject { protected T createObject(MainThreadInitializedObject object) { return object.mProvider.get(this); } + + /** + * Put a value into mObjectMap, can be used to put mocked MainThreadInitializedObject + * instances into SandboxContext. + */ + @VisibleForTesting + public void putObject(MainThreadInitializedObject object, T value) { + mObjectMap.put(object, value); + } } } diff --git a/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt index 84fa988655..0b31469fe9 100644 --- a/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt +++ b/tests/src/com/android/launcher3/AbstractDeviceProfileTest.kt @@ -24,6 +24,7 @@ import android.view.Surface import androidx.test.core.app.ApplicationProvider import com.android.launcher3.testing.shared.ResourceUtils import com.android.launcher3.util.DisplayController +import com.android.launcher3.util.MainThreadInitializedObject.SandboxContext import com.android.launcher3.util.NavigationMode import com.android.launcher3.util.WindowBounds import com.android.launcher3.util.rule.TestStabilityRule @@ -35,8 +36,6 @@ import java.io.PrintWriter import java.io.StringWriter import kotlin.math.max import kotlin.math.min -import org.junit.After -import org.junit.Before import org.junit.Rule import org.mockito.kotlin.any import org.mockito.kotlin.mock @@ -50,30 +49,14 @@ import org.mockito.kotlin.whenever * For an implementation that mocks InvariantDeviceProfile, use [FakeInvariantDeviceProfileTest] */ abstract class AbstractDeviceProfileTest { - protected var context: Context? = null + protected lateinit var context: SandboxContext protected open val runningContext: Context = ApplicationProvider.getApplicationContext() private val displayController: DisplayController = mock() private val windowManagerProxy: WindowManagerProxy = mock() - private lateinit var originalDisplayController: DisplayController - private lateinit var originalWindowManagerProxy: WindowManagerProxy + private val launcherPrefs: LauncherPrefs = mock() @Rule @JvmField val testStabilityRule = TestStabilityRule() - @Before - open fun setUp() { - val appContext: Context = ApplicationProvider.getApplicationContext() - originalWindowManagerProxy = WindowManagerProxy.INSTANCE.get(appContext) - originalDisplayController = DisplayController.INSTANCE.get(appContext) - WindowManagerProxy.INSTANCE.initializeForTesting(windowManagerProxy) - DisplayController.INSTANCE.initializeForTesting(displayController) - } - - @After - open fun tearDown() { - WindowManagerProxy.INSTANCE.initializeForTesting(originalWindowManagerProxy) - DisplayController.INSTANCE.initializeForTesting(originalDisplayController) - } - class DeviceSpec( val naturalSize: Pair, var densityDpi: Int, @@ -304,8 +287,19 @@ abstract class AbstractDeviceProfileTest { screenHeightDp = (realBounds.bounds.height() / density).toInt() smallestScreenWidthDp = min(screenWidthDp, screenHeightDp) } - context = runningContext.createConfigurationContext(config) + val configurationContext = runningContext.createConfigurationContext(config) + context = + SandboxContext( + configurationContext, + DisplayController.INSTANCE, + WindowManagerProxy.INSTANCE, + LauncherPrefs.INSTANCE + ) + context.putObject(DisplayController.INSTANCE, displayController) + context.putObject(WindowManagerProxy.INSTANCE, windowManagerProxy) + context.putObject(LauncherPrefs.INSTANCE, launcherPrefs) + whenever(launcherPrefs.get(LauncherPrefs.TASKBAR_PINNING)).thenReturn(false) val info = spy(DisplayController.Info(context, windowManagerProxy, perDisplayBoundsCache)) whenever(displayController.info).thenReturn(info) whenever(info.isTransientTaskbar).thenReturn(isGestureMode)