10a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan/*
29c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu * Copyright (C) 2016 The Android Open Source Project
30a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
40a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Licensed under the Apache License, Version 2.0 (the "License");
50a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * you may not use this file except in compliance with the License.
60a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * You may obtain a copy of the License at
70a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
80a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *      http://www.apache.org/licenses/LICENSE-2.0
90a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan *
100a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * Unless required by applicable law or agreed to in writing, software
110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * distributed under the License is distributed on an "AS IS" BASIS,
120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * See the License for the specific language governing permissions and
140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan * limitations under the License.
150a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan */
160a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanpackage com.android.internal.telephony;
180a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
19b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.app.IAlarmManager;
20b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.content.Context;
2159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.content.Intent;
2262f7e2b54fb3ad9f1139ceaf3b15966c000a9135Jack Yuimport android.os.AsyncResult;
2359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.os.Bundle;
24dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport android.os.Handler;
25b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.os.HandlerThread;
26b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.os.IBinder;
27dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport android.os.Message;
28e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.os.Parcel;
29b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.os.SystemClock;
3059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.os.UserHandle;
313374f09335e5b7681af05a35dd7454b565f8bb72Jordan Liuimport android.platform.test.annotations.Postsubmit;
32e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.telephony.CellInfo;
33e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.telephony.CellInfoGsm;
3466fb0378fd913dfe564c8e31b5ef379592242615Jack Yuimport android.telephony.ServiceState;
35e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport android.telephony.SignalStrength;
36ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yuimport android.telephony.SubscriptionManager;
37cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yuimport android.telephony.gsm.GsmCellLocation;
3844b9d5b470fb45c0f59073f56cb48a2501996259Jack Yuimport android.test.suitebuilder.annotation.MediumTest;
39f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padaweimport android.test.suitebuilder.annotation.SmallTest;
40f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padaweimport android.util.Pair;
410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
42dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
43b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport com.android.internal.telephony.dataconnection.DcTracker;
440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.android.internal.telephony.test.SimulatedCommands;
456a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yuimport com.android.internal.telephony.uicc.IccCardApplicationStatus;
460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
47b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.After;
48b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.Before;
49b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.Test;
50b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.mockito.ArgumentCaptor;
51b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.mockito.Mock;
52b4237f12fd73204e9775909e03d9277e59d94766fionaxu
53b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport java.util.ArrayList;
54e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
55b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
56b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport static org.junit.Assert.assertEquals;
57b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport static org.junit.Assert.assertFalse;
58b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport static org.junit.Assert.assertTrue;
59dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport static org.mockito.Matchers.any;
60b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport static org.mockito.Matchers.anyLong;
61e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport static org.mockito.Matchers.anyString;
62e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport static org.mockito.Mockito.anyInt;
63d9fa90aaab09dae08df2a097ac4d61cedb98672aJack Yuimport static org.mockito.Mockito.atLeast;
64e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport static org.mockito.Mockito.doReturn;
65e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport static org.mockito.Mockito.eq;
66dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport static org.mockito.Mockito.times;
67e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport static org.mockito.Mockito.verify;
680a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
69f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajanpublic class ServiceStateTrackerTest extends TelephonyTest {
7062f7e2b54fb3ad9f1139ceaf3b15966c000a9135Jack Yu
710a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Mock
72b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private DcTracker mDct;
73ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu    @Mock
74ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu    private ProxyController mProxyController;
75f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Mock
76f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private Handler mTestHandler;
77b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @Mock
78b4237f12fd73204e9775909e03d9277e59d94766fionaxu    protected IAlarmManager mAlarmManager;
790a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
800a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private ServiceStateTracker sst;
81dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    private ServiceStateTrackerTestHandler mSSTTestHandler;
820a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
83f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_REGISTERED_TO_NETWORK = 1;
84f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_SUBSCRIPTION_INFO_READY = 2;
85f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_ROAMING_ON = 3;
86f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_ROAMING_OFF = 4;
87f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_CONNECTION_ATTACHED = 5;
88f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_CONNECTION_DETACHED = 6;
89f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_RAT_CHANGED = 7;
90f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_PS_RESTRICT_ENABLED = 8;
91f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_PS_RESTRICT_DISABLED = 9;
92f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
93b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private class ServiceStateTrackerTestHandler extends HandlerThread {
94b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
95b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        private ServiceStateTrackerTestHandler(String name) {
96b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu            super(name);
97b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
98b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
99b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
100b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        public void onLooperPrepared() {
101e2507b53266017e219a079f514801fe72ee90229Jack Yu            sst = new ServiceStateTracker(mPhone, mSimulatedCommands);
102f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan            setReady(true);
103b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
104b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
105b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
1060a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Before
1070a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void setUp() throws Exception {
108b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
109b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        logd("ServiceStateTrackerTest +Setup!");
110f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        super.setUp("ServiceStateTrackerTest");
1110a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
112ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu        doReturn(true).when(mDct).isDisconnected();
113b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        mPhone.mDcTracker = mDct;
1140a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1159c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(ProxyController.class, "sProxyController", null, mProxyController);
116ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu
11759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        mContextFixture.putStringArrayResource(
118b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                com.android.internal.R.array.config_sameNamedOperatorConsideredRoaming,
119b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                new String[]{"123456"});
120b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
12159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        mContextFixture.putStringArrayResource(
122b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                com.android.internal.R.array.config_operatorConsideredNonRoaming,
123b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                new String[]{"123456"});
124b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
12566fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
12666fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
12766fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
12866fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setDataRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
12966fb0378fd913dfe564c8e31b5ef379592242615Jack Yu
13038ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal        int dds = SubscriptionManager.getDefaultDataSubscriptionId();
13159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        doReturn(dds).when(mPhone).getSubId();
13259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
133dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        mSSTTestHandler = new ServiceStateTrackerTestHandler(getClass().getSimpleName());
134dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        mSSTTestHandler.start();
1355d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan        waitUntilReady();
13644b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu        waitForMs(600);
137b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        logd("ServiceStateTrackerTest -Setup!");
1380a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1390a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1400a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @After
1410a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void tearDown() throws Exception {
1420a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        sst = null;
1437e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mSSTTestHandler.quitSafely();
144f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        super.tearDown();
1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1476a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
14844b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
1490a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void testSetRadioPower() {
150e2507b53266017e219a079f514801fe72ee90229Jack Yu        boolean oldState = mSimulatedCommands.getRadioState().isOn();
1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        sst.setRadioPower(!oldState);
152ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu        waitForMs(100);
153e2507b53266017e219a079f514801fe72ee90229Jack Yu        assertTrue(oldState != mSimulatedCommands.getRadioState().isOn());
1540d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    }
1550d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1560d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    @Test
1570d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    @MediumTest
1580d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    public void testSetRadioPowerFromCarrier() {
1590d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // Carrier disable radio power
1600d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(false);
1610d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1620d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1630d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1640d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getPowerStateFromCarrier());
1650d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1660d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // User toggle radio power will not overrides carrier settings
1670d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPower(true);
1680d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1690d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1700d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1710d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getPowerStateFromCarrier());
1720d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1730d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // Carrier re-enable radio power
1740d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(true);
1750d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1760d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(mSimulatedCommands.getRadioState().isOn());
1770d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1780d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getPowerStateFromCarrier());
1790d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1800d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // User toggle radio power off (airplane mode) and set carrier on
1810d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPower(false);
1820d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(true);
1830d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1840d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1850d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getDesiredPowerState());
1860d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getPowerStateFromCarrier());
1870a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1896a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
19044b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
1917e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    public void testRilTrafficAfterSetRadioPower() {
1927d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.setRadioPower(true);
1937d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getOperatorCallCount = mSimulatedCommands.getGetOperatorCallCount();
1947d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getDataRegistrationStateCallCount =
1957d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount();
1967d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getVoiceRegistrationStateCallCount =
1977d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount();
1987d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getNetworkSelectionModeCallCount =
1997d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount();
2007d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.setRadioPower(false);
2017d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
2027d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        waitForMs(500);
2037d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.pollState();
2047d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        waitForMs(250);
2057d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
2067e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        // This test was meant to be for *no* ril traffic. However, RADIO_STATE_CHANGED is
2077e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        // considered a modem triggered action and that causes a pollState() to be done
2087e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getOperatorCallCount + 1, mSimulatedCommands.getGetOperatorCallCount());
2097e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getDataRegistrationStateCallCount + 1,
2107d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount());
2117e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getVoiceRegistrationStateCallCount + 1,
2127d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount());
2137e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getNetworkSelectionModeCallCount + 1,
2147d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount());
215b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt
216b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        // Note that if the poll is triggered by a network change notification
217b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        // and the modem is supposed to be off, we should still do the poll
218b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        mSimulatedCommands.notifyVoiceNetworkStateChanged();
219b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        waitForMs(250);
220b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt
2217e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getOperatorCallCount + 2 , mSimulatedCommands.getGetOperatorCallCount());
2227e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getDataRegistrationStateCallCount + 2,
223b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount());
2247e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getVoiceRegistrationStateCallCount + 2,
225b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount());
2267e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getNetworkSelectionModeCallCount + 2,
227b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount());
2287d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    }
2297d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
2307d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    @Test
2317d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    @MediumTest
23259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    public void testSpnUpdateShowPlmnOnly() {
23359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        doReturn(0x02).when(mSimRecords).getDisplayRule(anyString());
234153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN).
235153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                when(mUiccCardApplication3gpp).getState();
23659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
23759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED, null));
23859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
23944b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu        waitForMs(750);
24059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
24159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
242d9fa90aaab09dae08df2a097ac4d61cedb98672aJack Yu        verify(mContextFixture.getTestDouble(), atLeast(2)).
24359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu                sendStickyBroadcastAsUser(intentArgumentCaptor.capture(), eq(UserHandle.ALL));
24459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
24559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // We only want to verify the intent SPN_STRINGS_UPDATED_ACTION.
246d9fa90aaab09dae08df2a097ac4d61cedb98672aJack Yu        Intent intent = intentArgumentCaptor.getValue();
24759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION, intent.getAction());
24859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(Intent.FLAG_RECEIVER_REPLACE_PENDING, intent.getFlags());
24959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
25059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        Bundle b = intent.getExtras();
25159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
25259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // For boolean we need to make sure the key exists first
25359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_SPN));
25459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertFalse(b.getBoolean(TelephonyIntents.EXTRA_SHOW_SPN));
25559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
25659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(null, b.getString(TelephonyIntents.EXTRA_SPN));
25759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(null, b.getString(TelephonyIntents.EXTRA_DATA_SPN));
25859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
25959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // For boolean we need to make sure the key exists first
26059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_PLMN));
26159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.getBoolean(TelephonyIntents.EXTRA_SHOW_PLMN));
26259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
26359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(SimulatedCommands.FAKE_LONG_NAME, b.getString(TelephonyIntents.EXTRA_PLMN));
26466fb0378fd913dfe564c8e31b5ef379592242615Jack Yu
26566fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
26666fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        verify(mTelephonyManager).setDataNetworkTypeForPhone(anyInt(), intArgumentCaptor.capture());
26766fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA,
26866fb0378fd913dfe564c8e31b5ef379592242615Jack Yu                intArgumentCaptor.getValue().intValue());
26959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    }
27059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
2716a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
27244b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
273e2507b53266017e219a079f514801fe72ee90229Jack Yu    public void testCellInfoList() {
274e2507b53266017e219a079f514801fe72ee90229Jack Yu        Parcel p = Parcel.obtain();
275e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(1);
276e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(1);
277e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(2);
278e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeLong(1453510289108L);
279e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(310);
280e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(260);
281e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(123);
282e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(456);
283e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(99);
284e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(3);
285e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.setDataPosition(0);
286e2507b53266017e219a079f514801fe72ee90229Jack Yu
287e2507b53266017e219a079f514801fe72ee90229Jack Yu        CellInfoGsm cellInfo = CellInfoGsm.CREATOR.createFromParcel(p);
288e2507b53266017e219a079f514801fe72ee90229Jack Yu
289e2507b53266017e219a079f514801fe72ee90229Jack Yu        ArrayList<CellInfo> list = new ArrayList();
290e2507b53266017e219a079f514801fe72ee90229Jack Yu        list.add(cellInfo);
291e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        mSimulatedCommands.setCellInfoList(list);
292e2507b53266017e219a079f514801fe72ee90229Jack Yu
293e2507b53266017e219a079f514801fe72ee90229Jack Yu        assertEquals(sst.getAllCellInfo(), list);
294e2507b53266017e219a079f514801fe72ee90229Jack Yu    }
295e2507b53266017e219a079f514801fe72ee90229Jack Yu
296e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    @Test
29744b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
298e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    public void testImsRegState() {
299e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        // Simulate IMS registered
3007e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM});
301e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
302e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null));
303e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        waitForMs(200);
304e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
305e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertTrue(sst.isImsRegistered());
306e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
307e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        // Simulate IMS unregistered
3087e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mSimulatedCommands.setImsRegistrationState(new int[]{0, PhoneConstants.PHONE_TYPE_GSM});
309e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
310e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null));
311e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        waitForMs(200);
312e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
313e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertFalse(sst.isImsRegistered());
314e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    }
315e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
3163374f09335e5b7681af05a35dd7454b565f8bb72Jordan Liu    @Postsubmit
317e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    @Test
31844b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
319e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    public void testSignalStrength() {
320e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        SignalStrength ss = new SignalStrength(
321e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                30, // gsmSignalStrength
322e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                0,  // gsmBitErrorRate
323e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // cdmaDbm
324e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // cdmaEcio
325e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoDbm
326e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoEcio
327e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoSnr
328e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                99, // lteSignalStrength
329e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRsrp
330e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRsrq
331e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRssnr
332e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteCqi
333e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // tdScdmaRscp
334e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                true                        // gsmFlag
335e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        );
336e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
3370b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.setSignalStrength(ss);
3380b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
33948a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        waitForMs(300);
340e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertEquals(sst.getSignalStrength(), ss);
3410b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), true);
3420b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3430b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        // switch to CDMA
3440b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        doReturn(false).when(mPhone).isPhoneTypeGsm();
3450b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        doReturn(true).when(mPhone).isPhoneTypeCdmaLte();
3460b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.updatePhoneType();
3470b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_LTE);
3480b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3490b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
3500b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        waitForMs(200);
3510b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength(), ss);
3520b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), true);
3530b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3540b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        // notify signal strength again, but this time data RAT is not LTE
3550b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD);
3560b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
3570b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        waitForMs(200);
3580b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength(), ss);
3590b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), false);
360e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    }
361e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
362cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    @Test
36344b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
364cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    public void testGsmCellLocation() {
365cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu
366cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_GET_LOC_DONE,
367cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu                new AsyncResult(null, new String[]{"1", "2", "3", "4", "5", "6", "7", "8", "9",
368cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu                        "10", "11", "12", "13", "14", "15"}, null)));
369cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu
370cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        waitForMs(200);
371cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        GsmCellLocation cl = (GsmCellLocation) sst.getCellLocation();
372cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        assertEquals(2, cl.getLac());
373cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        assertEquals(3, cl.getCid());
374cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    }
375dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
376dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    @Test
377dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    @MediumTest
378dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    public void testUpdatePhoneType() {
379dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(false).when(mPhone).isPhoneTypeGsm();
380dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(true).when(mPhone).isPhoneTypeCdmaLte();
381dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM).when(mCdmaSSM).
382dbe4d7749d5524be575f629486874acdae721138Amit Mahajan                getCdmaSubscriptionSource();
383dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
384dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        logd("Calling updatePhoneType");
385dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // switch to CDMA
386dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.updatePhoneType();
387dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
388dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
389dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords).registerForRecordsLoaded(eq(sst), integerArgumentCaptor.capture(),
390dbe4d7749d5524be575f629486874acdae721138Amit Mahajan                any(Object.class));
391dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
392dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // response for mRuimRecords.registerForRecordsLoaded()
393dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        Message msg = Message.obtain();
394dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.what = integerArgumentCaptor.getValue();
395dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.obj = new AsyncResult(null, null, null);
396dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.sendMessage(msg);
397dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        waitForMs(100);
398dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
399dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // on RUIM_RECORDS_LOADED, sst is expected to call following apis
400dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords, times(1)).isProvisioned();
401dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
402dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // switch back to GSM
403dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(true).when(mPhone).isPhoneTypeGsm();
404dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(false).when(mPhone).isPhoneTypeCdmaLte();
405dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
406dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // response for mRuimRecords.registerForRecordsLoaded() can be sent after switching to GSM
407dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg = Message.obtain();
408dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.what = integerArgumentCaptor.getValue();
409dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.obj = new AsyncResult(null, null, null);
410dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.sendMessage(msg);
411dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
412dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // There's no easy way to check if the msg was handled or discarded. Wait to make sure sst
413dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // did not crash, and then verify that the functions called records loaded are not called
414dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // again
415dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        waitForMs(200);
416dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
417dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords, times(1)).isProvisioned();
418dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    }
419f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
420f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
421f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
422f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForVoiceRoamingOn() throws Exception {
423f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForVoiceRoamingOn(mTestHandler, EVENT_ROAMING_ON, null);
424f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
425f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming and trigger events to notify handler registered
426f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
427f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
428f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
429f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
430f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
431f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
432f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
433f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
434f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
435f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
436f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_ON, messageArgumentCaptor.getValue().what);
437f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
438f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
439f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
440f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
441f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
442f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
443f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
444f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
445f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
446f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForVoiceRoamingOn(mTestHandler);
447f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
448f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
449f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
450f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
451f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
452f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
453f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
454f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
455f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
456f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
457f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
458f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
459f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
460f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
461f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForVoiceRoamingOff() throws Exception {
462f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
463f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
464f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
465f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
466f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
467f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
468f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
469f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
470f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForVoiceRoamingOff(mTestHandler, EVENT_ROAMING_OFF, null);
471f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
472f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
473f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
474f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
475f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
476f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
477f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
478f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
479f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
480f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
481f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
482f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
483f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_OFF, messageArgumentCaptor.getValue().what);
484f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
485f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
486f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
487f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
488f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
489f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
490f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
491f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
492f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
493f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForVoiceRoamingOff(mTestHandler);
494f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
495f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
496f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
497f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
498f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
499f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
500f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
501f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
502f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
503f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
504f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
505f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
506f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
507f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
508f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataRoamingOn() throws Exception {
509f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRoamingOn(mTestHandler, EVENT_ROAMING_ON, null);
510f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
511f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming and trigger events to notify handler registered
512f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
513f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
514f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
515f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
516f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
517f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
518f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
519f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
520f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
521f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
522f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_ON, messageArgumentCaptor.getValue().what);
523f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
524f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
525f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
526f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
527f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
528f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
529f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
530f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
531f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
532f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataRoamingOn(mTestHandler);
533f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
534f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
535f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
536f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
537f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
538f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
539f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
540f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
541f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
542f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
543f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
544f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
545f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
546f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
547f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataRoamingOff() throws Exception {
548f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
549f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
550f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
551f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
552f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
553f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
554f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
555f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
556f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRoamingOff(mTestHandler, EVENT_ROAMING_OFF, null);
557f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
558f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
559f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
560f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
561f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
562f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
563f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
564f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
565f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
566f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
567f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
568f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
569f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_OFF, messageArgumentCaptor.getValue().what);
570f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
571f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
572f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
573f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
574f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
575f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
576f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
577f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
578f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
579f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataRoamingOff(mTestHandler);
580f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
581f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
582f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
583f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
584f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
585f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
586f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
587f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
588f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
589f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
590f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
591f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
592f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
593f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
594f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataConnAttach() throws Exception {
595f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state out of service
596f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
597f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
598f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
599f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
600f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
6013e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe        waitForMs(100);
6023e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe
603f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null);
604f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
605f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service and trigger events to post message on handler
606f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
607f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
608f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
609f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
6102dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        waitForMs(200);
611f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
612f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
613f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
614f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
615f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what);
616f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
617f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
618f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
619f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
620f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
621f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
622f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
623f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
624f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
625f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataConnectionAttached(mTestHandler);
626f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
627f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
628f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
629f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
630f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
631f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
632f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
633f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
634f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
635f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
636f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
637f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
638f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
639f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
640f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataConnDetach() throws Exception {
641f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state in service
642f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
643f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
644f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
645f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
646f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
647f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataConnectionDetached(mTestHandler, EVENT_DATA_CONNECTION_DETACHED, null);
648f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
649f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service and trigger events to post message on handler
650f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
651f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
652f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
653f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
654f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
655f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
656f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
657f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
658f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
659f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_DATA_CONNECTION_DETACHED, messageArgumentCaptor.getValue().what);
660f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
661f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
662f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
663f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
664f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
665f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
666f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
667f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
668f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
669f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataConnectionDetached(mTestHandler);
670f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
671f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
672f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
673f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
674f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
675f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
676f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
677f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
678f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
679f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
680f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
681f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
682f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
683f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
684f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForDataRegStateOrRatChange() {
685f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        int drs = sst.mSS.RIL_REG_STATE_HOME;
686f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        int rat = sst.mSS.RIL_RADIO_TECHNOLOGY_LTE;
687f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setRilDataRadioTechnology(rat);
688f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setDataRegState(drs);
689f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRegStateOrRatChanged(mTestHandler, EVENT_DATA_RAT_CHANGED, null);
690f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
691f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
692f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
693f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Verify if message was posted to handler and value of result
694f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
695f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
696f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_DATA_RAT_CHANGED, messageArgumentCaptor.getValue().what);
697f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(new Pair<Integer, Integer>(drs, rat),
698f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe                ((AsyncResult)messageArgumentCaptor.getValue().obj).result);
699f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
700f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
701f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
702f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
703f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForNetworkAttached() throws Exception {
704f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state out of service
705f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
706f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
707f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
708f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
709f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
7103e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe        waitForMs(100);
7113e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe
712f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null);
713f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
714f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service and trigger events to post message on handler
715f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
716f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
717f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
718f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
719f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
720f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
721f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
722f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
723f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
724f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what);
725f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
726f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
727f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
728f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
729f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
730f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
731f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
732f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
733f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
734f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForNetworkAttached(mTestHandler);
735f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
736f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
737f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
738f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
739f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyVoiceNetworkStateChanged();
740f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
741f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
742f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
743f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
744f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
745f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
746f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
747f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
748f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
749f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForPsRestrictedEnabled() throws Exception {
750f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mRestrictedState.setPsRestricted(true);
751f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Since PsRestricted is set to true, registerForPsRestrictedEnabled will
752f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // also post message to handler
753f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForPsRestrictedEnabled(mTestHandler, EVENT_PS_RESTRICT_ENABLED, null);
754f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
755f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
756f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
757f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
758f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
759f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
760f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_PS_RESTRICT_ENABLED, messageArgumentCaptor.getValue().what);
761f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
762f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
763f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
764f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
765f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForPsRestrictedDisabled() throws Exception {
766f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mRestrictedState.setPsRestricted(true);
767f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Since PsRestricted is set to true, registerForPsRestrictedDisabled will
768f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // also post message to handler
769f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForPsRestrictedDisabled(mTestHandler, EVENT_PS_RESTRICT_DISABLED, null);
770f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
771f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
772f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
773f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
774f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
775f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
776f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_PS_RESTRICT_DISABLED, messageArgumentCaptor.getValue().what);
777f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
778f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
779f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
780f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
781f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForSubscriptionInfoReady() {
782f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForSubscriptionInfoReady(mTestHandler, EVENT_SUBSCRIPTION_INFO_READY, null);
783f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
784f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Call functions which would trigger posting of message on test handler
785f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
786f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.updatePhoneType();
787f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyOtaProvisionStatusChanged();
788f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
789f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(200);
790f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
791f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
792f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
793f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
794f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_SUBSCRIPTION_INFO_READY, messageArgumentCaptor.getValue().what);
795f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
796f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
797f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
798f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
799f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testGetDesiredPowerState() {
800f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.setRadioPower(true);
801f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.getDesiredPowerState(), true);
802f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
803f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
804f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
805f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
806f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testEnableLocationUpdates() throws Exception {
807f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.enableLocationUpdates();
808f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(true),
8093e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe                any(Message.class));
810f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
811f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
812f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
813f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
814f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testDisableLocationUpdates() throws Exception {
815f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.disableLocationUpdates();
816f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(false),
8173e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe                any(Message.class));
818f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
819f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
820f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
821f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
822f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testGetCurrentDataRegState() throws Exception {
823f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setDataRegState(ServiceState.STATE_OUT_OF_SERVICE);
824f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.getCurrentDataConnectionState(), ServiceState.STATE_OUT_OF_SERVICE);
825f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
826f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
827f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
828f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
829f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsConcurrentVoiceAndDataAllowed() {
830f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Verify all 3 branches in the function isConcurrentVoiceAndDataAllowed
831f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
832f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setRilVoiceRadioTechnology(sst.mSS.RIL_RADIO_TECHNOLOGY_HSPA);
833f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isConcurrentVoiceAndDataAllowed());
834f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
835f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
836f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeCdma();
837f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(false, sst.isConcurrentVoiceAndDataAllowed());
838f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
839f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
840f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeCdma();
841f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setCssIndicator(1);
842f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isConcurrentVoiceAndDataAllowed());
843f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setCssIndicator(0);
844f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(false, sst.isConcurrentVoiceAndDataAllowed());
845f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
846f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
847f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
848f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
849f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsImsRegistered() throws Exception {
850f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM});
851f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyImsNetworkStateChanged();
852f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(200);
853f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.isImsRegistered(), true);
854f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
855f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
856f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
857f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
858f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsDeviceShuttingDown() throws Exception {
859f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.requestShutdown();
860f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isDeviceShuttingDown());
861f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
862b4237f12fd73204e9775909e03d9277e59d94766fionaxu
863b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @Test
864b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @SmallTest
865b4237f12fd73204e9775909e03d9277e59d94766fionaxu    public void testSetTimeFromNITZStr() throws Exception {
866b4237f12fd73204e9775909e03d9277e59d94766fionaxu        doReturn(mAlarmManager).when(mIBinder).queryLocalInterface(anyString());
867b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mServiceManagerMockedServices.put(Context.ALARM_SERVICE, mIBinder);
868b4237f12fd73204e9775909e03d9277e59d94766fionaxu
869b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Mock sending incorrect nitz str from RIL
870b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0");
871b4237f12fd73204e9775909e03d9277e59d94766fionaxu        waitForMs(100);
872b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // AlarmManger.setTime is triggered by SystemClock.setCurrentTimeMillis().
873b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Verify system time is not set to incorrect NITZ time
874b4237f12fd73204e9775909e03d9277e59d94766fionaxu        verify(mAlarmManager, times(0)).setTime(anyLong());
875b4237f12fd73204e9775909e03d9277e59d94766fionaxu
876b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Mock sending correct nitz str from RIL
877b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mSimulatedCommands.triggerNITZupdate("15/06/20,00:00:00+0");
878b4237f12fd73204e9775909e03d9277e59d94766fionaxu        waitForMs(100);
879b4237f12fd73204e9775909e03d9277e59d94766fionaxu        verify(mAlarmManager, times(1)).setTime(anyLong());
880b4237f12fd73204e9775909e03d9277e59d94766fionaxu    }
8813374f09335e5b7681af05a35dd7454b565f8bb72Jordan Liu}
882