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
1937a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
2037a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu
2137a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.junit.Assert.assertEquals;
2237a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.junit.Assert.assertFalse;
2337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.junit.Assert.assertTrue;
2437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Matchers.any;
2537a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Matchers.anyLong;
2637a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Matchers.anyString;
27b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajanimport static org.mockito.Matchers.nullable;
2837a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.anyInt;
2937a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.doReturn;
3037a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.eq;
3137a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.spy;
3237a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.times;
3337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yuimport static org.mockito.Mockito.verify;
3437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu
35b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.app.IAlarmManager;
36b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport android.content.Context;
3759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.content.Intent;
3849c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yuimport android.hardware.radio.V1_0.CellIdentityGsm;
3949c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yuimport android.hardware.radio.V1_0.CellInfoType;
4049c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yuimport android.hardware.radio.V1_0.VoiceRegStateResult;
4162f7e2b54fb3ad9f1139ceaf3b15966c000a9135Jack Yuimport android.os.AsyncResult;
4259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.os.Bundle;
43dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport android.os.Handler;
44b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport android.os.HandlerThread;
45dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport android.os.Message;
46e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.os.Parcel;
478e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindranimport android.os.Process;
4859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yuimport android.os.UserHandle;
498e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindranimport android.os.WorkSource;
50e73ef117c8f5a7ea2feaa9ba8a15ec2de4137c7dJordan Liuimport android.support.test.filters.FlakyTest;
51e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.telephony.CellInfo;
52e2507b53266017e219a079f514801fe72ee90229Jack Yuimport android.telephony.CellInfoGsm;
5366fb0378fd913dfe564c8e31b5ef379592242615Jack Yuimport android.telephony.ServiceState;
54e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yuimport android.telephony.SignalStrength;
55ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yuimport android.telephony.SubscriptionManager;
56cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yuimport android.telephony.gsm.GsmCellLocation;
5744b9d5b470fb45c0f59073f56cb48a2501996259Jack Yuimport android.test.suitebuilder.annotation.MediumTest;
58f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padaweimport android.test.suitebuilder.annotation.SmallTest;
59f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padaweimport android.util.Pair;
600a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
61dbe4d7749d5524be575f629486874acdae721138Amit Mahajanimport com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager;
62b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yuimport com.android.internal.telephony.dataconnection.DcTracker;
630a567c9ed954f295df83c753239646c6f6a04128Amit Mahajanimport com.android.internal.telephony.test.SimulatedCommands;
646a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yuimport com.android.internal.telephony.uicc.IccCardApplicationStatus;
650a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
66b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.After;
67b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.Before;
68b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.junit.Test;
69b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.mockito.ArgumentCaptor;
70b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport org.mockito.Mock;
71b4237f12fd73204e9775909e03d9277e59d94766fionaxu
72b4237f12fd73204e9775909e03d9277e59d94766fionaxuimport java.util.ArrayList;
7349c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yuimport java.util.List;
74e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
75f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajanpublic class ServiceStateTrackerTest extends TelephonyTest {
7662f7e2b54fb3ad9f1139ceaf3b15966c000a9135Jack Yu
770a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Mock
78b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private DcTracker mDct;
79ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu    @Mock
80ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu    private ProxyController mProxyController;
81f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Mock
82f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private Handler mTestHandler;
83b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @Mock
84b4237f12fd73204e9775909e03d9277e59d94766fionaxu    protected IAlarmManager mAlarmManager;
850a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
860a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    private ServiceStateTracker sst;
87dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    private ServiceStateTrackerTestHandler mSSTTestHandler;
880a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
89f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_REGISTERED_TO_NETWORK = 1;
90f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_SUBSCRIPTION_INFO_READY = 2;
91f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_ROAMING_ON = 3;
92f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_ROAMING_OFF = 4;
93f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_CONNECTION_ATTACHED = 5;
94f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_CONNECTION_DETACHED = 6;
95f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_DATA_RAT_CHANGED = 7;
96f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_PS_RESTRICT_ENABLED = 8;
97f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    private static final int EVENT_PS_RESTRICT_DISABLED = 9;
98f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
99b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    private class ServiceStateTrackerTestHandler extends HandlerThread {
100b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
101b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        private ServiceStateTrackerTestHandler(String name) {
102b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu            super(name);
103b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
104b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
105b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        @Override
106b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        public void onLooperPrepared() {
107e2507b53266017e219a079f514801fe72ee90229Jack Yu            sst = new ServiceStateTracker(mPhone, mSimulatedCommands);
108f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan            setReady(true);
109b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        }
110b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu    }
111b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
1120a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @Before
1130a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void setUp() throws Exception {
114b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
115b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        logd("ServiceStateTrackerTest +Setup!");
116f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        super.setUp("ServiceStateTrackerTest");
1170a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
118ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu        doReturn(true).when(mDct).isDisconnected();
119b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        mPhone.mDcTracker = mDct;
1200a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1219c96807d990cdd3f4bb2d3f0fd56a1e78a95b353Jack Yu        replaceInstance(ProxyController.class, "sProxyController", null, mProxyController);
122ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu
12359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        mContextFixture.putStringArrayResource(
124b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                com.android.internal.R.array.config_sameNamedOperatorConsideredRoaming,
125b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                new String[]{"123456"});
126b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
12759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        mContextFixture.putStringArrayResource(
128b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                com.android.internal.R.array.config_operatorConsideredNonRoaming,
129b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu                new String[]{"123456"});
130b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu
13166fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
13266fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setVoiceRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
13366fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
13466fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        mSimulatedCommands.setDataRadioTech(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA);
13566fb0378fd913dfe564c8e31b5ef379592242615Jack Yu
13638ca51d0f643405df51e78fce6c546424e9f410dShishir Agrawal        int dds = SubscriptionManager.getDefaultDataSubscriptionId();
13759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        doReturn(dds).when(mPhone).getSubId();
13859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
139dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        mSSTTestHandler = new ServiceStateTrackerTestHandler(getClass().getSimpleName());
140dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        mSSTTestHandler.start();
1415d5ca33a24e6b73a48b575a0e1a5e790784d0bb7Amit Mahajan        waitUntilReady();
14244b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu        waitForMs(600);
143b6514b21f3d8ed47a088b741a18fe0b1de2308eaJack Yu        logd("ServiceStateTrackerTest -Setup!");
1440a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1450a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1460a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    @After
1470a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void tearDown() throws Exception {
1480a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        sst = null;
149ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mSSTTestHandler.quit();
150f152b32a20be664788536a223b9ac7a52f69e4ddAmit Mahajan        super.tearDown();
1510a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1520a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1536a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
15444b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
1550a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    public void testSetRadioPower() {
156e2507b53266017e219a079f514801fe72ee90229Jack Yu        boolean oldState = mSimulatedCommands.getRadioState().isOn();
1570a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan        sst.setRadioPower(!oldState);
158ddc28e1e7dd574c22f19c5b1b251aa4c7ea74fd7Jack Yu        waitForMs(100);
159e2507b53266017e219a079f514801fe72ee90229Jack Yu        assertTrue(oldState != mSimulatedCommands.getRadioState().isOn());
1600d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    }
1610d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1620d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    @Test
1630d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    @MediumTest
1640d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu    public void testSetRadioPowerFromCarrier() {
1650d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // Carrier disable radio power
1660d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(false);
1670d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1680d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1690d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1700d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getPowerStateFromCarrier());
1710d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1720d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // User toggle radio power will not overrides carrier settings
1730d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPower(true);
1740d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1750d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1760d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1770d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getPowerStateFromCarrier());
1780d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1790d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // Carrier re-enable radio power
1800d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(true);
1810d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1820d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(mSimulatedCommands.getRadioState().isOn());
1830d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getDesiredPowerState());
1840d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getPowerStateFromCarrier());
1850d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu
1860d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        // User toggle radio power off (airplane mode) and set carrier on
1870d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPower(false);
1880d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        sst.setRadioPowerFromCarrier(true);
1890d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        waitForMs(100);
1900d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(mSimulatedCommands.getRadioState().isOn());
1910d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertFalse(sst.getDesiredPowerState());
1920d5e6cc0fdfb839d63abe1e7eb85eee1b5942108fionaxu        assertTrue(sst.getPowerStateFromCarrier());
1930a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan    }
1940a567c9ed954f295df83c753239646c6f6a04128Amit Mahajan
1956a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
19644b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
1977e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    public void testRilTrafficAfterSetRadioPower() {
1987d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.setRadioPower(true);
1997d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getOperatorCallCount = mSimulatedCommands.getGetOperatorCallCount();
2007d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getDataRegistrationStateCallCount =
2017d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount();
2027d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getVoiceRegistrationStateCallCount =
2037d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount();
2047d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        final int getNetworkSelectionModeCallCount =
2057d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount();
2067d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.setRadioPower(false);
2077d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
2087d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        waitForMs(500);
2097d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        sst.pollState();
2107d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt        waitForMs(250);
2117d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
2127e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        // This test was meant to be for *no* ril traffic. However, RADIO_STATE_CHANGED is
2137e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        // considered a modem triggered action and that causes a pollState() to be done
2147e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getOperatorCallCount + 1, mSimulatedCommands.getGetOperatorCallCount());
2157e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getDataRegistrationStateCallCount + 1,
2167d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount());
2177e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getVoiceRegistrationStateCallCount + 1,
2187d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount());
2197e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getNetworkSelectionModeCallCount + 1,
2207d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount());
221b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt
222b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        // Note that if the poll is triggered by a network change notification
223b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        // and the modem is supposed to be off, we should still do the poll
22437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
225b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt        waitForMs(250);
226b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt
2277e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getOperatorCallCount + 2 , mSimulatedCommands.getGetOperatorCallCount());
2287e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getDataRegistrationStateCallCount + 2,
229b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetDataRegistrationStateCallCount());
2307e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getVoiceRegistrationStateCallCount + 2,
231b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetVoiceRegistrationStateCallCount());
2327e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        assertEquals(getNetworkSelectionModeCallCount + 2,
233b9e8a7d21c671240b387bb6b8e8314aa710c0d57Robert Greenwalt                mSimulatedCommands.getGetNetworkSelectionModeCallCount());
2347d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    }
2357d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt
236516010d13181808ca8205316a419b615e5a9fe5eShuoq    @FlakyTest
2377d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    @Test
2387d592679b92a2fb35514193f2f95cd0138035050Robert Greenwalt    @MediumTest
23959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    public void testSpnUpdateShowPlmnOnly() {
24059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        doReturn(0x02).when(mSimRecords).getDisplayRule(anyString());
241153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan        doReturn(IccCardApplicationStatus.AppState.APPSTATE_UNKNOWN).
242153077e0b2d9ff6f115a0739dac1d64931bffb91Amit Mahajan                when(mUiccCardApplication3gpp).getState();
24359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
24459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_NETWORK_STATE_CHANGED, null));
24559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
24644b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu        waitForMs(750);
24759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
24859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        ArgumentCaptor<Intent> intentArgumentCaptor = ArgumentCaptor.forClass(Intent.class);
24949c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        verify(mContextFixture.getTestDouble(), times(3))
25049c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu                .sendStickyBroadcastAsUser(intentArgumentCaptor.capture(), eq(UserHandle.ALL));
25159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
25259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // We only want to verify the intent SPN_STRINGS_UPDATED_ACTION.
25349c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        List<Intent> intents = intentArgumentCaptor.getAllValues();
25449c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        logd("Total " + intents.size() + " intents");
25549c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        for (Intent intent : intents) {
25649c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu            logd("  " + intent.getAction());
25749c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        }
25849c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        Intent intent = intents.get(2);
25959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(TelephonyIntents.SPN_STRINGS_UPDATED_ACTION, intent.getAction());
26059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
26159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        Bundle b = intent.getExtras();
26259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
26359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // For boolean we need to make sure the key exists first
26459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_SPN));
26559d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertFalse(b.getBoolean(TelephonyIntents.EXTRA_SHOW_SPN));
26659d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
26759d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(null, b.getString(TelephonyIntents.EXTRA_SPN));
26859d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(null, b.getString(TelephonyIntents.EXTRA_DATA_SPN));
26959d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
27059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        // For boolean we need to make sure the key exists first
27159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.containsKey(TelephonyIntents.EXTRA_SHOW_PLMN));
27259d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertTrue(b.getBoolean(TelephonyIntents.EXTRA_SHOW_PLMN));
27359d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
27459d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu        assertEquals(SimulatedCommands.FAKE_LONG_NAME, b.getString(TelephonyIntents.EXTRA_PLMN));
27566fb0378fd913dfe564c8e31b5ef379592242615Jack Yu
27666fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
27766fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        verify(mTelephonyManager).setDataNetworkTypeForPhone(anyInt(), intArgumentCaptor.capture());
27866fb0378fd913dfe564c8e31b5ef379592242615Jack Yu        assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_HSPA,
27966fb0378fd913dfe564c8e31b5ef379592242615Jack Yu                intArgumentCaptor.getValue().intValue());
28059d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu    }
28159d1e823d9aa8bc80ec6fd552fd85384bdfa75cdJack Yu
2826a787228dd7f63fbf035a49a3fc6eb784d6e4dc8Jack Yu    @Test
28344b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
284e2507b53266017e219a079f514801fe72ee90229Jack Yu    public void testCellInfoList() {
285e2507b53266017e219a079f514801fe72ee90229Jack Yu        Parcel p = Parcel.obtain();
286e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(1);
287e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(1);
288e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(2);
289e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeLong(1453510289108L);
290e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(310);
291e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(260);
292e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(123);
293e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(456);
294e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(99);
295e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.writeInt(3);
296e2507b53266017e219a079f514801fe72ee90229Jack Yu        p.setDataPosition(0);
297e2507b53266017e219a079f514801fe72ee90229Jack Yu
298e2507b53266017e219a079f514801fe72ee90229Jack Yu        CellInfoGsm cellInfo = CellInfoGsm.CREATOR.createFromParcel(p);
299e2507b53266017e219a079f514801fe72ee90229Jack Yu
300e2507b53266017e219a079f514801fe72ee90229Jack Yu        ArrayList<CellInfo> list = new ArrayList();
301e2507b53266017e219a079f514801fe72ee90229Jack Yu        list.add(cellInfo);
302e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        mSimulatedCommands.setCellInfoList(list);
303e2507b53266017e219a079f514801fe72ee90229Jack Yu
3048e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran        WorkSource workSource = new WorkSource(Process.myUid(),
3058e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran                mContext.getPackageName());
3068e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran        assertEquals(sst.getAllCellInfo(workSource), list);
307e2507b53266017e219a079f514801fe72ee90229Jack Yu    }
308e2507b53266017e219a079f514801fe72ee90229Jack Yu
309e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    @Test
31044b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
311e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    public void testImsRegState() {
312e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        // Simulate IMS registered
3137e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM});
314e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
315e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null));
316e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        waitForMs(200);
317e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
318e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertTrue(sst.isImsRegistered());
319e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
320e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        // Simulate IMS unregistered
3217e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mSimulatedCommands.setImsRegistrationState(new int[]{0, PhoneConstants.PHONE_TYPE_GSM});
322e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
323e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_IMS_STATE_CHANGED, null));
324e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        waitForMs(200);
325e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
326e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertFalse(sst.isImsRegistered());
327e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    }
328e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
329e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    @Test
33044b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
331e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    public void testSignalStrength() {
332e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        SignalStrength ss = new SignalStrength(
333e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                30, // gsmSignalStrength
334e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                0,  // gsmBitErrorRate
335e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // cdmaDbm
336e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // cdmaEcio
337e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoDbm
338e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoEcio
339e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                -1, // evdoSnr
340e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                99, // lteSignalStrength
341e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRsrp
342e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRsrq
343e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteRssnr
344e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // lteCqi
345e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                SignalStrength.INVALID,     // tdScdmaRscp
346e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu                true                        // gsmFlag
347e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        );
348e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
3490b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.setSignalStrength(ss);
3500b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
35148a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        waitForMs(300);
352e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu        assertEquals(sst.getSignalStrength(), ss);
3530b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), true);
3540b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3550b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        // switch to CDMA
3560b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        doReturn(false).when(mPhone).isPhoneTypeGsm();
3570b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        doReturn(true).when(mPhone).isPhoneTypeCdmaLte();
3580b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.updatePhoneType();
3590b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_LTE);
3600b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3610b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
362d39e96c42430661190208747b02f48953cdb58c4Jack Yu        waitForMs(300);
3630b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength(), ss);
3640b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), true);
3650b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan
3660b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        // notify signal strength again, but this time data RAT is not LTE
367d39e96c42430661190208747b02f48953cdb58c4Jack Yu        sst.mSS.setRilVoiceRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_1xRTT);
3680b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        sst.mSS.setRilDataRadioTechnology(ServiceState.RIL_RADIO_TECHNOLOGY_EHRPD);
3690b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        mSimulatedCommands.notifySignalStrength();
370d39e96c42430661190208747b02f48953cdb58c4Jack Yu        waitForMs(300);
3710b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength(), ss);
3720b24cf9fa32362616f3c55da9c0ec768c4bd174bAmit Mahajan        assertEquals(sst.getSignalStrength().isGsm(), false);
373e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu    }
374e5e0593e54a4e1009190dab5d6fd507dca0e341eJack Yu
375cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    @Test
37644b9d5b470fb45c0f59073f56cb48a2501996259Jack Yu    @MediumTest
377cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    public void testGsmCellLocation() {
378cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu
37949c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        VoiceRegStateResult result = new VoiceRegStateResult();
38049c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        result.cellIdentity.cellInfoType = CellInfoType.GSM;
38149c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        result.cellIdentity.cellIdentityGsm.add(new CellIdentityGsm());
38249c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        result.cellIdentity.cellIdentityGsm.get(0).lac = 2;
38349c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        result.cellIdentity.cellIdentityGsm.get(0).cid = 3;
38449c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu
385cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        sst.sendMessage(sst.obtainMessage(ServiceStateTracker.EVENT_GET_LOC_DONE,
38649c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu                new AsyncResult(null, result, null)));
387cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu
388cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        waitForMs(200);
38949c99113d77ca6f34f6a0c9d3e0049cddd3e754eJack Yu        WorkSource workSource = new WorkSource(Process.myUid(), mContext.getPackageName());
3908e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran        GsmCellLocation cl = (GsmCellLocation) sst.getCellLocation(workSource);
391cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        assertEquals(2, cl.getLac());
392cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu        assertEquals(3, cl.getCid());
393cde20aa353bb14806a9fe0445c51398cd3ab13c6Jack Yu    }
394dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
395dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    @Test
396dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    @MediumTest
397dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    public void testUpdatePhoneType() {
398dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(false).when(mPhone).isPhoneTypeGsm();
399dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(true).when(mPhone).isPhoneTypeCdmaLte();
400dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(CdmaSubscriptionSourceManager.SUBSCRIPTION_FROM_RUIM).when(mCdmaSSM).
401dbe4d7749d5524be575f629486874acdae721138Amit Mahajan                getCdmaSubscriptionSource();
402dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
403dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        logd("Calling updatePhoneType");
404dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // switch to CDMA
405dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.updatePhoneType();
406dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
407dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
408dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords).registerForRecordsLoaded(eq(sst), integerArgumentCaptor.capture(),
409b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Object.class));
410dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
411dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // response for mRuimRecords.registerForRecordsLoaded()
412dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        Message msg = Message.obtain();
413dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.what = integerArgumentCaptor.getValue();
414dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.obj = new AsyncResult(null, null, null);
415dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.sendMessage(msg);
416dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        waitForMs(100);
417dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
418dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // on RUIM_RECORDS_LOADED, sst is expected to call following apis
419dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords, times(1)).isProvisioned();
420dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
421dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // switch back to GSM
422dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(true).when(mPhone).isPhoneTypeGsm();
423dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        doReturn(false).when(mPhone).isPhoneTypeCdmaLte();
424dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
425dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // response for mRuimRecords.registerForRecordsLoaded() can be sent after switching to GSM
426dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg = Message.obtain();
427dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.what = integerArgumentCaptor.getValue();
428dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        msg.obj = new AsyncResult(null, null, null);
429dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        sst.sendMessage(msg);
430dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
431dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // There's no easy way to check if the msg was handled or discarded. Wait to make sure sst
432dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // did not crash, and then verify that the functions called records loaded are not called
433dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        // again
434dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        waitForMs(200);
435dbe4d7749d5524be575f629486874acdae721138Amit Mahajan
436dbe4d7749d5524be575f629486874acdae721138Amit Mahajan        verify(mRuimRecords, times(1)).isProvisioned();
437dbe4d7749d5524be575f629486874acdae721138Amit Mahajan    }
438f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
439f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
440f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
441f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForVoiceRoamingOn() throws Exception {
442f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForVoiceRoamingOn(mTestHandler, EVENT_ROAMING_ON, null);
443f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
444f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming and trigger events to notify handler registered
445f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
446f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
447f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
44837a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
449f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
45085a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
451f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
452f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
453f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
454f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
455f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_ON, messageArgumentCaptor.getValue().what);
456f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
457f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
458f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
459f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
46037a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
461f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
462f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
463f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
464f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
465f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForVoiceRoamingOn(mTestHandler);
466f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
467f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
468f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
469f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
47037a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
471f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
47285a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
473f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
474f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
475f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
476f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
477f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
478f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
479f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
480f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForVoiceRoamingOff() throws Exception {
481f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
482f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
483f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
484f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
48537a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
486f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
487f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
488f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
489f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForVoiceRoamingOff(mTestHandler, EVENT_ROAMING_OFF, null);
490f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
491f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
492f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
493f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
494f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
49537a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
496f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
49785a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
498f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
499f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
500f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
501f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
502f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_OFF, messageArgumentCaptor.getValue().what);
503f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
504f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
505f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
506f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
50737a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
508f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
509f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
510f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
511f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
512f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForVoiceRoamingOff(mTestHandler);
513f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
514f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
515f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
516f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
51737a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
518f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
519f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
520f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
521f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
522f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
523f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
524f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
525f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
526f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
527f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataRoamingOn() throws Exception {
528f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRoamingOn(mTestHandler, EVENT_ROAMING_ON, null);
529f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
530f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming and trigger events to notify handler registered
531f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
532f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
533f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
53437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
535f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
53685a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
537f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
538f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
539f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
540f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
541f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_ON, messageArgumentCaptor.getValue().what);
542f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
543f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
544f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
545f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
54637a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
547f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
548f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
549f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
550f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
551f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataRoamingOn(mTestHandler);
552f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
553f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
554f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
555f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
55637a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
557f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
55885a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
559f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
560f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
561f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
562f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
563f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
564f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
565f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
566f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataRoamingOff() throws Exception {
567f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
568f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
569f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
570f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
57137a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
572f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
573f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
574f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
575f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRoamingOff(mTestHandler, EVENT_ROAMING_OFF, null);
576f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
577f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
578f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
579f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
580f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
58137a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
582f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
583f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
584f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
585f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
586f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
587f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
588f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_ROAMING_OFF, messageArgumentCaptor.getValue().what);
589f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
590f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Enable roaming
591f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
592f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
59337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
594f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
595f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
596f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
597f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
598f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataRoamingOff(mTestHandler);
599f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
600f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Disable roaming
601f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_HOME);
602f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_HOME);
60337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
604f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
605f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
606f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
607f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
608f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
609f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
610f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
611f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
612f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
6139e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    public void testRegAndInvalidregForDataConnAttach() throws Exception {
6149e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // Initially set service state out of service
6159e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        doReturn(true).when(mPhone).isPhoneTypeGsm();
6169e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(23);
6179e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(23);
6189e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
6199e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6209e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
6219e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6229e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null);
6239e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6249e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state in service and trigger events to post message on handler
6259e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
6269e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
6279e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
6289e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6299e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(200);
6309e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6319e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // verify if registered handler has message posted to it
6329e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
6339e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
6349e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what);
6359e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6369e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state out of service
6379e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(-1);
6389e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(-1);
6399e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
6409e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6419e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
6429e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6439e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // Unregister registrant
6449e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        sst.unregisterForDataConnectionAttached(mTestHandler);
6459e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6469e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state in service
6479e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
6489e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
6499e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
6509e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6519e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
6529e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
6539e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // verify that no new message posted to handler
6549e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
6559e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    }
656b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan
6579e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    @Test
6589e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    @MediumTest
659f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataConnAttach() throws Exception {
660f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state out of service
661f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
662f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
663f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
66437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
665f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
6663e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe        waitForMs(100);
6673e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe
668f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataConnectionAttached(mTestHandler, EVENT_DATA_CONNECTION_ATTACHED, null);
669f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
670f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service and trigger events to post message on handler
671f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
672f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
67337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
674f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
6752dd874066ed871c8adf50f58e4b025d525db78ebJack Yu        waitForMs(200);
676f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
677f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
678f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
679f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
680f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_DATA_CONNECTION_ATTACHED, messageArgumentCaptor.getValue().what);
681f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
682f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
683f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
684f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
68537a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
686f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
687f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
688f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
689f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
690f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataConnectionAttached(mTestHandler);
691f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
692f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
693f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
694f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
69537a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
696f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
697f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
698f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
699f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
700f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
701f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
702f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
703f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
704f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
705f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForDataConnDetach() throws Exception {
706f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state in service
707f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
708f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
709f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
71037a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
711f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
712f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataConnectionDetached(mTestHandler, EVENT_DATA_CONNECTION_DETACHED, null);
713f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
714f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service and trigger events to post message on handler
715f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
716f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
71737a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
718f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
71985a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
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_DATA_CONNECTION_DETACHED, messageArgumentCaptor.getValue().what);
725f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
726f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
727f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
728f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
72937a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
730f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
731f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
732f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
733f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
734f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForDataConnectionDetached(mTestHandler);
735f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
736f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
737f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
738f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
73937a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
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 testRegisterForDataRegStateOrRatChange() {
750f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        int drs = sst.mSS.RIL_REG_STATE_HOME;
751f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        int rat = sst.mSS.RIL_RADIO_TECHNOLOGY_LTE;
752f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setRilDataRadioTechnology(rat);
753f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setDataRegState(drs);
754f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForDataRegStateOrRatChanged(mTestHandler, EVENT_DATA_RAT_CHANGED, null);
755f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
756f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
757f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
758f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Verify if message was posted to handler and value of result
759f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
760f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
761f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_DATA_RAT_CHANGED, messageArgumentCaptor.getValue().what);
762f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(new Pair<Integer, Integer>(drs, rat),
763f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe                ((AsyncResult)messageArgumentCaptor.getValue().obj).result);
764f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
765f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
766f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
767f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
768f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegAndUnregForNetworkAttached() throws Exception {
769f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Initially set service state out of service
770f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
771f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
772f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
77337a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
774f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
7753e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe        waitForMs(100);
7763e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe
777f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null);
778f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
779f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service and trigger events to post message on handler
780f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
781f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
78237a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
783f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
784f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
785f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
786f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify if registered handler has message posted to it
787f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
788f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
789f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what);
790f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
791f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state out of service
792f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
793f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_UNKNOWN);
79437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
795f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
796f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
797f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
798f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Unregister registrant
799f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.unregisterForNetworkAttached(mTestHandler);
800f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
801f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // set service state in service
802f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
803f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
80437a3e51d244774ba156a88cf101432b62c8a42a3Jack Yu        mSimulatedCommands.notifyNetworkStateChanged();
805f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
806f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
807f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
808f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify that no new message posted to handler
809f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler, times(1)).sendMessageAtTime(any(Message.class), anyLong());
810f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
811f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
812f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
813f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
8149e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    public void testRegAndInvalidRegForNetworkAttached() throws Exception {
8159e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // Initially set service state out of service
8169e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        doReturn(true).when(mPhone).isPhoneTypeGsm();
8179e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(23);
8189e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(23);
8199e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
8209e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8219e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
8229e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8239e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null);
8249e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8259e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state in service and trigger events to post message on handler
8269e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
8279e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
8289e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
8299e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8309e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
8319e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8329e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // verify if registered handler has message posted to it
8339e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
8349e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
8359e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what);
8369e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8379e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state out of service
8389e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(-1);
8399e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(-1);
8409e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
8419e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8429e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
8439e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8449e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // Unregister registrant
8459e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        sst.unregisterForNetworkAttached(mTestHandler);
8469e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8479e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8489e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
8499e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8509e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        sst.registerForNetworkAttached(mTestHandler, EVENT_REGISTERED_TO_NETWORK, null);
8519e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8529e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // set service state in service
8539e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setVoiceRegState(ServiceState.RIL_REG_STATE_ROAMING);
8549e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.setDataRegState(ServiceState.RIL_REG_STATE_ROAMING);
8559e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        mSimulatedCommands.notifyNetworkStateChanged();
8569e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8579e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        waitForMs(100);
8589e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8599e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        // verify if registered handler has message posted to it
8609e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
861cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu        verify(mTestHandler, times(2)).sendMessageAtTime(messageArgumentCaptor.capture(),
862cef2ab5e676f7a8187e5cddaa1d2547b13f48f39Jack Yu                anyLong());
8639e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran        assertEquals(EVENT_REGISTERED_TO_NETWORK, messageArgumentCaptor.getValue().what);
8649e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    }
8659e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran
8669e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    @Test
8679e9476e236db1d3f43c73b8adb8a8a4823b747f1Sooraj Sasindran    @MediumTest
868f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForPsRestrictedEnabled() throws Exception {
869f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mRestrictedState.setPsRestricted(true);
870f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Since PsRestricted is set to true, registerForPsRestrictedEnabled will
871f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // also post message to handler
872f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForPsRestrictedEnabled(mTestHandler, EVENT_PS_RESTRICT_ENABLED, null);
873f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
874f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
875f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
876f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
877f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
878f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
879f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_PS_RESTRICT_ENABLED, messageArgumentCaptor.getValue().what);
880f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
881f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
882f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
883f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
884f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForPsRestrictedDisabled() throws Exception {
885f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mRestrictedState.setPsRestricted(true);
886f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Since PsRestricted is set to true, registerForPsRestrictedDisabled will
887f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // also post message to handler
888f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForPsRestrictedDisabled(mTestHandler, EVENT_PS_RESTRICT_DISABLED, null);
889f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
890f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(100);
891f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
892f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
893f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
894f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
895f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_PS_RESTRICT_DISABLED, messageArgumentCaptor.getValue().what);
896f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
897f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
898f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
899f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
900ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    public void testOnRestrictedStateChanged() throws Exception {
901ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        ServiceStateTracker spySst = spy(sst);
902ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        doReturn(true).when(mPhone).isPhoneTypeGsm();
903ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        doReturn(IccCardApplicationStatus.AppState.APPSTATE_READY).when(
904ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                mUiccCardApplication3gpp).getState();
905a18eb87506359758fb67899525d0737d98923b8dSanket Padawe
906a18eb87506359758fb67899525d0737d98923b8dSanket Padawe        ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
907a18eb87506359758fb67899525d0737d98923b8dSanket Padawe        verify(mSimulatedCommandsVerifier).setOnRestrictedStateChanged(any(Handler.class),
908a18eb87506359758fb67899525d0737d98923b8dSanket Padawe                intArgumentCaptor.capture(), eq(null));
909a18eb87506359758fb67899525d0737d98923b8dSanket Padawe        // Since spy() creates a copy of sst object we need to call
910a18eb87506359758fb67899525d0737d98923b8dSanket Padawe        // setOnRestrictedStateChanged() explicitly.
911a18eb87506359758fb67899525d0737d98923b8dSanket Padawe        mSimulatedCommands.setOnRestrictedStateChanged(spySst,
912a18eb87506359758fb67899525d0737d98923b8dSanket Padawe                intArgumentCaptor.getValue().intValue(), null);
913ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong
914ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // Combination of restricted state and expected notification type.
915ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int CS_ALL[] = {RILConstants.RIL_RESTRICTED_STATE_CS_ALL,
916ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.CS_ENABLED};
917ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int CS_NOR[] = {RILConstants.RIL_RESTRICTED_STATE_CS_NORMAL,
918ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.CS_NORMAL_ENABLED};
919ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int CS_EME[] = {RILConstants.RIL_RESTRICTED_STATE_CS_EMERGENCY,
920ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.CS_EMERGENCY_ENABLED};
921ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int CS_NON[] = {RILConstants.RIL_RESTRICTED_STATE_NONE,
922ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.CS_DISABLED};
923ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int PS_ALL[] = {RILConstants.RIL_RESTRICTED_STATE_PS_ALL,
924ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.PS_ENABLED};
925ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        final int PS_NON[] = {RILConstants.RIL_RESTRICTED_STATE_NONE,
926ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                ServiceStateTracker.PS_DISABLED};
927ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong
928ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        int notifyCount = 0;
929ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs not restricted -> cs emergency/normal restricted
930ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL);
931ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency/normal restricted -> cs normal restricted
932ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR);
933ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs normal restricted -> cs emergency restricted
934ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME);
935ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency restricted -> cs not restricted
936ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON);
937ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs not restricted -> cs normal restricted
938ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR);
939ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs normal restricted -> cs emergency/normal restricted
940ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL);
941ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency/normal restricted -> cs emergency restricted
942ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME);
943ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency restricted -> cs emergency/normal restricted
944ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_ALL);
945ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency/normal restricted -> cs not restricted
946ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON);
947ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs not restricted -> cs emergency restricted
948ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_EME);
949ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs emergency restricted -> cs normal restricted
950ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NOR);
951ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // cs normal restricted -> cs not restricted
952ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, CS_NON);
953ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong
954ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // ps not restricted -> ps restricted
955ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, PS_ALL);
956ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        // ps restricted -> ps not restricted
957ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        internalCheckForRestrictedStateChange(spySst, ++notifyCount, PS_NON);
958ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    }
959ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong
960ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    private void internalCheckForRestrictedStateChange(ServiceStateTracker serviceStateTracker,
961ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong                int times, int[] restrictedState) {
962ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        mSimulatedCommands.triggerRestrictedStateChanged(restrictedState[0]);
963ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        waitForMs(100);
964ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        ArgumentCaptor<Integer> intArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
965ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        verify(serviceStateTracker, times(times)).setNotification(intArgumentCaptor.capture());
966ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong        assertEquals(intArgumentCaptor.getValue().intValue(), restrictedState[1]);
967ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    }
968ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong
969ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    @Test
970ed5af31ed3ace33d69ff77767daad816ef989c11Wenting Xiong    @MediumTest
971f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testRegisterForSubscriptionInfoReady() {
972f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.registerForSubscriptionInfoReady(mTestHandler, EVENT_SUBSCRIPTION_INFO_READY, null);
973f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
974f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Call functions which would trigger posting of message on test handler
975f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
976f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.updatePhoneType();
977f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyOtaProvisionStatusChanged();
978f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
979f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(200);
980f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
981f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // verify posted message
982f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
983f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mTestHandler).sendMessageAtTime(messageArgumentCaptor.capture(), anyLong());
984f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(EVENT_SUBSCRIPTION_INFO_READY, messageArgumentCaptor.getValue().what);
985f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
986f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
987f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
988f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
989f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testGetDesiredPowerState() {
990f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.setRadioPower(true);
991f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.getDesiredPowerState(), true);
992f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
993f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
994f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
995f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
996f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testEnableLocationUpdates() throws Exception {
997f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.enableLocationUpdates();
998f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(true),
9993e17ed857f92e8e4bce2c7f72c160285963bbb45Sanket Padawe                any(Message.class));
1000f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1001f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1002f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
1003f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
1004f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testDisableLocationUpdates() throws Exception {
1005f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.disableLocationUpdates();
1006f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        verify(mSimulatedCommandsVerifier, times(1)).setLocationUpdates(eq(false),
1007b1fdcf01045090315c5b91d7539007d79f34c9ecAmit Mahajan                nullable(Message.class));
1008f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1009f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1010f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
1011f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
1012f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testGetCurrentDataRegState() throws Exception {
1013f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setDataRegState(ServiceState.STATE_OUT_OF_SERVICE);
1014f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.getCurrentDataConnectionState(), ServiceState.STATE_OUT_OF_SERVICE);
1015f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1016f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1017f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
1018f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
1019f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsConcurrentVoiceAndDataAllowed() {
1020f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        // Verify all 3 branches in the function isConcurrentVoiceAndDataAllowed
1021f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeGsm();
1022f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setRilVoiceRadioTechnology(sst.mSS.RIL_RADIO_TECHNOLOGY_HSPA);
1023f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isConcurrentVoiceAndDataAllowed());
1024f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1025f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
1026f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(true).when(mPhone).isPhoneTypeCdma();
1027f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(false, sst.isConcurrentVoiceAndDataAllowed());
1028f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1029f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeGsm();
1030f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        doReturn(false).when(mPhone).isPhoneTypeCdma();
1031f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setCssIndicator(1);
1032f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isConcurrentVoiceAndDataAllowed());
1033f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.mSS.setCssIndicator(0);
1034f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(false, sst.isConcurrentVoiceAndDataAllowed());
1035f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1036f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1037f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
1038f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @MediumTest
1039f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsImsRegistered() throws Exception {
1040f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.setImsRegistrationState(new int[]{1, PhoneConstants.PHONE_TYPE_GSM});
1041f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        mSimulatedCommands.notifyImsNetworkStateChanged();
1042f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        waitForMs(200);
1043f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(sst.isImsRegistered(), true);
1044f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1045f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe
1046f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @Test
1047f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    @SmallTest
1048f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    public void testIsDeviceShuttingDown() throws Exception {
1049f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        sst.requestShutdown();
1050f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe        assertEquals(true, sst.isDeviceShuttingDown());
1051f32222bd7bf1e3e619b1451b46f7f4aa94474ba1Sanket Padawe    }
1052b4237f12fd73204e9775909e03d9277e59d94766fionaxu
1053b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @Test
1054b4237f12fd73204e9775909e03d9277e59d94766fionaxu    @SmallTest
1055b4237f12fd73204e9775909e03d9277e59d94766fionaxu    public void testSetTimeFromNITZStr() throws Exception {
1056b4237f12fd73204e9775909e03d9277e59d94766fionaxu        doReturn(mAlarmManager).when(mIBinder).queryLocalInterface(anyString());
1057b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mServiceManagerMockedServices.put(Context.ALARM_SERVICE, mIBinder);
1058b4237f12fd73204e9775909e03d9277e59d94766fionaxu
1059b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Mock sending incorrect nitz str from RIL
1060b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mSimulatedCommands.triggerNITZupdate("38/06/20,00:00:00+0");
106185a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
1062b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // AlarmManger.setTime is triggered by SystemClock.setCurrentTimeMillis().
1063b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Verify system time is not set to incorrect NITZ time
1064b4237f12fd73204e9775909e03d9277e59d94766fionaxu        verify(mAlarmManager, times(0)).setTime(anyLong());
1065b4237f12fd73204e9775909e03d9277e59d94766fionaxu
1066b4237f12fd73204e9775909e03d9277e59d94766fionaxu        // Mock sending correct nitz str from RIL
1067b4237f12fd73204e9775909e03d9277e59d94766fionaxu        mSimulatedCommands.triggerNITZupdate("15/06/20,00:00:00+0");
106885a3c169a2e5e0b793c127ece9e34dac1c00206aNaveen Kalla        waitForMs(200);
1069b4237f12fd73204e9775909e03d9277e59d94766fionaxu        verify(mAlarmManager, times(1)).setTime(anyLong());
1070b4237f12fd73204e9775909e03d9277e59d94766fionaxu    }
10718e2a1c76f67ebaeebd8401c4ebf7d0515b522d5eSooraj Sasindran}
1072