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

Commit 05d5d773 authored by Chun-Ku Lin's avatar Chun-Ku Lin
Browse files

Remove usage of custom ShadowParcel

Bug: 414680096
Test: atest SettingsRoboTests
Flag: EXEMPT test only
Change-Id: I7b0b209765025619d28c47b91f6282436915e455
parent 0260d257
Loading
Loading
Loading
Loading
+33 −14
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@

package com.android.settings.development;

import static com.android.settings.development.HardwareOverlaysPreferenceController
        .SURFACE_FLINGER_READ_CODE;
import static com.android.settings.development.HardwareOverlaysPreferenceController.SURFACE_FLINGER_READ_CODE;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -31,20 +30,20 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;

import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.testutils.shadow.ShadowParcel;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
@@ -86,22 +85,16 @@ public class HardwareOverlaysPreferenceControllerTest {
    }

    @Test
    @Config(shadows = {ShadowParcel.class})
    public void updateState_settingEnabled_shouldCheckPreference() throws RemoteException {
        ShadowParcel.sReadIntResult = 1;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(1);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(true);
    }

    @Test
    @Config(shadows = {ShadowParcel.class})
    public void updateState_settingDisabled_shouldUnCheckPreference() throws RemoteException {
        ShadowParcel.sReadIntResult = 0;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(0);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(false);
@@ -126,4 +119,30 @@ public class HardwareOverlaysPreferenceControllerTest {
        verify(mPreference, never()).setChecked(anyBoolean());
        verify(mPreference).setEnabled(false);
    }

    private void mockSurfaceFlingerTransactResponse(int disableOverlaysReply)
            throws RemoteException {
        doAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) {
                // Get the arguments passed to the mocked method
                Object[] args = invocation.getArguments();
                if (args[2] instanceof Parcel reply) {
                    // write showCpu
                    reply.writeInt(0);
                    // write enableGL
                    reply.writeInt(0);
                    // write showUpdates
                    reply.writeInt(0);
                    // write showBackground
                    reply.writeInt(0);
                    // write disableOverlays
                    reply.writeInt(disableOverlaysReply);
                    reply.setDataPosition(0);
                }
                return true;
            }
        }).when(mSurfaceFlinger).transact(
                eq(SURFACE_FLINGER_READ_CODE), any(), any(), eq(0 /* flags */));
    }
}
+43 −43
Original line number Diff line number Diff line
@@ -16,133 +16,121 @@

package com.android.settings.development;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.flag.junit.SetFlagsRule;

import androidx.preference.PreferenceScreen;
import androidx.preference.TwoStatePreference;
import androidx.test.core.app.ApplicationProvider;

import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowParcel;

import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;

@RunWith(RobolectricTestRunner.class)
public class ShowHdrSdrRatioPreferenceControllerTest {

    @Mock
    private Context mContext;
    @Rule
    public MockitoRule mockito = MockitoJUnit.rule();
    @Mock
    private PreferenceScreen mScreen;
    @Mock
    private TwoStatePreference mPreference;
    @Mock
    private IBinder mSurfaceFlinger;

    private ShowHdrSdrRatioPreferenceController mController;
    private Context mContext;

    @Rule
    public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mContext = RuntimeEnvironment.application;
        mContext = ApplicationProvider.getApplicationContext();
        mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, true);
        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
        mController.displayPreference(mScreen);
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void onPreferenceChange_settingEnabled_shouldChecked() throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = true;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(true);
        mController.onPreferenceChange(mPreference, true /* new value */);
        verify(mPreference).setChecked(true);
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void onPreferenceChange_settingDisabled_shouldUnchecked() throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = false;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(false);
        mController.onPreferenceChange(mPreference, false /* new value */);
        verify(mPreference).setChecked(false);
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void updateState_settingEnabled_shouldChecked() throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = true;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(true);
        mController.updateState(mPreference);
        verify(mPreference).setChecked(true);
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void updateState_settingDisabled_shouldUnchecked() throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = false;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(false);
        mController.updateState(mPreference);
        verify(mPreference).setChecked(false);
    }

    @Test
    @DisableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void settingNotAvailable_isHdrSdrRatioAvailableFalse_flagsOff() {
        mSetFlagsRule.disableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, true);
        assertFalse(mController.isAvailable());
    }

    @Test
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void settingNotAvailable_isHdrSdrRatioAvailableTrue_flagsOn() {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        mController = new ShowHdrSdrRatioPreferenceController(mContext, mSurfaceFlinger, false);
        assertFalse(mController.isAvailable());
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void onDeveloperOptionsSwitchDisabled_preferenceUnchecked_shouldNotTurnOffPreference()
            throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = false;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(false);
        when(mPreference.isChecked()).thenReturn(false);
        mController.onDeveloperOptionsSwitchDisabled();

@@ -152,14 +140,11 @@ public class ShowHdrSdrRatioPreferenceControllerTest {
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    @EnableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO)
    public void onDeveloperOptionsSwitchDisabled_preferenceChecked_shouldTurnOffPreference()
            throws RemoteException {
        mSetFlagsRule.enableFlags(Flags.FLAG_DEVELOPMENT_HDR_SDR_RATIO);
        assertTrue(mController.isAvailable());
        ShadowParcel.sReadBoolResult = true;
        doReturn(true).when(mSurfaceFlinger)
            .transact(anyInt(), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(true);
        when(mPreference.isChecked()).thenReturn(true);
        mController.onDeveloperOptionsSwitchDisabled();

@@ -167,5 +152,20 @@ public class ShowHdrSdrRatioPreferenceControllerTest {
        verify(mPreference).setChecked(false);
        verify(mPreference).setEnabled(false);
    }

    private void mockSurfaceFlingerTransactResponse(boolean replyResult) throws RemoteException {
        doAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) {
                // Get the arguments passed to the mocked method
                Object[] args = invocation.getArguments();
                if (args[2] instanceof Parcel reply) {
                    reply.writeBoolean(replyResult);
                    reply.setDataPosition(0);
                }
                return true;
            }
        }).when(mSurfaceFlinger).transact(anyInt(), any(), any(), eq(0 /* flags */));
    }
}
+23 −14
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@

