15755ef622fec6f3c592467c685503826862a7536fionaxu/*
2655bae990bdd7e4584491def4d30692e6173779cfionaxu * Copyright (C) 2016 The Android Open Source Project
35755ef622fec6f3c592467c685503826862a7536fionaxu *
45755ef622fec6f3c592467c685503826862a7536fionaxu * Licensed under the Apache License, Version 2.0 (the "License");
55755ef622fec6f3c592467c685503826862a7536fionaxu * you may not use this file except in compliance with the License.
65755ef622fec6f3c592467c685503826862a7536fionaxu * You may obtain a copy of the License at
75755ef622fec6f3c592467c685503826862a7536fionaxu *
85755ef622fec6f3c592467c685503826862a7536fionaxu *      http://www.apache.org/licenses/LICENSE-2.0
95755ef622fec6f3c592467c685503826862a7536fionaxu *
105755ef622fec6f3c592467c685503826862a7536fionaxu * Unless required by applicable law or agreed to in writing, software
115755ef622fec6f3c592467c685503826862a7536fionaxu * distributed under the License is distributed on an "AS IS" BASIS,
125755ef622fec6f3c592467c685503826862a7536fionaxu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135755ef622fec6f3c592467c685503826862a7536fionaxu * See the License for the specific language governing permissions and
145755ef622fec6f3c592467c685503826862a7536fionaxu * limitations under the License.
155755ef622fec6f3c592467c685503826862a7536fionaxu */
165755ef622fec6f3c592467c685503826862a7536fionaxupackage com.android.internal.telephony;
175755ef622fec6f3c592467c685503826862a7536fionaxu
18802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
19802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan
20802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.assertEquals;
21802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.junit.Assert.assertNotNull;
22802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.any;
23802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.anyInt;
24802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.doReturn;
25802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.eq;
26802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.isA;
27802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.times;
28802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport static org.mockito.Mockito.verify;
29802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan
30802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport android.os.Handler;
315755ef622fec6f3c592467c685503826862a7536fionaxuimport android.os.HandlerThread;
32802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport android.os.Message;
33e73ef117c8f5a7ea2feaa9ba8a15ec2de4137c7dJordan Liuimport android.support.test.filters.FlakyTest;
345755ef622fec6f3c592467c685503826862a7536fionaxuimport android.telephony.DisconnectCause;
355755ef622fec6f3c592467c685503826862a7536fionaxuimport android.telephony.PhoneNumberUtils;
365755ef622fec6f3c592467c685503826862a7536fionaxuimport android.telephony.ServiceState;
37f9665d579a68b00057cc171b2f1c39a010b7e40afionaxuimport android.test.suitebuilder.annotation.MediumTest;
385755ef622fec6f3c592467c685503826862a7536fionaxuimport android.test.suitebuilder.annotation.SmallTest;
39655bae990bdd7e4584491def4d30692e6173779cfionaxu
405755ef622fec6f3c592467c685503826862a7536fionaxuimport org.junit.After;
415755ef622fec6f3c592467c685503826862a7536fionaxuimport org.junit.Assert;
425755ef622fec6f3c592467c685503826862a7536fionaxuimport org.junit.Before;
43802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport org.junit.Ignore;
445755ef622fec6f3c592467c685503826862a7536fionaxuimport org.junit.Test;
455755ef622fec6f3c592467c685503826862a7536fionaxuimport org.mockito.ArgumentCaptor;
46802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajanimport org.mockito.Mock;
475755ef622fec6f3c592467c685503826862a7536fionaxu
48655bae990bdd7e4584491def4d30692e6173779cfionaxupublic class GsmCdmaCallTrackerTest extends TelephonyTest {
495755ef622fec6f3c592467c685503826862a7536fionaxu    private static final int VOICE_CALL_STARTED_EVENT = 0;
505755ef622fec6f3c592467c685503826862a7536fionaxu    private static final int VOICE_CALL_ENDED_EVENT = 1;
51655bae990bdd7e4584491def4d30692e6173779cfionaxu    private String mDialString = PhoneNumberUtils.stripSeparators("+17005554141");
525755ef622fec6f3c592467c685503826862a7536fionaxu    /* Handler class initiated at the HandlerThread */
53655bae990bdd7e4584491def4d30692e6173779cfionaxu    private GsmCdmaCallTracker mCTUT;
547e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private GsmCdmaCTHandlerThread mGsmCdmaCTHandlerThread;
555755ef622fec6f3c592467c685503826862a7536fionaxu    @Mock
565755ef622fec6f3c592467c685503826862a7536fionaxu    GsmCdmaCall mCall;
575755ef622fec6f3c592467c685503826862a7536fionaxu    @Mock
585755ef622fec6f3c592467c685503826862a7536fionaxu    private Handler mHandler;
595755ef622fec6f3c592467c685503826862a7536fionaxu
605755ef622fec6f3c592467c685503826862a7536fionaxu    private class GsmCdmaCTHandlerThread extends HandlerThread {
615755ef622fec6f3c592467c685503826862a7536fionaxu
625755ef622fec6f3c592467c685503826862a7536fionaxu        private GsmCdmaCTHandlerThread(String name) {
635755ef622fec6f3c592467c685503826862a7536fionaxu            super(name);
645755ef622fec6f3c592467c685503826862a7536fionaxu        }
655755ef622fec6f3c592467c685503826862a7536fionaxu        @Override
665755ef622fec6f3c592467c685503826862a7536fionaxu        public void onLooperPrepared() {
67655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT = new GsmCdmaCallTracker(mPhone);
68655bae990bdd7e4584491def4d30692e6173779cfionaxu            setReady(true);
695755ef622fec6f3c592467c685503826862a7536fionaxu        }
705755ef622fec6f3c592467c685503826862a7536fionaxu    }
715755ef622fec6f3c592467c685503826862a7536fionaxu
725755ef622fec6f3c592467c685503826862a7536fionaxu    @Before
735755ef622fec6f3c592467c685503826862a7536fionaxu    public void setUp() throws Exception {
74655bae990bdd7e4584491def4d30692e6173779cfionaxu        super.setUp(this.getClass().getSimpleName());
75655bae990bdd7e4584491def4d30692e6173779cfionaxu        mSimulatedCommands.setRadioPower(true, null);
76655bae990bdd7e4584491def4d30692e6173779cfionaxu        mPhone.mCi = this.mSimulatedCommands;
77caf788f85debe35e07c1821f20ea8949b1c60c61fionaxu
787e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCdmaCTHandlerThread = new GsmCdmaCTHandlerThread(TAG);
797e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mGsmCdmaCTHandlerThread.start();
805755ef622fec6f3c592467c685503826862a7536fionaxu
815755ef622fec6f3c592467c685503826862a7536fionaxu        waitUntilReady();
82655bae990bdd7e4584491def4d30692e6173779cfionaxu        logd("GsmCdmaCallTracker initiated, waiting for Power on");
835755ef622fec6f3c592467c685503826862a7536fionaxu        /* Make sure radio state is power on before dial.
845755ef622fec6f3c592467c685503826862a7536fionaxu         * When radio state changed from off to on, CallTracker
855755ef622fec6f3c592467c685503826862a7536fionaxu         * will poll result from RIL. Avoid dialing triggered at the same*/
86655bae990bdd7e4584491def4d30692e6173779cfionaxu        waitForMs(100);
875755ef622fec6f3c592467c685503826862a7536fionaxu    }
885755ef622fec6f3c592467c685503826862a7536fionaxu
895755ef622fec6f3c592467c685503826862a7536fionaxu    @After
905755ef622fec6f3c592467c685503826862a7536fionaxu    public void tearDown() throws Exception {
91655bae990bdd7e4584491def4d30692e6173779cfionaxu        mCTUT = null;
92ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mGsmCdmaCTHandlerThread.quit();
93655bae990bdd7e4584491def4d30692e6173779cfionaxu        super.tearDown();
945755ef622fec6f3c592467c685503826862a7536fionaxu    }
955755ef622fec6f3c592467c685503826862a7536fionaxu
965755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
975755ef622fec6f3c592467c685503826862a7536fionaxu    @SmallTest
985755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallDial() {
9919561243b57cea1863585443a92801724d41a4d9fionaxu        doReturn(ServiceState.STATE_IN_SERVICE).when(mServiceState).getState();
100655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
101655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
102655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
103655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
1045755ef622fec6f3c592467c685503826862a7536fionaxu        try {
105655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.dial(mDialString);
10648a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu            waitForMs(100);
1075755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
1085755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
1095bc609873dfd5a4c51798139512c206ac0ab7503fionaxu            Assert.fail("unexpected exception thrown"+ex.getMessage()+ex.getStackTrace());
1105755ef622fec6f3c592467c685503826862a7536fionaxu        }
1115755ef622fec6f3c592467c685503826862a7536fionaxu
112655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.OFFHOOK, mCTUT.getState());
113655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.DIALING, mCTUT.mForegroundCall.getState());
114655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
1155755ef622fec6f3c592467c685503826862a7536fionaxu        /* verify the command is sent out to RIL */
1165755ef622fec6f3c592467c685503826862a7536fionaxu        verify(mSimulatedCommandsVerifier).dial(eq(PhoneNumberUtils.
117b54a7201000c50c505814aa62e114010f5310d0ffionaxu                        extractNetworkPortionAlt(mDialString)), anyInt(),
118b54a7201000c50c505814aa62e114010f5310d0ffionaxu                eq((UUSInfo) null),
119b54a7201000c50c505814aa62e114010f5310d0ffionaxu                isA(Message.class));
1205755ef622fec6f3c592467c685503826862a7536fionaxu    }
1215755ef622fec6f3c592467c685503826862a7536fionaxu
1225755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
1235755ef622fec6f3c592467c685503826862a7536fionaxu    @SmallTest
1245755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallPickUp() {
1255755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallDial();
1265755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Waiting for POLL CALL response from RIL");
127b54a7201000c50c505814aa62e114010f5310d0ffionaxu        TelephonyTestUtils.waitForMs(50);
1285755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Pick Up MO call, expecting call state change event ");
129655bae990bdd7e4584491def4d30692e6173779cfionaxu        mSimulatedCommands.progressConnectingToActive();
130655bae990bdd7e4584491def4d30692e6173779cfionaxu        waitForMs(100);
131655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
132655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
1335755ef622fec6f3c592467c685503826862a7536fionaxu    }
1345755ef622fec6f3c592467c685503826862a7536fionaxu
135cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @FlakyTest
136cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @Ignore
1375755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
138f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
1395755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallHangup() {
1405755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallDial();
1415755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Waiting for POLL CALL response from RIL ");
142b54a7201000c50c505814aa62e114010f5310d0ffionaxu        TelephonyTestUtils.waitForMs(50);
143655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.DIALING, mCTUT.mForegroundCall.getState());
144655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.OFFHOOK, mCTUT.getState());
145655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
1465755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Hang up MO call after MO call established ");
1475755ef622fec6f3c592467c685503826862a7536fionaxu        try {
148655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.hangup(mCTUT.mForegroundCall);
1495755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
1505755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
151b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
1525755ef622fec6f3c592467c685503826862a7536fionaxu        }
153f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        waitForMs(300);
154655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
155655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
156655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
1575755ef622fec6f3c592467c685503826862a7536fionaxu    }
1585755ef622fec6f3c592467c685503826862a7536fionaxu
159cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @FlakyTest
160cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @Ignore
1615755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
162f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
1635755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallDialPickUpHangup() {
1645755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallPickUp();
165655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
166655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.OFFHOOK, mCTUT.getState());
167655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
1685755ef622fec6f3c592467c685503826862a7536fionaxu         /* get the reference of the connection before reject */
169655bae990bdd7e4584491def4d30692e6173779cfionaxu        Connection mConnection = mCTUT.mForegroundCall.getConnections().get(0);
170655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(DisconnectCause.NOT_DISCONNECTED, mConnection.getDisconnectCause());
1715755ef622fec6f3c592467c685503826862a7536fionaxu        logd("hang up MO call after pickup");
1725755ef622fec6f3c592467c685503826862a7536fionaxu        try {
173655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.hangup(mCTUT.mForegroundCall);
1745755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
1755755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
176b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
1775755ef622fec6f3c592467c685503826862a7536fionaxu        }
1785755ef622fec6f3c592467c685503826862a7536fionaxu        /* request send to RIL still in disconnecting state */
179f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        waitForMs(300);
180655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
181655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
182655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
183655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(DisconnectCause.LOCAL, mConnection.getDisconnectCause());
1845755ef622fec6f3c592467c685503826862a7536fionaxu
1855755ef622fec6f3c592467c685503826862a7536fionaxu    }
1865755ef622fec6f3c592467c685503826862a7536fionaxu
18792428df50d736a3d1d0f32779a22c65fcec0efabJordan Liu    @FlakyTest
1885755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
189f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
1905755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallPendingHangUp() {
1915755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallDial();
1925755ef622fec6f3c592467c685503826862a7536fionaxu        logd("MO call hangup before established[ getting result from RIL ]");
1935755ef622fec6f3c592467c685503826862a7536fionaxu        /* poll call result from RIL, find that there is a pendingMO call,
1945755ef622fec6f3c592467c685503826862a7536fionaxu         * Didn't do anything for hangup, clear during handle poll result */
1955755ef622fec6f3c592467c685503826862a7536fionaxu        try {
196655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.hangup(mCTUT.mForegroundCall);
1975755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
1985755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
199b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
2005755ef622fec6f3c592467c685503826862a7536fionaxu        }
201f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        waitForMs(300);
202655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
203655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
204655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
2055755ef622fec6f3c592467c685503826862a7536fionaxu    }
2065755ef622fec6f3c592467c685503826862a7536fionaxu
2075755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
208f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
2095755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallSwitch() {
2105755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallPickUp();
2115755ef622fec6f3c592467c685503826862a7536fionaxu        logd("MO call picked up, initiating a new MO call");
212655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
213655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
214655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
215655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mBackgroundCall.getConnections().size());
2165755ef622fec6f3c592467c685503826862a7536fionaxu
2175755ef622fec6f3c592467c685503826862a7536fionaxu        String mDialString = PhoneNumberUtils.stripSeparators("+17005554142");
2185755ef622fec6f3c592467c685503826862a7536fionaxu        try {
219655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.dial(mDialString);
2205755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
2215755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
222b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
2235755ef622fec6f3c592467c685503826862a7536fionaxu        }
224282e49e614393f9a597f058fe6fe3185c02ded94fionaxu        waitForMs(200);
225655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.DIALING, mCTUT.mForegroundCall.getState());
226655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.HOLDING, mCTUT.mBackgroundCall.getState());
227655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
228655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mBackgroundCall.getConnections().size());
2295755ef622fec6f3c592467c685503826862a7536fionaxu
2305755ef622fec6f3c592467c685503826862a7536fionaxu    }
2315755ef622fec6f3c592467c685503826862a7536fionaxu
2325755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
2335755ef622fec6f3c592467c685503826862a7536fionaxu    @SmallTest
234802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @FlakyTest
235802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @Ignore
2365755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMTCallRinging() {
2375755ef622fec6f3c592467c685503826862a7536fionaxu        /* Mock there is a MT call mRinging call and try to accept this MT call */
2385755ef622fec6f3c592467c685503826862a7536fionaxu        /* if we got a active state followed by another MT call-> move to background call */
239655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
240655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mRingingCall.getConnections().size());
241655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
2425755ef622fec6f3c592467c685503826862a7536fionaxu        String mDialString = PhoneNumberUtils.stripSeparators("+17005554141");
2435755ef622fec6f3c592467c685503826862a7536fionaxu        logd("MT call Ringing");
244655bae990bdd7e4584491def4d30692e6173779cfionaxu        mSimulatedCommands.triggerRing(mDialString);
245655bae990bdd7e4584491def4d30692e6173779cfionaxu        waitForMs(50);
246655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.RINGING, mCTUT.getState());
247655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mRingingCall.getConnections().size());
2485755ef622fec6f3c592467c685503826862a7536fionaxu    }
2495755ef622fec6f3c592467c685503826862a7536fionaxu
2505755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
2515755ef622fec6f3c592467c685503826862a7536fionaxu    @SmallTest
252802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @FlakyTest
253802962613bf8ac5e53d08a6310ceecf031e1b8a5Amit Mahajan    @Ignore
2545755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMTCallAccept() {
2555755ef622fec6f3c592467c685503826862a7536fionaxu        testMTCallRinging();
256655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(mCTUT.mForegroundCall.getConnections().size(),0);
2575755ef622fec6f3c592467c685503826862a7536fionaxu        logd("accept the MT call");
2585755ef622fec6f3c592467c685503826862a7536fionaxu        try{
259655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.acceptCall();
2605755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
2615755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
262b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
2635755ef622fec6f3c592467c685503826862a7536fionaxu        }
2645755ef622fec6f3c592467c685503826862a7536fionaxu        verify(mSimulatedCommandsVerifier).acceptCall(isA(Message.class));
2655755ef622fec6f3c592467c685503826862a7536fionaxu        /* send to the RIL */
266b54a7201000c50c505814aa62e114010f5310d0ffionaxu        TelephonyTestUtils.waitForMs(50);
267655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.OFFHOOK, mCTUT.getState());
268655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
269655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(1, mCTUT.mForegroundCall.getConnections().size());
270655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mRingingCall.getConnections().size());
2715755ef622fec6f3c592467c685503826862a7536fionaxu    }
2725755ef622fec6f3c592467c685503826862a7536fionaxu
2735755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
2745755ef622fec6f3c592467c685503826862a7536fionaxu    @SmallTest
2755755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMTCallReject() {
2765755ef622fec6f3c592467c685503826862a7536fionaxu        testMTCallRinging();
2775755ef622fec6f3c592467c685503826862a7536fionaxu        logd("MT call ringing and rejected ");
2785755ef622fec6f3c592467c685503826862a7536fionaxu        /* get the reference of the connection before reject */
279655bae990bdd7e4584491def4d30692e6173779cfionaxu        Connection mConnection = mCTUT.mRingingCall.getConnections().get(0);
2805755ef622fec6f3c592467c685503826862a7536fionaxu        assertNotNull(mConnection);
281655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(DisconnectCause.NOT_DISCONNECTED, mConnection.getDisconnectCause());
2825755ef622fec6f3c592467c685503826862a7536fionaxu        try {
283655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.rejectCall();
2845755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
2855755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
286b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
2875755ef622fec6f3c592467c685503826862a7536fionaxu        }
288655bae990bdd7e4584491def4d30692e6173779cfionaxu        waitForMs(50);
289655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(PhoneConstants.State.IDLE, mCTUT.getState());
290655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
291655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(0, mCTUT.mForegroundCall.getConnections().size());
2925755ef622fec6f3c592467c685503826862a7536fionaxu        /* ? why rejectCall didnt -> hang up locally to set the cause to LOCAL? */
293655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(DisconnectCause.INCOMING_MISSED, mConnection.getDisconnectCause());
2945755ef622fec6f3c592467c685503826862a7536fionaxu
2955755ef622fec6f3c592467c685503826862a7536fionaxu    }
2965755ef622fec6f3c592467c685503826862a7536fionaxu
2975755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
298f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
2995755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallSwitchHangupForeGround() {
3005755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallSwitch();
3015755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Hang up the foreground MO call while dialing ");
3025755ef622fec6f3c592467c685503826862a7536fionaxu        try {
303655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.hangup(mCTUT.mForegroundCall);
3045755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
3055755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
306b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
3075755ef622fec6f3c592467c685503826862a7536fionaxu        }
308f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        waitForMs(300);
3095755ef622fec6f3c592467c685503826862a7536fionaxu        logd(" Foreground Call is IDLE and BackGround Call is still HOLDING ");
3105755ef622fec6f3c592467c685503826862a7536fionaxu        /* if we want to hang up foreground call which is alerting state, hangup all */
311655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mForegroundCall.getState());
312655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.HOLDING, mCTUT.mBackgroundCall.getState());
3135755ef622fec6f3c592467c685503826862a7536fionaxu    }
3145755ef622fec6f3c592467c685503826862a7536fionaxu
315a18eb87506359758fb67899525d0737d98923b8dSanket Padawe    @FlakyTest
316a18eb87506359758fb67899525d0737d98923b8dSanket Padawe    @Ignore
3175755ef622fec6f3c592467c685503826862a7536fionaxu    @Test
318f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu    @MediumTest
3195755ef622fec6f3c592467c685503826862a7536fionaxu    public void testMOCallPickUpHangUpResumeBackGround() {
3205755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallSwitch();
3215755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Pick up the new MO Call");
3225755ef622fec6f3c592467c685503826862a7536fionaxu        try{
323655bae990bdd7e4584491def4d30692e6173779cfionaxu            mSimulatedCommands.progressConnectingToActive();
3245755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
3255755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
326b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
3275755ef622fec6f3c592467c685503826862a7536fionaxu        }
3285755ef622fec6f3c592467c685503826862a7536fionaxu
329282e49e614393f9a597f058fe6fe3185c02ded94fionaxu        waitForMs(200);
330655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
331655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.HOLDING, mCTUT.mBackgroundCall.getState());
3325755ef622fec6f3c592467c685503826862a7536fionaxu
3335755ef622fec6f3c592467c685503826862a7536fionaxu        logd("Hang up the new MO Call");
3345755ef622fec6f3c592467c685503826862a7536fionaxu        try {
335655bae990bdd7e4584491def4d30692e6173779cfionaxu            mCTUT.hangup(mCTUT.mForegroundCall);
3365755ef622fec6f3c592467c685503826862a7536fionaxu        } catch(Exception ex) {
3375755ef622fec6f3c592467c685503826862a7536fionaxu            ex.printStackTrace();
338b54a7201000c50c505814aa62e114010f5310d0ffionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
3395755ef622fec6f3c592467c685503826862a7536fionaxu        }
3405755ef622fec6f3c592467c685503826862a7536fionaxu
341f9665d579a68b00057cc171b2f1c39a010b7e40afionaxu        waitForMs(300);
3425755ef622fec6f3c592467c685503826862a7536fionaxu        logd(" BackGround Call switch to ForeGround Call ");
343655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
344655bae990bdd7e4584491def4d30692e6173779cfionaxu        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
3455755ef622fec6f3c592467c685503826862a7536fionaxu    }
3465755ef622fec6f3c592467c685503826862a7536fionaxu
3475755ef622fec6f3c592467c685503826862a7536fionaxu    @Test @SmallTest
3485755ef622fec6f3c592467c685503826862a7536fionaxu    public void testVoiceCallStartListener(){
3495755ef622fec6f3c592467c685503826862a7536fionaxu        logd("register for voice call started event");
350655bae990bdd7e4584491def4d30692e6173779cfionaxu        mCTUT.registerForVoiceCallStarted(mHandler, VOICE_CALL_STARTED_EVENT, null);
3515755ef622fec6f3c592467c685503826862a7536fionaxu        logd("voice call started");
3525755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallPickUp();
3535755ef622fec6f3c592467c685503826862a7536fionaxu        ArgumentCaptor<Message> mCaptorMessage = ArgumentCaptor.forClass(Message.class);
354703e603fecd2a07e232afe1e2b277fd0a786237bfionaxu        ArgumentCaptor<Long> mCaptorLong = ArgumentCaptor.forClass(Long.class);
3555755ef622fec6f3c592467c685503826862a7536fionaxu        verify(mHandler,times(1)).sendMessageAtTime(mCaptorMessage.capture(), mCaptorLong.capture());
3565755ef622fec6f3c592467c685503826862a7536fionaxu        assertEquals(VOICE_CALL_STARTED_EVENT, mCaptorMessage.getValue().what);
3575755ef622fec6f3c592467c685503826862a7536fionaxu
3585755ef622fec6f3c592467c685503826862a7536fionaxu    }
3595755ef622fec6f3c592467c685503826862a7536fionaxu
360cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @FlakyTest
361cb192e90e2692e094b8d9cef4e52c36af5777681Amit Mahajan    @Ignore
3625755ef622fec6f3c592467c685503826862a7536fionaxu    @Test @SmallTest
3635755ef622fec6f3c592467c685503826862a7536fionaxu    public void testVoiceCallEndedListener(){
3645755ef622fec6f3c592467c685503826862a7536fionaxu        logd("register for voice call ended event");
365655bae990bdd7e4584491def4d30692e6173779cfionaxu        mCTUT.registerForVoiceCallEnded(mHandler, VOICE_CALL_ENDED_EVENT, null);
3665755ef622fec6f3c592467c685503826862a7536fionaxu        ArgumentCaptor<Message> mCaptorMessage = ArgumentCaptor.forClass(Message.class);
367655bae990bdd7e4584491def4d30692e6173779cfionaxu        ArgumentCaptor<Long> mCaptorLong = ArgumentCaptor.forClass(Long.class);
3685755ef622fec6f3c592467c685503826862a7536fionaxu        testMOCallHangup();
3695755ef622fec6f3c592467c685503826862a7536fionaxu        verify(mHandler,times(1)).sendMessageAtTime(mCaptorMessage.capture(), mCaptorLong.capture());
3705755ef622fec6f3c592467c685503826862a7536fionaxu        assertEquals(VOICE_CALL_ENDED_EVENT, mCaptorMessage.getValue().what);
3715755ef622fec6f3c592467c685503826862a7536fionaxu    }
37277eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan
37377eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan    @Test @SmallTest
37477eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan    public void testUpdatePhoneType() {
37577eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan        // verify getCurrentCalls is called on init
37677eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan        verify(mSimulatedCommandsVerifier).getCurrentCalls(any(Message.class));
37777eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan
378e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // update phone type (call the function on same thread as the call tracker)
379e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        Handler updatePhoneTypeHandler = new Handler(mCTUT.getLooper()) {
380e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan            @Override
381e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan            public void handleMessage(Message msg) {
382e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan                mCTUT.updatePhoneType();
383e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan            }
384e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        };
385e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        updatePhoneTypeHandler.sendEmptyMessage(0);
386e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        waitForMs(100);
38777eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan
38877eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan        // verify getCurrentCalls is called on updating phone type
38977eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan        verify(mSimulatedCommandsVerifier, times(2)).getCurrentCalls(any(Message.class));
3908dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan
391e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // we'd like to verify that if phone type is updated, calls and callTracker go to idle.
392e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // However, as soon as phone type is updated, call tracker queries for calls from RIL and
393e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // will go back to OFFHOOK
394e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan
395e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // call tracker goes to OFFHOOK
3968dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan        testMOCallPickUp();
3978dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan
398e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // update phone type - call tracker goes to IDLE and then due to getCurrentCalls(),
399e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        // goes back to OFFHOOK
400e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        updatePhoneTypeHandler.sendEmptyMessage(0);
401e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        waitForMs(100);
4028dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan
4038dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan        // verify CT and calls go to idle
404e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        assertEquals(PhoneConstants.State.OFFHOOK, mCTUT.getState());
405e97fb0b4ff012fe960c36d7cb09311550c7d4055Amit Mahajan        assertEquals(GsmCdmaCall.State.ACTIVE, mCTUT.mForegroundCall.getState());
4068dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mBackgroundCall.getState());
4078dd4a1915f45460dfed9646470fbc0405bff934bAmit Mahajan        assertEquals(GsmCdmaCall.State.IDLE, mCTUT.mRingingCall.getState());
40877eeade7a1391b045f8b2ce681efd49f27d3506fAmit Mahajan    }
4095755ef622fec6f3c592467c685503826862a7536fionaxu}
4105755ef622fec6f3c592467c685503826862a7536fionaxu
411