package com.android.server.deviceconfig; import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.Context; import android.content.ContextWrapper; import android.os.PersistableBundle; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.Log; import androidx.test.filters.SmallTest; import org.junit.Before; import org.junit.Test; @SmallTest public class SimPinReplayManagerTest { private static final String TAG = "SimPinReplayManagerTest"; // A copy of the hidden field CarrierConfigManager#KEY_STORE_SIM_PIN_FOR_UNATTENDED_REBOOT_BOOL. public static final String CARRIER_ENABLE_SIM_PIN_STORAGE_KEY = "store_sim_pin_for_unattended_reboot_bool"; SimPinReplayManager mSimPinReplayManager; SubscriptionManager mSubscriptionManager; TelephonyManager mTelephonyManager; CarrierConfigManager mCarrierConfigManager; private Context mContext; @Before public void setUp() { mSubscriptionManager = mock(SubscriptionManager.class); mTelephonyManager = mock(TelephonyManager.class); mCarrierConfigManager = mock(CarrierConfigManager.class); mContext = new ContextWrapper(getInstrumentation().getTargetContext()) { @Override public Object getSystemService(String name) { if (name.equals(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) { return mSubscriptionManager; } else if (name.equals(Context.TELEPHONY_SERVICE)) { return mTelephonyManager; } else if (name.equals(Context.CARRIER_CONFIG_SERVICE)) { return mCarrierConfigManager; } return super.getSystemService(name); } }; mSimPinReplayManager = new SimPinReplayManager(mContext); } @Test public void prepareSimPinReplay_success() { Log.i(TAG, "prepareSimPinReplay_success"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(true); // has pin PersistableBundle config = new PersistableBundle(); // empty carrier config when(mCarrierConfigManager.getConfigForSubId(1, CARRIER_ENABLE_SIM_PIN_STORAGE_KEY)) .thenReturn(config); when(mTelephonyManager.prepareForUnattendedReboot()) .thenReturn(TelephonyManager.PREPARE_UNATTENDED_REBOOT_SUCCESS); boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertTrue(isPrepared); } @Test public void prepareSimPinReplay_noSim() { Log.i(TAG, "prepareSimPinReplay_noSim"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {}); // no sim boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertTrue(isPrepared); } @Test public void prepareSimPinReplay_noSimPin() { Log.i(TAG, "prepareSimPinReplay_noSimPin"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(false); // no pin boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertTrue(isPrepared); } @Test public void prepareSimPinReplay_carrierDisableSimPin() { Log.i(TAG, "prepareSimPinReplay_carrierDisableSimPin"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(true); // has pin PersistableBundle config = new PersistableBundle(); config.putBoolean(CARRIER_ENABLE_SIM_PIN_STORAGE_KEY, false); // carrier disabled when(mCarrierConfigManager.getConfigForSubId(1, CARRIER_ENABLE_SIM_PIN_STORAGE_KEY)) .thenReturn(config); boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertFalse(isPrepared); } @Test public void prepareSimPinReplay_carrierEnabled() { Log.i(TAG, "prepareSimPinReplay_carrierEnabled"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(true); // has pin PersistableBundle config = new PersistableBundle(); config.putBoolean(CARRIER_ENABLE_SIM_PIN_STORAGE_KEY, true); // carrier enabled when(mCarrierConfigManager.getConfigForSubId(1, CARRIER_ENABLE_SIM_PIN_STORAGE_KEY)) .thenReturn(config); when(mTelephonyManager.prepareForUnattendedReboot()) .thenReturn(TelephonyManager.PREPARE_UNATTENDED_REBOOT_SUCCESS); boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertTrue(isPrepared); } @Test public void prepareSimPinReplay_prepareError() { Log.i(TAG, "prepareSimPinReplay_prepareError"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(true); // has pin PersistableBundle config = new PersistableBundle(); config.putBoolean(CARRIER_ENABLE_SIM_PIN_STORAGE_KEY, true); // carrier enabled when(mCarrierConfigManager.getConfigForSubId(1, CARRIER_ENABLE_SIM_PIN_STORAGE_KEY)) .thenReturn(config); when(mTelephonyManager.prepareForUnattendedReboot()) .thenReturn(TelephonyManager.PREPARE_UNATTENDED_REBOOT_ERROR); boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertFalse(isPrepared); } @Test public void prepareSimPinReplay_preparePinRequired() { Log.i(TAG, "prepareSimPinReplay_preparePinRequired"); when(mSubscriptionManager.getActiveSubscriptionIdList()).thenReturn(new int[] {1}); // has sim TelephonyManager subIdManager = mock(TelephonyManager.class); when(mTelephonyManager.createForSubscriptionId(1)).thenReturn(subIdManager); when(subIdManager.isIccLockEnabled()).thenReturn(true); // has pin PersistableBundle config = new PersistableBundle(); config.putBoolean(CARRIER_ENABLE_SIM_PIN_STORAGE_KEY, true); // carrier enabled when(mCarrierConfigManager.getConfigForSubId(1, CARRIER_ENABLE_SIM_PIN_STORAGE_KEY)) .thenReturn(config); when(mTelephonyManager.prepareForUnattendedReboot()) .thenReturn(TelephonyManager.PREPARE_UNATTENDED_REBOOT_PIN_REQUIRED); boolean isPrepared = mSimPinReplayManager.prepareSimPinReplay(); assertFalse(isPrepared); } }