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