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

Commit 16c2ea79 authored by petsjonkin's avatar petsjonkin
Browse files

Introducing LocalServicesKeeperRule

Apply rule in AmbientLuxTest and DPCTest.
Inject DisplayManagerInternal in ColorFade for test

Bug: b/287945043
Test: atest AmbientLuxTest, atest ColorFadeTest, atest DisplayPowerControllerTest
Change-Id: I97e9f67d18f1e9eb1e25b147efe369098de50258
parent 8880dfea
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -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;

@@ -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;
    }

    /**
+2 −17
Original line number Diff line number Diff line
@@ -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;
@@ -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);
    }

}
+8 −19
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -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);

@@ -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);
@@ -1124,14 +1121,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();
+8 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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);
@@ -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);
    }

+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