1e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu/*
2e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * Copyright (C) 2016 The Android Open Source Project
3e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu *
4e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * Licensed under the Apache License, Version 2.0 (the "License");
5e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * you may not use this file except in compliance with the License.
6e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * You may obtain a copy of the License at
7e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu *
8e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu *      http://www.apache.org/licenses/LICENSE-2.0
9e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu *
10e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * Unless required by applicable law or agreed to in writing, software
11e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * distributed under the License is distributed on an "AS IS" BASIS,
12e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * See the License for the specific language governing permissions and
14e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu * limitations under the License.
15e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu */
16e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
17e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yupackage com.android.internal.telephony.dataconnection;
18e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
198e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.TelephonyTestUtils.waitForMs;
208e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_ADDRESS;
218e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_DNS;
228e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_GATEWAY;
238e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_IFNAME;
248e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static com.android.internal.telephony.dataconnection.DcTrackerTest.FAKE_PCSCF_ADDRESS;
258e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
268e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertEquals;
278e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertFalse;
288e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.junit.Assert.assertTrue;
298e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.any;
308e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Matchers.eq;
318e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.doReturn;
328e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.times;
338e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport static org.mockito.Mockito.verify;
348e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
35a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yuimport android.net.NetworkCapabilities;
36a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yuimport android.net.NetworkInfo;
370852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yuimport android.os.AsyncResult;
38e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport android.os.Handler;
39e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport android.os.HandlerThread;
40e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport android.os.Message;
41a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yuimport android.telephony.CarrierConfigManager;
42e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport android.telephony.ServiceState;
43e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport android.test.suitebuilder.annotation.SmallTest;
44e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
45e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.telephony.PhoneConstants;
46e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.telephony.RILConstants;
470852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yuimport com.android.internal.telephony.RetryManager;
48e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.telephony.TelephonyTest;
49e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.telephony.dataconnection.DataConnection.ConnectionParams;
50e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.telephony.dataconnection.DataConnection.DisconnectParams;
51e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.util.IState;
52e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport com.android.internal.util.StateMachine;
53e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
54e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport org.junit.After;
55e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport org.junit.Before;
56e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport org.junit.Test;
578e9d1e601dce62cd0328701d7054e03db24727c7Jack Yuimport org.mockito.ArgumentCaptor;
58e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport org.mockito.Mock;
59e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
60a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yuimport java.lang.reflect.Field;
61e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yuimport java.lang.reflect.Method;
62e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
63e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yupublic class DataConnectionTest extends TelephonyTest {
64e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
65e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Mock
66e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    DcTesterFailBringUpAll mDcTesterFailBringUpAll;
67e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Mock
68e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    ConnectionParams mCp;
69e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Mock
70e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    DisconnectParams mDcp;
71e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Mock
72e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    ApnContext mApnContext;
73e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Mock
74e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    DcFailBringUp mDcFailBringUp;
75e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
76e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    private DataConnection mDc;
777e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan    private DataConnectionTestHandler mDataConnectionTestHandler;
78e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    private DcController mDcc;
79e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
80e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    private ApnSetting mApn1 = new ApnSetting(
81e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            2163,                   // id
82e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "44010",                // numeric
83e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "sp-mode",              // name
84e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "spmode.ne.jp",         // apn
85e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // proxy
86e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // port
87e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // mmsc
88e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // mmsproxy
89e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // mmsport
90e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // user
91e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // password
92e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            -1,                     // authtype
93e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            new String[]{"default", "supl"},     // types
94e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "IP",                   // protocol
95e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "IP",                   // roaming_protocol
96e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            true,                   // carrier_enabled
97e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // bearer
98e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // bearer_bitmask
99e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // profile_id
100e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            false,                  // modem_cognitive
101e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // max_conns
102e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // wait_time
103e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // max_conns_time
104e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            0,                      // mtu
105e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "",                     // mvno_type
106e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            "");                    // mnvo_match_data
107e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
108e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    private class DataConnectionTestHandler extends HandlerThread {
109e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
110e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        private DataConnectionTestHandler(String name) {
111e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            super(name);
112e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        }
113e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
114e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        @Override
115e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        public void onLooperPrepared() {
116e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            Handler h = new Handler();
117e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
118e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            mDcc = DcController.makeDcc(mPhone, mDcTracker, h);
119e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu            mDc = DataConnection.makeDataConnection(mPhone, 0, mDcTracker, mDcTesterFailBringUpAll,
120e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                    mDcc);
121e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        }
122e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
123e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
124e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Before
125e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public void setUp() throws Exception {
126e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        logd("+Setup!");
127e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        super.setUp(getClass().getSimpleName());
128e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
129e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        doReturn("fake.action_detached").when(mPhone).getActionDetached();
130e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        replaceInstance(ConnectionParams.class, "mApnContext", mCp, mApnContext);
131e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        replaceInstance(ConnectionParams.class, "mRilRat", mCp,
132e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                ServiceState.RIL_RADIO_TECHNOLOGY_UMTS);
133e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        doReturn(mApn1).when(mApnContext).getApnSetting();
134e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        doReturn(PhoneConstants.APN_TYPE_DEFAULT).when(mApnContext).getApnType();
135e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
136e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDcFailBringUp.saveParameters(0, 0, -2);
137e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        doReturn(mDcFailBringUp).when(mDcTesterFailBringUpAll).getDcFailBringUp();
138e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
139e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mContextFixture.putStringArrayResource(com.android.internal.R.array.
140e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                config_mobile_tcp_buffers, new String[]{
141e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "umts:131072,262144,1452032,4096,16384,399360",
142e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "hspa:131072,262144,2441216,4096,16384,399360",
143e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "hsupa:131072,262144,2441216,4096,16384,399360",
144e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "hsdpa:131072,262144,2441216,4096,16384,399360",
145e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "hspap:131072,262144,2441216,4096,16384,399360",
146e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "edge:16384,32768,131072,4096,16384,65536",
147e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "gprs:4096,8192,24576,4096,8192,24576",
148e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "1xrtt:16384,32768,131070,4096,16384,102400",
149e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "evdo:131072,262144,1048576,4096,16384,524288",
150e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                "lte:524288,1048576,8388608,262144,524288,4194304"});
151e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
152e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
153e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDcp.mApnContext = mApnContext;
154e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
1557e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDataConnectionTestHandler = new DataConnectionTestHandler(getClass().getSimpleName());
1567e9240253edb59e0aa657de434faa1ccdf17a742Amit Mahajan        mDataConnectionTestHandler.start();
157e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
15848a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        waitForMs(200);
159e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        logd("-Setup!");
160e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
161e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
162e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @After
163e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public void tearDown() throws Exception {
164e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        logd("tearDown");
165e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDc = null;
166e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDcc = null;
167ae6e8f99bdb297f906d6dcdc0a385ba27eee47fdJack Yu        mDataConnectionTestHandler.quit();
168e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        super.tearDown();
169e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
170e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
1710852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    private IState getCurrentState() throws Exception {
172e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        Method method = StateMachine.class.getDeclaredMethod("getCurrentState");
173e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        method.setAccessible(true);
174e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        return (IState) method.invoke(mDc);
175e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
176e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
1770852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    private long getSuggestedRetryDelay(AsyncResult ar) throws Exception {
1780852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        Class[] cArgs = new Class[1];
1790852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        cArgs[0] = AsyncResult.class;
1800852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        Method method = DataConnection.class.getDeclaredMethod("getSuggestedRetryDelay", cArgs);
1810852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        method.setAccessible(true);
1820852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        return (long) method.invoke(mDc, ar);
1830852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    }
1840852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
185e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Test
186e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @SmallTest
187e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public void testSanity() throws Exception {
188e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        assertEquals("DcInactiveState", getCurrentState().getName());
189e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
190e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
191e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Test
192e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @SmallTest
193e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public void testConnectEvent() throws Exception {
194e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        testSanity();
195e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
196e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDc.sendMessage(DataConnection.EVENT_CONNECT, mCp);
19748a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        waitForMs(200);
198e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
199e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        verify(mCT, times(1)).registerForVoiceCallStarted(any(Handler.class),
200e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                eq(DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_STARTED), eq(null));
201e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        verify(mCT, times(1)).registerForVoiceCallEnded(any(Handler.class),
202e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                eq(DataConnection.EVENT_DATA_CONNECTION_VOICE_CALL_ENDED), eq(null));
203e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
2048e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        ArgumentCaptor<DataProfile> dpCaptor = ArgumentCaptor.forClass(DataProfile.class);
205e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).setupDataCall(
2068e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(ServiceState.RIL_RADIO_TECHNOLOGY_UMTS), dpCaptor.capture(),
2078e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                eq(false), eq(false), any(Message.class));
2088e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu
2098e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        assertEquals("spmode.ne.jp", dpCaptor.getValue().apn);
210e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
211e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        assertEquals("DcActiveState", getCurrentState().getName());
212e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
213e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
214e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @Test
215e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    @SmallTest
216e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    public void testDisconnectEvent() throws Exception {
217e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        testConnectEvent();
218e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
219e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        mDc.sendMessage(DataConnection.EVENT_DISCONNECT, mDcp);
220e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        waitForMs(100);
221e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
222e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        verify(mSimulatedCommandsVerifier, times(1)).deactivateDataCall(eq(1),
223e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu                eq(RILConstants.DEACTIVATE_REASON_NONE), any(Message.class));
224e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu
225e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu        assertEquals("DcInactiveState", getCurrentState().getName());
226e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu    }
2270852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2280852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @Test
2290852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @SmallTest
2300852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    public void testModemSuggestRetry() throws Exception {
2318e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        DataCallResponse response = new DataCallResponse(0, 0, 1, 2, "IP",
2328e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_IFNAME, FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2330852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        AsyncResult ar = new AsyncResult(null, response, null);
2340852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(response.suggestedRetryTime, getSuggestedRetryDelay(ar));
2350852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2368e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        response = new DataCallResponse(0, 1000, 1, 2, "IP",
2378e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_IFNAME, FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2388e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        ar = new AsyncResult(null, response, null);
2390852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(response.suggestedRetryTime, getSuggestedRetryDelay(ar));
2400852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2418e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        response = new DataCallResponse(0, 9999, 1, 2, "IP",
2428e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_IFNAME, FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2438e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        ar = new AsyncResult(null, response, null);
2440852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(response.suggestedRetryTime, getSuggestedRetryDelay(ar));
2450852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    }
2460852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2470852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @Test
2480852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @SmallTest
2490852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    public void testModemNotSuggestRetry() throws Exception {
2508e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        DataCallResponse response = new DataCallResponse(0, -1, 1, 2, "IP", FAKE_IFNAME,
2518e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2520852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        AsyncResult ar = new AsyncResult(null, response, null);
2530852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, getSuggestedRetryDelay(ar));
2540852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2558e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        response = new DataCallResponse(0, -5, 1, 2, "IP", FAKE_IFNAME,
2568e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2578e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        ar = new AsyncResult(null, response, null);
2580852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, getSuggestedRetryDelay(ar));
2590852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2608e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        response = new DataCallResponse(0, Integer.MIN_VALUE, 1, 2, "IP", FAKE_IFNAME,
2618e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2628e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        ar = new AsyncResult(null, response, null);
2630852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(RetryManager.NO_SUGGESTED_RETRY_DELAY, getSuggestedRetryDelay(ar));
2640852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    }
2650852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu
2660852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @Test
2670852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    @SmallTest
2680852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    public void testModemSuggestNoRetry() throws Exception {
2698e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu        DataCallResponse response = new DataCallResponse(0, Integer.MAX_VALUE, 1, 2, "IP",
2708e9d1e601dce62cd0328701d7054e03db24727c7Jack Yu                FAKE_IFNAME, FAKE_ADDRESS, FAKE_DNS, FAKE_GATEWAY, FAKE_PCSCF_ADDRESS, 1440);
2710852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        AsyncResult ar = new AsyncResult(null, response, null);
2720852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu        assertEquals(RetryManager.NO_RETRY, getSuggestedRetryDelay(ar));
2730852a954be5937a1b0bca94df0c2007d7ee3c0c7Jack Yu    }
274a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
275a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    private NetworkInfo getNetworkInfo() throws Exception {
276a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        Field f = DataConnection.class.getDeclaredField("mNetworkInfo");
277a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        f.setAccessible(true);
278a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        return (NetworkInfo) f.get(mDc);
279a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    }
280a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
2816289b21a3b9f0214a862878096384d8ce90a572cJack Yu    private NetworkCapabilities getNetworkCapabilities() throws Exception {
2826289b21a3b9f0214a862878096384d8ce90a572cJack Yu        Method method = DataConnection.class.getDeclaredMethod("getNetworkCapabilities");
283a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        method.setAccessible(true);
284a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        return (NetworkCapabilities) method.invoke(mDc);
285a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    }
286a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
287a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    @Test
288a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    @SmallTest
289a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    public void testMeteredCapability() throws Exception {
290a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
291a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        mContextFixture.getCarrierConfigBundle().
292a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
293a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                new String[] {"default"});
294a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
295a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        testConnectEvent();
296a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
2976289b21a3b9f0214a862878096384d8ce90a572cJack Yu        assertFalse(getNetworkCapabilities()
2986289b21a3b9f0214a862878096384d8ce90a572cJack Yu                .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
29948a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        assertTrue(getNetworkInfo().isMetered());
300a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    }
301a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
302a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    @Test
303a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    @SmallTest
304a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    public void testNonMeteredCapability() throws Exception {
305a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
30648a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        doReturn(2819).when(mPhone).getSubId();
307a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        mContextFixture.getCarrierConfigBundle().
308a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                putStringArray(CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
309a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu                        new String[] {"mms"});
310a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
311a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu        testConnectEvent();
312a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu
3136289b21a3b9f0214a862878096384d8ce90a572cJack Yu        assertTrue(getNetworkCapabilities()
3146289b21a3b9f0214a862878096384d8ce90a572cJack Yu                .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED));
31548a5ba5d3cc80ffaaa82caed6f2344166da99c08Jack Yu        assertFalse(getNetworkInfo().isMetered());
316a8201a7b8ce12cfada51784ebe06534e35c2ae04Jack Yu    }
317e3f497323441d0c9215f6cbad9ce950f054cce72Jack Yu}