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}