Loading services/core/java/com/android/server/display/ColorFade.java +7 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.window.ScreenCapture; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.policy.WindowManagerPolicy; Loading Loading @@ -138,8 +139,13 @@ final class ColorFade { public static final int MODE_FADE = 2; public ColorFade(int displayId) { this(displayId, LocalServices.getService(DisplayManagerInternal.class)); } @VisibleForTesting ColorFade(int displayId, DisplayManagerInternal displayManagerInternal) { mDisplayId = displayId; mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mDisplayManagerInternal = displayManagerInternal; } /** Loading services/tests/displayservicetests/src/com/android/server/display/ColorFadeTest.java +2 −17 Original line number Diff line number Diff line Loading @@ -25,12 +25,9 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.hardware.display.DisplayManagerInternal; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.LocalServices; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -49,25 +46,13 @@ public class ColorFadeTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock); mContext = getInstrumentation().getTargetContext(); } @After public void tearDown() { LocalServices.removeServiceForTest(DisplayManagerInternal.class); } @Test public void testPrepareColorFadeForInvalidDisplay() { when(mDisplayManagerInternalMock.getDisplayInfo(eq(DISPLAY_ID))).thenReturn(null); ColorFade colorFade = new ColorFade(DISPLAY_ID); ColorFade colorFade = new ColorFade(DISPLAY_ID, mDisplayManagerInternalMock); assertFalse(colorFade.prepare(mContext, ColorFade.MODE_FADE)); } private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { LocalServices.removeServiceForTest(clazz); LocalServices.addService(clazz, mock); } } services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +8 −19 Original line number Diff line number Diff line Loading @@ -63,8 +63,8 @@ import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.util.test.LocalServiceKeeperRule; import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; import com.android.server.display.brightness.BrightnessEvent; Loading @@ -74,7 +74,6 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceController; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; Loading Loading @@ -140,6 +139,9 @@ public final class DisplayPowerControllerTest { .spyStatic(BatteryStatsService.class) .build(); @Rule public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule(); @Before public void setUp() throws Exception { mClock = new OffsettableClock.Stopped(); Loading @@ -153,9 +155,10 @@ public final class DisplayPowerControllerTest { Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, mCdsiMock); mLocalServiceKeeperRule.overrideLocalService( WindowManagerPolicy.class, mWindowManagerPolicyMock); mLocalServiceKeeperRule.overrideLocalService( ColorDisplayService.ColorDisplayServiceInternal.class, mCdsiMock); mContext.addMockSystemService(PowerManager.class, mPowerManagerMock); Loading @@ -167,12 +170,6 @@ public final class DisplayPowerControllerTest { mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); } @After public void tearDown() { LocalServices.removeServiceForTest(WindowManagerPolicy.class); LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); } @Test public void testReleaseProxSuspendBlockersOnExit() throws Exception { when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); Loading Loading @@ -1126,14 +1123,6 @@ public final class DisplayPowerControllerTest { verify(mDisplayWhiteBalanceControllerMock, times(1)).setStrongModeEnabled(true); } /** * Creates a mock and registers it to {@link LocalServices}. */ private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { LocalServices.removeServiceForTest(clazz); LocalServices.addService(clazz, mock); } private void advanceTime(long timeMs) { mClock.fastForward(timeMs); mTestLooper.dispatchAll(); Loading services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +8 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import android.util.TypedValue; import androidx.test.InstrumentationRegistry; import com.android.internal.R; import com.android.server.LocalServices; import com.android.internal.util.test.LocalServiceKeeperRule; import com.android.server.display.TestUtils; import com.android.server.display.color.ColorDisplayService; import com.android.server.display.utils.AmbientFilter; Loading @@ -47,6 +47,7 @@ import com.android.server.display.utils.AmbientFilterStubber; import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; Loading Loading @@ -90,6 +91,9 @@ public final class AmbientLuxTest { @Mock private TypedArray mStrongDisplayColorTemperatures; @Mock private ColorDisplayService.ColorDisplayServiceInternal mColorDisplayServiceInternalMock; @Rule public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule(); @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); Loading Loading @@ -156,8 +160,9 @@ public final class AmbientLuxTest { R.array.config_displayWhiteBalanceHighLightAmbientBiasesStrong)) .thenReturn(mHighLightBiasesStrong); mockThrottler(); LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class, mLocalServiceKeeperRule.overrideLocalService( ColorDisplayService.ColorDisplayServiceInternal.class, mColorDisplayServiceInternalMock); } Loading tests/utils/testutils/java/com/android/internal/util/test/LocalServiceKeeperRule.java 0 → 100644 +81 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.util.test; import com.android.server.LocalServices; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * JUnit Rule helps override /restore {@link LocalServices} state. */ public class LocalServiceKeeperRule implements TestRule { private final Map<Class<?>, Object> mOverriddenServices = new HashMap<>(); private final List<Class<?>> mAddedServices = new ArrayList<>(); private volatile boolean mRuleApplied = false; /** * Overrides service in LocalServices. Service will be restored to original after test run. */ public <T> void overrideLocalService(Class<T> type, T service) { if (!mRuleApplied) { throw new IllegalStateException("Can't override service without applying rule"); } if (mOverriddenServices.containsKey(type) || mAddedServices.contains(type)) { throw new IllegalArgumentException("Type already overridden: " + type); } T currentService = LocalServices.getService(type); if (currentService != null) { mOverriddenServices.put(type, currentService); LocalServices.removeServiceForTest(type); } else { mAddedServices.add(type); } LocalServices.addService(type, service); } @Override public Statement apply(Statement base, Description description) { return new Statement() { public void evaluate() throws Throwable { try { mRuleApplied = true; base.evaluate(); } finally { mRuleApplied = false; mAddedServices.forEach(LocalServices::removeServiceForTest); mOverriddenServices.forEach((clazz, service) -> { LocalServices.removeServiceForTest(clazz); LocalServices.addService((Class) clazz, service); }); mAddedServices.clear(); mOverriddenServices.clear(); } } }; } } Loading
services/core/java/com/android/server/display/ColorFade.java +7 −1 Original line number Diff line number Diff line Loading @@ -40,6 +40,7 @@ import android.view.SurfaceControl; import android.view.SurfaceControl.Transaction; import android.window.ScreenCapture; import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.policy.WindowManagerPolicy; Loading Loading @@ -138,8 +139,13 @@ final class ColorFade { public static final int MODE_FADE = 2; public ColorFade(int displayId) { this(displayId, LocalServices.getService(DisplayManagerInternal.class)); } @VisibleForTesting ColorFade(int displayId, DisplayManagerInternal displayManagerInternal) { mDisplayId = displayId; mDisplayManagerInternal = LocalServices.getService(DisplayManagerInternal.class); mDisplayManagerInternal = displayManagerInternal; } /** Loading
services/tests/displayservicetests/src/com/android/server/display/ColorFadeTest.java +2 −17 Original line number Diff line number Diff line Loading @@ -25,12 +25,9 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.hardware.display.DisplayManagerInternal; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import com.android.server.LocalServices; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; Loading @@ -49,25 +46,13 @@ public class ColorFadeTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); addLocalServiceMock(DisplayManagerInternal.class, mDisplayManagerInternalMock); mContext = getInstrumentation().getTargetContext(); } @After public void tearDown() { LocalServices.removeServiceForTest(DisplayManagerInternal.class); } @Test public void testPrepareColorFadeForInvalidDisplay() { when(mDisplayManagerInternalMock.getDisplayInfo(eq(DISPLAY_ID))).thenReturn(null); ColorFade colorFade = new ColorFade(DISPLAY_ID); ColorFade colorFade = new ColorFade(DISPLAY_ID, mDisplayManagerInternalMock); assertFalse(colorFade.prepare(mContext, ColorFade.MODE_FADE)); } private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { LocalServices.removeServiceForTest(clazz); LocalServices.addService(clazz, mock); } }
services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +8 −19 Original line number Diff line number Diff line Loading @@ -63,8 +63,8 @@ import androidx.test.filters.FlakyTest; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.util.test.LocalServiceKeeperRule; import com.android.modules.utils.testing.ExtendedMockitoRule; import com.android.server.LocalServices; import com.android.server.am.BatteryStatsService; import com.android.server.display.RampAnimator.DualRampAnimator; import com.android.server.display.brightness.BrightnessEvent; Loading @@ -74,7 +74,6 @@ import com.android.server.display.whitebalance.DisplayWhiteBalanceController; import com.android.server.policy.WindowManagerPolicy; import com.android.server.testutils.OffsettableClock; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; Loading Loading @@ -140,6 +139,9 @@ public final class DisplayPowerControllerTest { .spyStatic(BatteryStatsService.class) .build(); @Rule public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule(); @Before public void setUp() throws Exception { mClock = new OffsettableClock.Stopped(); Loading @@ -153,9 +155,10 @@ public final class DisplayPowerControllerTest { Settings.System.putFloatForUser(mContext.getContentResolver(), Settings.System.SCREEN_AUTO_BRIGHTNESS_ADJ, 0, UserHandle.USER_CURRENT); addLocalServiceMock(WindowManagerPolicy.class, mWindowManagerPolicyMock); addLocalServiceMock(ColorDisplayService.ColorDisplayServiceInternal.class, mCdsiMock); mLocalServiceKeeperRule.overrideLocalService( WindowManagerPolicy.class, mWindowManagerPolicyMock); mLocalServiceKeeperRule.overrideLocalService( ColorDisplayService.ColorDisplayServiceInternal.class, mCdsiMock); mContext.addMockSystemService(PowerManager.class, mPowerManagerMock); Loading @@ -167,12 +170,6 @@ public final class DisplayPowerControllerTest { mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); } @After public void tearDown() { LocalServices.removeServiceForTest(WindowManagerPolicy.class); LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); } @Test public void testReleaseProxSuspendBlockersOnExit() throws Exception { when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); Loading Loading @@ -1126,14 +1123,6 @@ public final class DisplayPowerControllerTest { verify(mDisplayWhiteBalanceControllerMock, times(1)).setStrongModeEnabled(true); } /** * Creates a mock and registers it to {@link LocalServices}. */ private static <T> void addLocalServiceMock(Class<T> clazz, T mock) { LocalServices.removeServiceForTest(clazz); LocalServices.addService(clazz, mock); } private void advanceTime(long timeMs) { mClock.fastForward(timeMs); mTestLooper.dispatchAll(); Loading
services/tests/displayservicetests/src/com/android/server/display/whitebalance/AmbientLuxTest.java +8 −3 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ import android.util.TypedValue; import androidx.test.InstrumentationRegistry; import com.android.internal.R; import com.android.server.LocalServices; import com.android.internal.util.test.LocalServiceKeeperRule; import com.android.server.display.TestUtils; import com.android.server.display.color.ColorDisplayService; import com.android.server.display.utils.AmbientFilter; Loading @@ -47,6 +47,7 @@ import com.android.server.display.utils.AmbientFilterStubber; import com.google.common.collect.ImmutableList; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; Loading Loading @@ -90,6 +91,9 @@ public final class AmbientLuxTest { @Mock private TypedArray mStrongDisplayColorTemperatures; @Mock private ColorDisplayService.ColorDisplayServiceInternal mColorDisplayServiceInternalMock; @Rule public LocalServiceKeeperRule mLocalServiceKeeperRule = new LocalServiceKeeperRule(); @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); Loading Loading @@ -156,8 +160,9 @@ public final class AmbientLuxTest { R.array.config_displayWhiteBalanceHighLightAmbientBiasesStrong)) .thenReturn(mHighLightBiasesStrong); mockThrottler(); LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class); LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class, mLocalServiceKeeperRule.overrideLocalService( ColorDisplayService.ColorDisplayServiceInternal.class, mColorDisplayServiceInternalMock); } Loading
tests/utils/testutils/java/com/android/internal/util/test/LocalServiceKeeperRule.java 0 → 100644 +81 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.internal.util.test; import com.android.server.LocalServices; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * JUnit Rule helps override /restore {@link LocalServices} state. */ public class LocalServiceKeeperRule implements TestRule { private final Map<Class<?>, Object> mOverriddenServices = new HashMap<>(); private final List<Class<?>> mAddedServices = new ArrayList<>(); private volatile boolean mRuleApplied = false; /** * Overrides service in LocalServices. Service will be restored to original after test run. */ public <T> void overrideLocalService(Class<T> type, T service) { if (!mRuleApplied) { throw new IllegalStateException("Can't override service without applying rule"); } if (mOverriddenServices.containsKey(type) || mAddedServices.contains(type)) { throw new IllegalArgumentException("Type already overridden: " + type); } T currentService = LocalServices.getService(type); if (currentService != null) { mOverriddenServices.put(type, currentService); LocalServices.removeServiceForTest(type); } else { mAddedServices.add(type); } LocalServices.addService(type, service); } @Override public Statement apply(Statement base, Description description) { return new Statement() { public void evaluate() throws Throwable { try { mRuleApplied = true; base.evaluate(); } finally { mRuleApplied = false; mAddedServices.forEach(LocalServices::removeServiceForTest); mOverriddenServices.forEach((clazz, service) -> { LocalServices.removeServiceForTest(clazz); LocalServices.addService((Class) clazz, service); }); mAddedServices.clear(); mOverriddenServices.clear(); } } }; } }