package com.android.settings.development;

import static com.android.settings.development.ShowRefreshRatePreferenceController
        .SURFACE_FLINGER_CODE;
import static com.android.settings.development.ShowRefreshRatePreferenceController.SURFACE_FLINGER_CODE;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -31,20 +30,20 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;

import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.testutils.shadow.ShadowParcel;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
@@ -86,22 +85,16 @@ public class ShowRefreshRatePreferenceControllerTest {
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    public void updateState_settingEnabled_shouldCheckPreference() throws RemoteException {
        ShadowParcel.sReadBoolResult = true;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(true);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(true);
    }

    @Test
    @Config(shadows = {ShadowParcel.class})
    public void updateState_settingDisabled_shouldUnCheckPreference() throws RemoteException {
        ShadowParcel.sReadBoolResult = false;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(false);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(false);
@@ -126,4 +119,20 @@ public class ShowRefreshRatePreferenceControllerTest {
        verify(mPreference).setChecked(false);
        verify(mPreference).setEnabled(false);
    }

    private void mockSurfaceFlingerTransactResponse(boolean replyResult) throws RemoteException {
        doAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) {
                // Get the arguments passed to the mocked method
                Object[] args = invocation.getArguments();
                if (args[2] instanceof Parcel reply) {
                    reply.writeBoolean(replyResult);
                    reply.setDataPosition(0);
                }
                return true;
            }
        }).when(mSurfaceFlinger).transact(
                eq(SURFACE_FLINGER_CODE), any(), any(), eq(0 /* flags */));
    }
}
+28 −14
Original line number Diff line number Diff line
@@ -16,14 +16,13 @@

package com.android.settings.development;

import static com.android.settings.development.ShowSurfaceUpdatesPreferenceController
        .SURFACE_FLINGER_READ_CODE;
import static com.android.settings.development.ShowSurfaceUpdatesPreferenceController.SURFACE_FLINGER_READ_CODE;

import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
@@ -31,20 +30,20 @@ import static org.mockito.Mockito.when;

import android.content.Context;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;

import androidx.preference.PreferenceScreen;
import androidx.preference.SwitchPreference;

import com.android.settings.testutils.shadow.ShadowParcel;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.annotation.Config;
import org.robolectric.util.ReflectionHelpers;

@RunWith(RobolectricTestRunner.class)
@@ -86,22 +85,16 @@ public class ShowSurfaceUpdatesPreferenceControllerTest {
    }

    @Test
    @Config(shadows = ShadowParcel.class)
    public void updateState_settingEnabled_shouldCheckPreference() throws RemoteException {
        ShadowParcel.sReadIntResult = 1;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(1);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(true);
    }

    @Test
    @Config(shadows = {ShadowParcel.class})
    public void updateState_settingDisabled_shouldUnCheckPreference() throws RemoteException {
        ShadowParcel.sReadIntResult = 0;
        doReturn(true).when(mSurfaceFlinger)
            .transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(), eq(0 /* flags */));
        mockSurfaceFlingerTransactResponse(0);
        mController.updateState(mPreference);

        verify(mPreference).setChecked(false);
@@ -126,4 +119,25 @@ public class ShowSurfaceUpdatesPreferenceControllerTest {
        verify(mPreference).setChecked(false);
        verify(mPreference).setEnabled(false);
    }

    private void mockSurfaceFlingerTransactResponse(int showUpdatesReply) throws RemoteException {
        doAnswer(new Answer<Boolean>() {
            @Override
            public Boolean answer(InvocationOnMock invocation) {
                // Get the arguments passed to the mocked method
                Object[] args = invocation.getArguments();
                if (args[2] instanceof Parcel reply) {
                    // write showCpu
                    reply.writeInt(0);
                    // write enableGL
                    reply.writeInt(0);
                    // write showUpdates
                    reply.writeInt(showUpdatesReply);
                    reply.setDataPosition(0);
                }
                return true;
            }
        }).when(mSurfaceFlinger).transact(eq(SURFACE_FLINGER_READ_CODE), any(), any(),
                eq(0 /* flags */));
    }
}
+0 −32
Original line number Diff line number Diff line
package com.android.settings.testutils.shadow;

import android.os.Parcel;

import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

/**
 * This class provides helpers to test logic that reads from parcels.
 */
@Implements(Parcel.class)
public class ShadowParcel extends org.robolectric.shadows.ShadowParcel {

    public static int sReadIntResult;
    public static int sWriteIntResult;
    public static boolean sReadBoolResult;

    @Implementation
    protected int readInt() {
        return sReadIntResult;
    }

    @Implementation
    protected void writeInt(int val) {
        sWriteIntResult = val;
    }

    @Implementation
    protected boolean readBoolean() {
        return sReadBoolResult;
    }
}