1f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu/*
2f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * Copyright (C) 2016 The Android Open Source Project
3f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu *
4f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * Licensed under the Apache License, Version 2.0 (the "License");
5f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * you may not use this file except in compliance with the License.
6f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * You may obtain a copy of the License at
7f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu *
8f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu *      http://www.apache.org/licenses/LICENSE-2.0
9f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu *
10f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * Unless required by applicable law or agreed to in writing, software
11f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * distributed under the License is distributed on an "AS IS" BASIS,
12f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * See the License for the specific language governing permissions and
14f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu * limitations under the License.
15f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu */
16ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanpackage com.android.internal.telephony.imsphone;
17f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
18f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.os.AsyncResult;
19f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.os.Bundle;
20f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.os.Handler;
21f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.os.Looper;
22f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.os.Message;
23ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport android.telephony.DisconnectCause;
24f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.telephony.PhoneNumberUtils;
25f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.telephony.ServiceState;
26f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport android.test.suitebuilder.annotation.MediumTest;
27ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport android.test.suitebuilder.annotation.SmallTest;
28f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
29f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport com.android.ims.ImsCallProfile;
30ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.Call;
31ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.Connection;
32ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.GsmCdmaCall;
33ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.PhoneConstants;
34ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport com.android.internal.telephony.TelephonyTest;
35f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
36f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.junit.After;
37f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.junit.Assert;
38f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.junit.Before;
39f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.junit.Test;
40f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.mockito.Mock;
41f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.mockito.invocation.InvocationOnMock;
42f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport org.mockito.stubbing.Answer;
43f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
44f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport java.lang.reflect.Field;
45f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
46f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
47ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.junit.Assert.assertEquals;
48ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.junit.Assert.assertFalse;
49ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.junit.Assert.assertNull;
50ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.junit.Assert.assertTrue;
51ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.any;
52ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.anyChar;
53ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.doAnswer;
54ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.doReturn;
55ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.eq;
56ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.times;
57ecac744a4e585e3c7af95ffa06fa3e711131200cAmit Mahajanimport static org.mockito.Mockito.verify;
58f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
59f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxupublic class ImsPhoneConnectionTest extends TelephonyTest {
60f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    private ImsPhoneConnection mConnectionUT;
61f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    private Bundle mBundle = new Bundle();
62f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
63f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    private ImsPhoneCall mForeGroundCall;
64f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
65f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    private ImsPhoneCall mBackGroundCall;
66f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Mock
67f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    private ImsPhoneCall mRingGroundCall;
68f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
69f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Before
70f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void setUp() throws Exception {
71f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        super.setUp(getClass().getSimpleName());
72f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        replaceInstance(Handler.class, "mLooper", mImsCT, Looper.getMainLooper());
73f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        replaceInstance(ImsPhoneCallTracker.class, "mForegroundCall", mImsCT, mForeGroundCall);
74f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        replaceInstance(ImsPhoneCallTracker.class, "mBackgroundCall", mImsCT, mBackGroundCall);
75f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        replaceInstance(ImsPhoneCallTracker.class, "mRingingCall", mImsCT, mRingGroundCall);
76f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        replaceInstance(ImsPhoneCallTracker.class, "mPhone", mImsCT, mImsPhone);
77f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
78f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mImsCallProfile.mCallExtras = mBundle;
79f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(ImsPhoneCall.State.IDLE).when(mForeGroundCall).getState();
80f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
81f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
82f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @After
83f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void tearDown() throws Exception {
84f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        super.tearDown();
85f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
86f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
87f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
88f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
89f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testImsConnectionSanity() {
90f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        logd("Testing initial state of MT ImsPhoneConnection");
91f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, mImsCall, mImsCT, mForeGroundCall, false);
92f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
93f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(ImsPhoneCall.State.IDLE, mConnectionUT.getState());
94f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_UNKNOWN, mConnectionUT.getNumberPresentation());
95f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_UNKNOWN, mConnectionUT.getCnapNamePresentation());
96f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.NOT_STARTED, mConnectionUT.getPostDialState());
97f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(0, mConnectionUT.getDisconnectTime());
98f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(0, mConnectionUT.getHoldDurationMillis());
99f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertNull(mConnectionUT.getOrigDialString());
100f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertFalse(mConnectionUT.isMultiparty());
101f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertFalse(mConnectionUT.isConferenceHost());
102f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(1)).attach((Connection) any(),
103f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                eq(ImsPhoneCall.State.INCOMING));
104f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
105f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        logd("Testing initial state of MO ImsPhoneConnection");
106f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, String.format("+1 (700).555-41NN%c1234",
107f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                PhoneNumberUtils.PAUSE), mImsCT, mForeGroundCall, false);
108f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_ALLOWED, mConnectionUT.getNumberPresentation());
109f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_ALLOWED, mConnectionUT.getCnapNamePresentation());
110f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals("+1 (700).555-41NN,1234", mConnectionUT.getOrigDialString());
111f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(1)).attachFake((Connection) any(),
112f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                eq(ImsPhoneCall.State.DIALING));
113f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
114f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
115f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
116f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
117f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testImsUpdateStateForeGround() {
118f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // MO Foreground Connection dailing -> active
119f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, "+1 (700).555-41NN1234", mImsCT,
120f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                mForeGroundCall, false);
121f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // initially in dialing state
122f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(Call.State.DIALING).when(mForeGroundCall).getState();
123f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
124f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // for Ringing/Dialing upadte postDialState
125f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.COMPLETE, mConnectionUT.getPostDialState());
126f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(1)).update(eq(mConnectionUT), eq(mImsCall),
127f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                eq(Call.State.ACTIVE));
128f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
129f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
130f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
131f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
132f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testImsUpdateStateBackGround() {
133f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // MT background Connection dialing -> active
134f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, mImsCall, mImsCT, mBackGroundCall, false);
135f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(Call.State.HOLDING).when(mBackGroundCall).getState();
13674c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi        assertFalse(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
137f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mBackGroundCall, times(1)).detach(eq(mConnectionUT));
138f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(1)).attach(eq(mConnectionUT));
139f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(1)).update(eq(mConnectionUT), eq(mImsCall),
140f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                eq(Call.State.ACTIVE));
141f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.NOT_STARTED, mConnectionUT.getPostDialState());
142f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
143f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
144f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
145f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
146f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testImsUpdateStatePendingHold() {
147f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, "+1 (700).555-41NN1234", mImsCT,
148f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                mForeGroundCall, false);
149f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(true).when(mImsCall).isPendingHold();
150f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertFalse(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
151f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        verify(mForeGroundCall, times(0)).update(eq(mConnectionUT), eq(mImsCall),
152f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                eq(Call.State.ACTIVE));
153f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.NOT_STARTED, mConnectionUT.getPostDialState());
154f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
155f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
156f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
157f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
158f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testUpdateAddressDisplay() {
159f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, mImsCall, mImsCT, mForeGroundCall, false);
160f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_UNKNOWN, mConnectionUT.getNumberPresentation());
161f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(PhoneConstants.PRESENTATION_UNKNOWN, mConnectionUT.getCnapNamePresentation());
162f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(ImsCallProfile.OIR_PRESENTATION_PAYPHONE).when(mImsCallProfile)
163f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                .getCallExtraInt(eq(ImsCallProfile.EXTRA_CNAP));
164f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(ImsCallProfile.OIR_PRESENTATION_NOT_RESTRICTED).when(mImsCallProfile)
165f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                .getCallExtraInt(eq(ImsCallProfile.EXTRA_OIR));
166f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
167f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT.updateAddressDisplay(mImsCall);
168f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(ImsCallProfile.OIRToPresentation(ImsCallProfile.OIR_PRESENTATION_PAYPHONE),
169f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                mConnectionUT.getCnapNamePresentation());
170f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(ImsCallProfile.OIRToPresentation(
171f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                        ImsCallProfile.OIR_PRESENTATION_NOT_RESTRICTED),
172f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                mConnectionUT.getNumberPresentation());
173f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
174f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
175f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
176f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
177f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testConnectionDisconnect() {
178f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        //Mock we have an active connection
179f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        testImsUpdateStateForeGround();
180f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        waitForMs(50);
181f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT.onDisconnect(DisconnectCause.LOCAL);
182f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(DisconnectCause.LOCAL, mConnectionUT.getDisconnectCause());
183f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(GsmCdmaCall.State.DISCONNECTED, mConnectionUT.getState());
184f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.getDisconnectTime() <= System.currentTimeMillis());
185f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.getDurationMillis() >= 50);
186f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
187f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
188f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
189f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
190f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testPostDialWait() {
191f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, String.format("+1 (700).555-41NN%c1234",
192f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                PhoneNumberUtils.WAIT), mImsCT, mForeGroundCall, false);
193f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(Call.State.DIALING).when(mForeGroundCall).getState();
194f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doAnswer(new Answer() {
195f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            @Override
196f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            public Void answer(InvocationOnMock invocation) throws Throwable {
197f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                Message msg = (Message) invocation.getArguments()[1];
198f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                AsyncResult.forMessage(msg);
199f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                msg.sendToTarget();
200f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                return  null;
201f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            }
202f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        }).when(mImsCT).sendDtmf(anyChar(), (Message) any());
203f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // process post dial string during update
204f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
205f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.WAIT, mConnectionUT.getPostDialState());
206f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT.proceedAfterWaitChar();
207f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        waitForMs(50);
208f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.COMPLETE, mConnectionUT.getPostDialState());
209f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
210f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
211f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
212f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @MediumTest
213f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testPostDialPause() {
214f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, String.format("+1 (700).555-41NN%c1234",
215f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                PhoneNumberUtils.PAUSE), mImsCT, mForeGroundCall, false);
216f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doReturn(Call.State.DIALING).when(mForeGroundCall).getState();
217f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        doAnswer(new Answer() {
218f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            @Override
219f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            public Void answer(InvocationOnMock invocation) throws Throwable {
220f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                Message msg = (Message) invocation.getArguments()[1];
221f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                AsyncResult.forMessage(msg);
222f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                msg.sendToTarget();
223f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                return null;
224f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            }
225f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        }).when(mImsCT).sendDtmf(anyChar(), (Message) any());
226f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
227f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        // process post dial string during update
228f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
229f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.STARTED, mConnectionUT.getPostDialState());
230f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        try {
231f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            Field field = ImsPhoneConnection.class.getDeclaredField("PAUSE_DELAY_MILLIS");
232f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            field.setAccessible(true);
233f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            waitForMs((Integer) field.get(null) + 50);
234f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        } catch (Exception ex) {
235f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu            Assert.fail("unexpected exception thrown" + ex.getMessage());
236f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        }
237f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertEquals(Connection.PostDialState.COMPLETE, mConnectionUT.getPostDialState());
238f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
239f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu
240f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @Test
241f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    @SmallTest
242f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    public void testSetWifi() {
243f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mConnectionUT = new ImsPhoneConnection(mImsPhone, mImsCall, mImsCT, mForeGroundCall, false);
244f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertFalse(mConnectionUT.isWifi());
245d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        // ImsCall.isWifiCall is tested elsewhere
246d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        doReturn(true).when(mImsCall).isWifiCall();
247f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        mBundle.putString(ImsCallProfile.EXTRA_CALL_RAT_TYPE,
248f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu                ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN + "");
249f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
250f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu        assertTrue(mConnectionUT.isWifi());
251f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu    }
252d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger
253d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger    @Test
254d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger    @SmallTest
255d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger    public void testSetWifi2() {
256d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        mConnectionUT = new ImsPhoneConnection(mImsPhone, mImsCall, mImsCT, mForeGroundCall, false);
257d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        assertFalse(mConnectionUT.isWifi());
258d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        // ImsCall.isWifiCall is tested elsewhere
259d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        doReturn(true).when(mImsCall).isWifiCall();
260d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        // Tests to make sure that the EXTRA_CALL_RAT_TYPE_ALT string is set correctly for newer
261d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        // devices.
262d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        mBundle.putString(ImsCallProfile.EXTRA_CALL_RAT_TYPE_ALT,
263d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger                ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN + "");
264d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        assertTrue(mConnectionUT.update(mImsCall, Call.State.ACTIVE));
265d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger        assertTrue(mConnectionUT.isWifi());
266d0a85e9d7e52ecd5de9f7063361d9b01d2493627Brad Ebinger    }
26774c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi
268eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    /**
269eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn     * Test updates to address for incoming calls.
270eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn     */
27174c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi    @Test
27274c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi    @SmallTest
27374c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi    public void testAddressUpdate() {
27474c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi        String[] testAddressMappingSet[] = {
27574c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                /* {"inputAddress", "updateAddress", "ExpectResult"} */
27674c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345", "12345", "12345"},
27774c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345", "67890", "67890"},
27874c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345*00000", "12345", "12345*00000"},
27974c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345*00000", "67890", "67890"},
28074c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345*00000", "12345*00000", "12345*00000"},
28174c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345;11111*00000", "12345", "12345"},
28274c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345*00000;11111", "12345", "12345*00000"},
28374c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"18412345*00000", "18412345", "18412345*00000"},
28474c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"+8112345*00000", "+8112345", "+8112345*00000"},
28574c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                {"12345*00000", "12346", "12346"}};
28674c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi        for (String[] testAddress : testAddressMappingSet) {
28774c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi            mConnectionUT = new ImsPhoneConnection(mImsPhone, testAddress[0], mImsCT,
28874c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                    mForeGroundCall, false);
289eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn            mConnectionUT.setIsIncoming(true);
29074c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi            doReturn(testAddress[1]).when(mImsCallProfile)
29174c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi                    .getCallExtra(eq(ImsCallProfile.EXTRA_OI));
29274c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi            mConnectionUT.updateAddressDisplay(mImsCall);
29374c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi            assertEquals(testAddress[2], mConnectionUT.getAddress());
29474c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi        }
29574c8509aede6fe748904e75c156049b4f1ba5e28Hanada Masafumi    }
296eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn
297eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    /**
298eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn     * Ensure updates to the address for outgoing calls are ignored.
299eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn     */
300eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    @Test
301eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    @SmallTest
302eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    public void testSetAddressOnOutgoing() {
303eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        String inputAddress = "12345";
304eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        String updateAddress = "6789";
305eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn
306eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        mConnectionUT = new ImsPhoneConnection(mImsPhone, inputAddress, mImsCT, mForeGroundCall,
307eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn                false);
308eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        mConnectionUT.setIsIncoming(false);
309eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        doReturn(updateAddress).when(mImsCallProfile)
310eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn                .getCallExtra(eq(ImsCallProfile.EXTRA_OI));
311eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        mConnectionUT.updateAddressDisplay(mImsCall);
312eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn        assertEquals(inputAddress, mConnectionUT.getAddress());
313eb7465409290618ca5d7b5f8ba2ffabba2d936d9Tyler Gunn    }
314f9b150b221db15e88b97a0b9c0971ca3c71c0313fionaxu}
315