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

Commit 97bc849c authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka
Browse files

Fix ColorDisplayServiceTest as device-agnostic

- make some of DisplayTransformManager static methods so instance
  methods so that we can mock those method in testing code.

- add ColorDisplayService.waitForFinish() method for testing code can
  remove DisplayTransformManager mock without NullPointerException.

- add dummy resources and stub codes to make ColorDisplayServiceTest
  as device-agnostic.

Bug: 172388453
Test: atest ColorDisplayServiceTest
Change-Id: I37dcd49e118ed234d2c52102011ca5d7ebfcbc16
parent 3fc2e731
Loading
Loading
Loading
Loading
+9 −8
Original line number Original line Diff line number Diff line
@@ -162,7 +162,8 @@ public final class ColorDisplayService extends SystemService {
    private final ReduceBrightColorsTintController mReduceBrightColorsTintController =
    private final ReduceBrightColorsTintController mReduceBrightColorsTintController =
            new ReduceBrightColorsTintController();
            new ReduceBrightColorsTintController();


    private final Handler mHandler;
    @VisibleForTesting
    final Handler mHandler;


    private final AppSaturationController mAppSaturationController = new AppSaturationController();
    private final AppSaturationController mAppSaturationController = new AppSaturationController();


@@ -404,13 +405,13 @@ public final class ColorDisplayService extends SystemService {
        // existing activated state. This ensures consistency of tint across the color mode change.
        // existing activated state. This ensures consistency of tint across the color mode change.
        onDisplayColorModeChanged(getColorModeInternal());
        onDisplayColorModeChanged(getColorModeInternal());


        final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
        if (mNightDisplayTintController.isAvailable(getContext())) {
        if (mNightDisplayTintController.isAvailable(getContext())) {
            // Reset the activated state.
            // Reset the activated state.
            mNightDisplayTintController.setActivated(null);
            mNightDisplayTintController.setActivated(null);


            // Prepare the night display color transformation matrix.
            // Prepare the night display color transformation matrix.
            mNightDisplayTintController
            mNightDisplayTintController.setUp(getContext(), dtm.needsLinearColorMatrix());
                    .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix());
            mNightDisplayTintController
            mNightDisplayTintController
                    .setMatrix(mNightDisplayTintController.getColorTemperatureSetting());
                    .setMatrix(mNightDisplayTintController.getColorTemperatureSetting());


@@ -432,8 +433,7 @@ public final class ColorDisplayService extends SystemService {
        }
        }


        if (mReduceBrightColorsTintController.isAvailable(getContext())) {
        if (mReduceBrightColorsTintController.isAvailable(getContext())) {
            mReduceBrightColorsTintController
            mReduceBrightColorsTintController.setUp(getContext(), dtm.needsLinearColorMatrix());
                    .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix());
            onReduceBrightColorsStrengthLevelChanged();
            onReduceBrightColorsStrengthLevelChanged();
            final boolean reset = resetReduceBrightColors();
            final boolean reset = resetReduceBrightColors();
            if (!reset) {
            if (!reset) {
@@ -540,8 +540,8 @@ public final class ColorDisplayService extends SystemService {
        mDisplayWhiteBalanceTintController.cancelAnimator();
        mDisplayWhiteBalanceTintController.cancelAnimator();


        if (mNightDisplayTintController.isAvailable(getContext())) {
        if (mNightDisplayTintController.isAvailable(getContext())) {
            mNightDisplayTintController
            final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
                    .setUp(getContext(), DisplayTransformManager.needsLinearColorMatrix(mode));
            mNightDisplayTintController.setUp(getContext(), dtm.needsLinearColorMatrix(mode));
            mNightDisplayTintController
            mNightDisplayTintController
                    .setMatrix(mNightDisplayTintController.getColorTemperatureSetting());
                    .setMatrix(mNightDisplayTintController.getColorTemperatureSetting());
        }
        }
@@ -731,10 +731,11 @@ public final class ColorDisplayService extends SystemService {
    @VisibleForTesting
    @VisibleForTesting
    void updateDisplayWhiteBalanceStatus() {
    void updateDisplayWhiteBalanceStatus() {
        boolean oldActivated = mDisplayWhiteBalanceTintController.isActivated();
        boolean oldActivated = mDisplayWhiteBalanceTintController.isActivated();
        final DisplayTransformManager dtm = getLocalService(DisplayTransformManager.class);
        mDisplayWhiteBalanceTintController.setActivated(isDisplayWhiteBalanceSettingEnabled()
        mDisplayWhiteBalanceTintController.setActivated(isDisplayWhiteBalanceSettingEnabled()
                && !mNightDisplayTintController.isActivated()
                && !mNightDisplayTintController.isActivated()
                && !isAccessibilityEnabled()
                && !isAccessibilityEnabled()
                && DisplayTransformManager.needsLinearColorMatrix());
                && dtm.needsLinearColorMatrix());
        boolean activated = mDisplayWhiteBalanceTintController.isActivated();
        boolean activated = mDisplayWhiteBalanceTintController.isActivated();


        if (mDisplayWhiteBalanceListener != null && oldActivated != activated) {
        if (mDisplayWhiteBalanceListener != null && oldActivated != activated) {
+2 −2
Original line number Original line Diff line number Diff line
@@ -239,7 +239,7 @@ public class DisplayTransformManager {
    /**
    /**
     * Return true when the color matrix works in linear space.
     * Return true when the color matrix works in linear space.
     */
     */
    public static boolean needsLinearColorMatrix() {
    public boolean needsLinearColorMatrix() {
        return SystemProperties.getInt(PERSISTENT_PROPERTY_DISPLAY_COLOR,
        return SystemProperties.getInt(PERSISTENT_PROPERTY_DISPLAY_COLOR,
                DISPLAY_COLOR_UNMANAGED) != DISPLAY_COLOR_UNMANAGED;
                DISPLAY_COLOR_UNMANAGED) != DISPLAY_COLOR_UNMANAGED;
    }
    }
@@ -247,7 +247,7 @@ public class DisplayTransformManager {
    /**
    /**
     * Return true when the specified colorMode requires the color matrix to work in linear space.
     * Return true when the specified colorMode requires the color matrix to work in linear space.
     */
     */
    public static boolean needsLinearColorMatrix(int colorMode) {
    public boolean needsLinearColorMatrix(int colorMode) {
        return colorMode != ColorDisplayManager.COLOR_MODE_SATURATED;
        return colorMode != ColorDisplayManager.COLOR_MODE_SATURATED;
    }
    }


+31 −37
Original line number Original line Diff line number Diff line
@@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertWithMessage;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


@@ -53,9 +52,7 @@ import com.android.server.twilight.TwilightManager;
import com.android.server.twilight.TwilightState;
import com.android.server.twilight.TwilightState;


import org.junit.After;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.mockito.Mockito;
@@ -76,25 +73,29 @@ public class ColorDisplayServiceTest {
    private int mUserId;
    private int mUserId;


    private MockTwilightManager mTwilightManager;
    private MockTwilightManager mTwilightManager;
    private DisplayTransformManager mDisplayTransformManager;


    private ColorDisplayService mCds;
    private ColorDisplayService mCds;
    private ColorDisplayService.BinderService mBinderService;
    private ColorDisplayService.BinderService mBinderService;


    private Resources mResourcesSpy;
    private Resources mResourcesSpy;


    @BeforeClass
    private static final int[] MINIMAL_COLOR_MODES = new int[] {
    public static void setDtm() {
        ColorDisplayManager.COLOR_MODE_NATURAL,
        final DisplayTransformManager dtm = Mockito.mock(DisplayTransformManager.class);
        ColorDisplayManager.COLOR_MODE_BOOSTED,
        LocalServices.addService(DisplayTransformManager.class, dtm);
    };
    }


    @Before
    @Before
    public void setUp() {
    public void setUp() {
        mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
        mContext = Mockito.spy(new ContextWrapper(InstrumentationRegistry.getTargetContext()));
        doReturn(mContext).when(mContext).getApplicationContext();
        doReturn(mContext).when(mContext).getApplicationContext();


        mResourcesSpy = Mockito.spy(mContext.getResources());
        final Resources res = Mockito.spy(mContext.getResources());
        when(mContext.getResources()).thenReturn(mResourcesSpy);
        doReturn(MINIMAL_COLOR_MODES).when(res).getIntArray(R.array.config_availableColorModes);
        doReturn(true).when(res).getBoolean(R.bool.config_nightDisplayAvailable);
        doReturn(true).when(res).getBoolean(R.bool.config_displayWhiteBalanceAvailable);
        when(mContext.getResources()).thenReturn(res);
        mResourcesSpy = res;


        mUserId = ActivityManager.getCurrentUser();
        mUserId = ActivityManager.getCurrentUser();


@@ -108,6 +109,10 @@ public class ColorDisplayServiceTest {
        mTwilightManager = new MockTwilightManager();
        mTwilightManager = new MockTwilightManager();
        LocalServices.addService(TwilightManager.class, mTwilightManager);
        LocalServices.addService(TwilightManager.class, mTwilightManager);


        mDisplayTransformManager = Mockito.mock(DisplayTransformManager.class);
        doReturn(true).when(mDisplayTransformManager).needsLinearColorMatrix();
        LocalServices.addService(DisplayTransformManager.class, mDisplayTransformManager);

        mCds = new ColorDisplayService(mContext);
        mCds = new ColorDisplayService(mContext);
        mBinderService = mCds.new BinderService();
        mBinderService = mCds.new BinderService();
        LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class,
        LocalServices.addService(ColorDisplayService.ColorDisplayServiceInternal.class,
@@ -116,12 +121,18 @@ public class ColorDisplayServiceTest {


    @After
    @After
    public void tearDown() {
    public void tearDown() {
        LocalServices.removeServiceForTest(TwilightManager.class);
        /*

         * Wait for internal {@link Handler} to finish processing pending messages, so that test
         * code can safelyremove {@link DisplayTransformManager} mock from {@link LocalServices}.
         */
        mCds.mHandler.runWithScissors(() -> { /* nop */ }, /* timeout */ 1000);
        mCds = null;
        mCds = null;


        LocalServices.removeServiceForTest(TwilightManager.class);
        mTwilightManager = null;
        mTwilightManager = null;


        LocalServices.removeServiceForTest(DisplayTransformManager.class);

        mUserId = UserHandle.USER_NULL;
        mUserId = UserHandle.USER_NULL;
        mContext = null;
        mContext = null;


@@ -130,11 +141,6 @@ public class ColorDisplayServiceTest {
        LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class);
        LocalServices.removeServiceForTest(ColorDisplayService.ColorDisplayServiceInternal.class);
    }
    }


    @AfterClass
    public static void removeDtm() {
        LocalServices.removeServiceForTest(DisplayTransformManager.class);
    }

    @Test
    @Test
    public void customSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
    public void customSchedule_whenStartedAfterNight_ifOffAfterNight_turnsOff() {
        setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
        setAutoModeCustom(-120 /* startTimeOffset */, -60 /* endTimeOffset */);
@@ -1064,24 +1070,18 @@ public class ColorDisplayServiceTest {


    @Test
    @Test
    public void compositionColorSpaces_noResources() {
    public void compositionColorSpaces_noResources() {
        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
        reset(dtm);

        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
            .thenReturn(new int[] {});
            .thenReturn(new int[] {});
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces))
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorSpaces))
            .thenReturn(new int[] {});
            .thenReturn(new int[] {});
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        startService();
        startService();
        verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(),
        verify(mDisplayTransformManager).setColorMode(
                eq(Display.COLOR_MODE_INVALID));
                eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), eq(Display.COLOR_MODE_INVALID));
    }
    }


    @Test
    @Test
    public void compositionColorSpaces_invalidResources() {
    public void compositionColorSpaces_invalidResources() {
        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
        reset(dtm);

        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
            .thenReturn(new int[] {
            .thenReturn(new int[] {
               ColorDisplayManager.COLOR_MODE_NATURAL,
               ColorDisplayManager.COLOR_MODE_NATURAL,
@@ -1094,15 +1094,12 @@ public class ColorDisplayServiceTest {
            });
            });
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        startService();
        startService();
        verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(),
        verify(mDisplayTransformManager).setColorMode(
                eq(Display.COLOR_MODE_INVALID));
                eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), eq(Display.COLOR_MODE_INVALID));
    }
    }


    @Test
    @Test
    public void compositionColorSpaces_validResources_validColorMode() {
    public void compositionColorSpaces_validResources_validColorMode() {
        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
        reset(dtm);

        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
            .thenReturn(new int[] {
            .thenReturn(new int[] {
               ColorDisplayManager.COLOR_MODE_NATURAL
               ColorDisplayManager.COLOR_MODE_NATURAL
@@ -1113,15 +1110,12 @@ public class ColorDisplayServiceTest {
            });
            });
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        setColorMode(ColorDisplayManager.COLOR_MODE_NATURAL);
        startService();
        startService();
        verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(),
        verify(mDisplayTransformManager).setColorMode(
                eq(Display.COLOR_MODE_SRGB));
                eq(ColorDisplayManager.COLOR_MODE_NATURAL), any(), eq(Display.COLOR_MODE_SRGB));
    }
    }


    @Test
    @Test
    public void compositionColorSpaces_validResources_invalidColorMode() {
    public void compositionColorSpaces_validResources_invalidColorMode() {
        final DisplayTransformManager dtm = LocalServices.getService(DisplayTransformManager.class);
        reset(dtm);

        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
        when(mResourcesSpy.getIntArray(R.array.config_displayCompositionColorModes))
            .thenReturn(new int[] {
            .thenReturn(new int[] {
               ColorDisplayManager.COLOR_MODE_NATURAL
               ColorDisplayManager.COLOR_MODE_NATURAL
@@ -1132,8 +1126,8 @@ public class ColorDisplayServiceTest {
            });
            });
        setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED);
        setColorMode(ColorDisplayManager.COLOR_MODE_BOOSTED);
        startService();
        startService();
        verify(dtm).setColorMode(eq(ColorDisplayManager.COLOR_MODE_BOOSTED), any(),
        verify(mDisplayTransformManager).setColorMode(
                eq(Display.COLOR_MODE_INVALID));
                eq(ColorDisplayManager.COLOR_MODE_BOOSTED), any(), eq(Display.COLOR_MODE_INVALID));
    }
    }


    /**
    /**