Added unit test for ServiceStateTracker. Added testSpnUpdateShowPlmnOnly test which simulates the scenario that only PLMN is shown but not SPN. bug: 25691379 Change-Id: I65ae7d59d1fe6039997631152997dca17c8f390f
diff --git a/src/java/com/android/internal/telephony/test/SimulatedCommands.java b/src/java/com/android/internal/telephony/test/SimulatedCommands.java index 9738133..26333f5 100644 --- a/src/java/com/android/internal/telephony/test/SimulatedCommands.java +++ b/src/java/com/android/internal/telephony/test/SimulatedCommands.java
@@ -61,6 +61,9 @@ private final static SimFdnState INITIAL_FDN_STATE = SimFdnState.NONE; private final static String DEFAULT_SIM_PIN2_CODE = "5678"; private final static String SIM_PUK2_CODE = "87654321"; + public final static String FAKE_LONG_NAME = "Fake long name"; + public final static String FAKE_SHORT_NAME = "Fake short name"; + public final static String FAKE_MCC_MNC = "123456"; //***** Instance Variables @@ -946,9 +949,9 @@ public void getOperator(Message result) { String[] ret = new String[3]; - ret[0] = "El Telco Loco"; - ret[1] = "Telco Loco"; - ret[2] = "001001"; + ret[0] = FAKE_LONG_NAME; + ret[1] = FAKE_SHORT_NAME; + ret[2] = FAKE_MCC_MNC; resultSuccess(result, ret); }
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java index 19e08fb..c37b9fa 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java +++ b/tests/telephonytests/src/com/android/internal/telephony/ContextFixture.java
@@ -23,6 +23,7 @@ import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; +import android.app.AlarmManager; import android.app.AppOpsManager; import android.app.NotificationManager; import android.content.BroadcastReceiver; @@ -166,6 +167,8 @@ return mSubscriptionManager; case Context.WIFI_SERVICE: return mWifiManager; + case Context.ALARM_SERVICE: + return mAlarmManager; default: return null; } @@ -306,6 +309,7 @@ private final UserManager mUserManager = mock(UserManager.class); private final CarrierConfigManager mCarrierConfigManager = mock(CarrierConfigManager.class); private final SubscriptionManager mSubscriptionManager = mock(SubscriptionManager.class); + private final AlarmManager mAlarmManager = mock(AlarmManager.class); private final WifiManager mWifiManager = mock(WifiManager.class); private final ContentProvider mContentProvider = spy(new FakeContentProvider()); private final SharedPreferences mSharedPreferences = mock(SharedPreferences.class);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java index c076d30..a8db192 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/ServiceStateTrackerTest.java
@@ -16,7 +16,10 @@ package com.android.internal.telephony; +import android.content.Intent; +import android.os.Bundle; import android.os.HandlerThread; +import android.os.UserHandle; import android.telephony.SubscriptionManager; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; @@ -24,14 +27,18 @@ import com.android.internal.telephony.dataconnection.DcTracker; import com.android.internal.telephony.test.SimulatedCommands; +import com.android.internal.telephony.uicc.SIMRecords; +import com.android.internal.telephony.uicc.UiccCardApplication; import com.android.internal.telephony.uicc.UiccController; +import static com.android.internal.telephony.TelephonyTestUtils.waitForMs; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -45,6 +52,10 @@ @Mock private UiccController mUiccController; @Mock + private UiccCardApplication m3GPPUiccApp; + @Mock + private SIMRecords mSimRecords; + @Mock private SubscriptionController mSubscriptionController; @Mock private SparseArray<TelephonyEventLog> mLogInstances; @@ -56,7 +67,7 @@ private ProxyController mProxyController; private SimulatedCommands simulatedCommands; - private ContextFixture contextFixture; + private ContextFixture mContextFixture; private ServiceStateTracker sst; private Object mLock = new Object(); @@ -87,26 +98,21 @@ } } - private void waitForMs(long ms) { - try { - Thread.sleep(ms); - } catch (InterruptedException e) { - logd("InterruptedException while waiting for voice rat to change: " + e); - } - } - @Before public void setUp() throws Exception { logd("ServiceStateTrackerTest +Setup!"); MockitoAnnotations.initMocks(this); - contextFixture = new ContextFixture(); + mContextFixture = new ContextFixture(); simulatedCommands = new SimulatedCommands(); - doReturn(contextFixture.getTestDouble()).when(mPhone).getContext(); + doReturn(mContextFixture.getTestDouble()).when(mPhone).getContext(); doReturn(true).when(mPhone).getUnitTestMode(); doReturn(true).when(mPhone).isPhoneTypeGsm(); doReturn(true).when(mDct).isDisconnected(); + doReturn(m3GPPUiccApp).when(mUiccController).getUiccCardApplication( + anyInt(), eq(UiccController.APP_FAM_3GPP)); + doReturn(mSimRecords).when(m3GPPUiccApp).getIccRecords(); mPhone.mDcTracker = mDct; //Use reflection to mock singleton @@ -130,14 +136,17 @@ field.setAccessible(true); field.set(null, mProxyController); - contextFixture.putStringArrayResource( + mContextFixture.putStringArrayResource( com.android.internal.R.array.config_sameNamedOperatorConsideredRoaming, new String[]{"123456"}); - contextFixture.putStringArrayResource( + mContextFixture.putStringArrayResource( com.android.internal.R.array.config_operatorConsideredNonRoaming, new String[]{"123456"}); + int dds = SubscriptionManager.getDefaultDataSubId(); + doReturn(dds).when(mPhone).getSubId(); + new ServiceStateTrackerTestHandler(TAG).start(); logd("ServiceStateTrackerTest -Setup!"); } @@ -149,17 +158,51 @@ @Test @SmallTest public void testSetRadioPower() { - - int dds = SubscriptionManager.getDefaultDataSubId(); - doReturn(dds).when(mPhone).getSubId(); - waitUntilReady(); + boolean oldState = simulatedCommands.getRadioState().isOn(); sst.setRadioPower(!oldState); waitForMs(100); assertTrue(oldState != simulatedCommands.getRadioState().isOn()); } + @Test @SmallTest + public void testSpnUpdateShowPlmnOnly() { + waitUntilReady(); + + doReturn(0x02).when(mSimRecords).getDisplayRule(anyString()); + + sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED, null)); + + waitForMs(100); + + // There should be two sticky broadcasts. The first one is SPN_STRINGS_UPDATED_ACTION, + // and the second one is NETWORK_SET_TIMEZONE. + ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class); + verify(mContextFixture.getTestDouble(), times(2)). + sendStickyBroadcastAsUser(intentArgumentCaptor.capture(), eq(UserHandle.ALL)); + + // We only want to verify the intent SPN_STRINGS_UPDATED_ACTION. + Intent intent = intentArgumentCaptor.getAllValues().get(0); + assertEquals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION, intent.getAction()); + assertEquals(Intent.FLAG_RECEIVER_REPLACE_PENDING, intent.getFlags()); + + Bundle b = intent.getExtras(); + + // For boolean we need to make sure the key exists first + assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_SPN)); + assertFalse(b.getBoolean(TelephonyIntents.EXTRA_SHOW_SPN)); + + assertEquals(null, b.getString(TelephonyIntents.EXTRA_SPN)); + assertEquals(null, b.getString(TelephonyIntents.EXTRA_DATA_SPN)); + + // For boolean we need to make sure the key exists first + assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_PLMN)); + assertTrue(b.getBoolean(TelephonyIntents.EXTRA_SHOW_PLMN)); + + assertEquals(SimulatedCommands.FAKE_LONG_NAME, b.getString(TelephonyIntents.EXTRA_PLMN)); + } + private static void logd(String s) { Log.d(TAG, s); }