1 /* 2 * Copyright 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.android.iwlan; 18 19 import static android.net.NetworkCapabilities.TRANSPORT_WIFI; 20 21 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession; 22 23 import static org.junit.Assert.*; 24 import static org.mockito.Matchers.isNull; 25 import static org.mockito.Mockito.*; 26 27 import android.content.ContentResolver; 28 import android.content.Context; 29 import android.net.ConnectivityManager; 30 import android.net.LinkAddress; 31 import android.net.LinkProperties; 32 import android.net.Network; 33 import android.net.NetworkCapabilities; 34 import android.net.ipsec.ike.exceptions.IkeInternalException; 35 import android.os.test.TestLooper; 36 import android.telephony.AccessNetworkConstants.AccessNetworkType; 37 import android.telephony.DataFailCause; 38 import android.telephony.SubscriptionInfo; 39 import android.telephony.SubscriptionManager; 40 import android.telephony.TelephonyManager; 41 import android.telephony.data.ApnSetting; 42 import android.telephony.data.DataCallResponse; 43 import android.telephony.data.DataProfile; 44 import android.telephony.data.DataService; 45 import android.telephony.data.DataServiceCallback; 46 import android.telephony.data.IDataServiceCallback; 47 import android.telephony.ims.ImsManager; 48 import android.telephony.ims.ImsMmTelManager; 49 50 import com.google.android.iwlan.IwlanDataService.IwlanDataServiceProvider; 51 import com.google.android.iwlan.IwlanDataService.IwlanDataServiceProvider.IwlanTunnelCallback; 52 import com.google.android.iwlan.IwlanDataService.IwlanDataServiceProvider.IwlanTunnelCallbackMetrics; 53 import com.google.android.iwlan.IwlanDataService.IwlanDataServiceProvider.TunnelState; 54 import com.google.android.iwlan.IwlanDataService.IwlanNetworkMonitorCallback; 55 import com.google.android.iwlan.epdg.EpdgSelector; 56 import com.google.android.iwlan.epdg.EpdgTunnelManager; 57 import com.google.android.iwlan.epdg.TunnelLinkProperties; 58 import com.google.android.iwlan.epdg.TunnelLinkPropertiesTest; 59 import com.google.android.iwlan.epdg.TunnelSetupRequest; 60 import com.google.android.iwlan.proto.MetricsAtom; 61 62 import org.junit.After; 63 import org.junit.Before; 64 import org.junit.Test; 65 import org.mockito.ArgumentCaptor; 66 import org.mockito.Mock; 67 import org.mockito.MockitoAnnotations; 68 import org.mockito.MockitoSession; 69 import org.mockito.quality.Strictness; 70 71 import java.net.Inet4Address; 72 import java.net.Inet6Address; 73 import java.net.InetAddress; 74 import java.util.ArrayList; 75 import java.util.Calendar; 76 import java.util.Date; 77 import java.util.List; 78 import java.util.LongSummaryStatistics; 79 import java.util.concurrent.CountDownLatch; 80 import java.util.concurrent.TimeUnit; 81 82 public class IwlanDataServiceTest { 83 private static final int DEFAULT_SLOT_INDEX = 0; 84 private static final int DEFAULT_SUB_INDEX = 0; 85 private static final int LINK_MTU = 1280; 86 private static final String TEST_APN_NAME = "ims"; 87 private static final String IP_ADDRESS = "192.0.2.1"; 88 private static final String DNS_ADDRESS = "8.8.8.8"; 89 private static final String GATEWAY_ADDRESS = "0.0.0.0"; 90 private static final String PSCF_ADDRESS = "10.159.204.230"; 91 private static final String INTERFACE_NAME = "ipsec6"; 92 93 @Mock private Context mMockContext; 94 @Mock private SubscriptionManager mMockSubscriptionManager; 95 @Mock private SubscriptionInfo mMockSubscriptionInfo; 96 @Mock private ContentResolver mMockContentResolver; 97 @Mock private ConnectivityManager mMockConnectivityManager; 98 @Mock private DataServiceCallback mMockDataServiceCallback; 99 @Mock private EpdgTunnelManager mMockEpdgTunnelManager; 100 @Mock private IwlanDataServiceProvider mMockIwlanDataServiceProvider; 101 @Mock private Network mMockNetwork; 102 @Mock private TunnelLinkProperties mMockTunnelLinkProperties; 103 @Mock private ErrorPolicyManager mMockErrorPolicyManager; 104 @Mock private ImsManager mMockImsManager; 105 @Mock private ImsMmTelManager mMockImsMmTelManager; 106 @Mock private TelephonyManager mMockTelephonyManager; 107 @Mock private EpdgSelector mMockEpdgSelector; 108 @Mock private LinkProperties mMockLinkProperties; 109 @Mock private LinkAddress mMockIPv4LinkAddress; 110 @Mock private LinkAddress mMockIPv6LinkAddress; 111 @Mock private Inet4Address mMockInet4Address; 112 @Mock private Inet6Address mMockInet6Address; 113 MockitoSession mStaticMockSession; 114 115 private List<DataCallResponse> mResultDataCallList; 116 private @DataServiceCallback.ResultCode int mResultCode; 117 private CountDownLatch latch; 118 private IwlanDataService mIwlanDataService; 119 private IwlanDataServiceProvider mIwlanDataServiceProvider; 120 private IwlanDataServiceProvider mSpyIwlanDataServiceProvider; 121 private TestLooper mTestLooper = new TestLooper(); 122 123 private final class IwlanDataServiceCallback extends IDataServiceCallback.Stub { 124 125 private final String mTag; 126 IwlanDataServiceCallback(String tag)127 IwlanDataServiceCallback(String tag) { 128 mTag = tag; 129 } 130 131 @Override onSetupDataCallComplete( @ataServiceCallback.ResultCode int resultCode, DataCallResponse response)132 public void onSetupDataCallComplete( 133 @DataServiceCallback.ResultCode int resultCode, DataCallResponse response) {} 134 135 @Override onDeactivateDataCallComplete(@ataServiceCallback.ResultCode int resultCode)136 public void onDeactivateDataCallComplete(@DataServiceCallback.ResultCode int resultCode) {} 137 138 @Override onSetInitialAttachApnComplete(@ataServiceCallback.ResultCode int resultCode)139 public void onSetInitialAttachApnComplete(@DataServiceCallback.ResultCode int resultCode) {} 140 141 @Override onSetDataProfileComplete(@ataServiceCallback.ResultCode int resultCode)142 public void onSetDataProfileComplete(@DataServiceCallback.ResultCode int resultCode) {} 143 144 @Override onRequestDataCallListComplete( @ataServiceCallback.ResultCode int resultCode, List<DataCallResponse> dataCallList)145 public void onRequestDataCallListComplete( 146 @DataServiceCallback.ResultCode int resultCode, 147 List<DataCallResponse> dataCallList) { 148 mResultCode = resultCode; 149 mResultDataCallList = new ArrayList<DataCallResponse>(dataCallList); 150 latch.countDown(); 151 } 152 153 @Override onDataCallListChanged(List<DataCallResponse> dataCallList)154 public void onDataCallListChanged(List<DataCallResponse> dataCallList) {} 155 156 @Override onHandoverStarted(@ataServiceCallback.ResultCode int result)157 public void onHandoverStarted(@DataServiceCallback.ResultCode int result) {} 158 159 @Override onHandoverCancelled(@ataServiceCallback.ResultCode int result)160 public void onHandoverCancelled(@DataServiceCallback.ResultCode int result) {} 161 162 @Override onApnUnthrottled(String apn)163 public void onApnUnthrottled(String apn) {} 164 165 @Override onDataProfileUnthrottled(DataProfile dataProfile)166 public void onDataProfileUnthrottled(DataProfile dataProfile) {} 167 } 168 169 @Before setUp()170 public void setUp() throws Exception { 171 MockitoAnnotations.initMocks(this); 172 173 mStaticMockSession = 174 mockitoSession() 175 .mockStatic(EpdgSelector.class) 176 .mockStatic(ErrorPolicyManager.class) 177 .mockStatic(IwlanBroadcastReceiver.class) 178 .mockStatic(IwlanHelper.class) 179 .strictness(Strictness.LENIENT) 180 .startMocking(); 181 182 when(mMockContext.getSystemService(eq(ConnectivityManager.class))) 183 .thenReturn(mMockConnectivityManager); 184 185 when(mMockContext.getSystemService(eq(SubscriptionManager.class))) 186 .thenReturn(mMockSubscriptionManager); 187 188 when(mMockSubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(anyInt())) 189 .thenReturn(mMockSubscriptionInfo); 190 191 when(mMockSubscriptionInfo.getSubscriptionId()).thenReturn(DEFAULT_SUB_INDEX); 192 193 when(mMockContext.getSystemService(eq(TelephonyManager.class))) 194 .thenReturn(mMockTelephonyManager); 195 196 when(mMockTelephonyManager.createForSubscriptionId(eq(DEFAULT_SUB_INDEX))) 197 .thenReturn(mMockTelephonyManager); 198 199 when(mMockTelephonyManager.isNetworkRoaming()).thenReturn(false); 200 201 when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver); 202 203 when(mMockContext.getSystemService(eq(ImsManager.class))).thenReturn(mMockImsManager); 204 205 when(mMockImsManager.getImsMmTelManager(anyInt())).thenReturn(mMockImsMmTelManager); 206 207 when(mMockImsMmTelManager.isVoWiFiSettingEnabled()).thenReturn(false); 208 209 when(EpdgSelector.getSelectorInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 210 .thenReturn(mMockEpdgSelector); 211 212 when(mMockIPv4LinkAddress.getAddress()).thenReturn(mMockInet4Address); 213 when(mMockIPv6LinkAddress.getAddress()).thenReturn(mMockInet6Address); 214 215 mIwlanDataService = spy(new IwlanDataService()); 216 doReturn(mTestLooper.getLooper()).when(mIwlanDataService).getLooper(); 217 mIwlanDataService.setAppContext(mMockContext); 218 mIwlanDataServiceProvider = 219 (IwlanDataServiceProvider) 220 mIwlanDataService.onCreateDataServiceProvider(DEFAULT_SLOT_INDEX); 221 mTestLooper.dispatchAll(); 222 mSpyIwlanDataServiceProvider = spy(mIwlanDataServiceProvider); 223 } 224 225 @After cleanUp()226 public void cleanUp() throws Exception { 227 mStaticMockSession.finishMocking(); 228 mIwlanDataServiceProvider.close(); 229 mTestLooper.dispatchAll(); 230 if (mIwlanDataService != null) { 231 mIwlanDataService.onDestroy(); 232 } 233 } 234 verifiyNetworkConnected(int transportType)235 private void verifiyNetworkConnected(int transportType) { 236 NetworkCapabilities mockNetworkCapabilities = mock(NetworkCapabilities.class); 237 238 when(mockNetworkCapabilities.hasTransport(anyInt())).thenReturn(false); 239 when(mockNetworkCapabilities.hasTransport(eq(transportType))).thenReturn(true); 240 241 IwlanNetworkMonitorCallback networkMonitorCallback = 242 mIwlanDataService.getNetworkMonitorCallback(); 243 networkMonitorCallback.onCapabilitiesChanged(mMockNetwork, mockNetworkCapabilities); 244 } 245 verifiyNetworkLost(int transportType)246 private void verifiyNetworkLost(int transportType) { 247 IwlanNetworkMonitorCallback networkMonitorCallback = 248 mIwlanDataService.getNetworkMonitorCallback(); 249 networkMonitorCallback.onLost(mMockNetwork); 250 } 251 252 @Test testWifionConnected()253 public void testWifionConnected() { 254 verifiyNetworkConnected(TRANSPORT_WIFI); 255 assertTrue(mIwlanDataService.isNetworkConnected(false, false)); 256 } 257 258 @Test testWifiOnLost()259 public void testWifiOnLost() { 260 when(mMockIwlanDataServiceProvider.getSlotIndex()).thenReturn(DEFAULT_SLOT_INDEX + 1); 261 mIwlanDataService.addIwlanDataServiceProvider(mMockIwlanDataServiceProvider); 262 263 verifiyNetworkLost(TRANSPORT_WIFI); 264 assertFalse(mIwlanDataService.isNetworkConnected(false, false)); 265 verify(mMockIwlanDataServiceProvider).forceCloseTunnelsInDeactivatingState(); 266 mIwlanDataService.removeDataServiceProvider(mMockIwlanDataServiceProvider); 267 mTestLooper.dispatchAll(); 268 } 269 270 @Test testAddDuplicateDataServiceProviderThrows()271 public void testAddDuplicateDataServiceProviderThrows() throws Exception { 272 when(mMockIwlanDataServiceProvider.getSlotIndex()).thenReturn(DEFAULT_SLOT_INDEX); 273 assertThrows( 274 IllegalStateException.class, 275 () -> mIwlanDataService.addIwlanDataServiceProvider(mMockIwlanDataServiceProvider)); 276 } 277 278 @Test testRemoveDataServiceProvider()279 public void testRemoveDataServiceProvider() { 280 when(mMockIwlanDataServiceProvider.getSlotIndex()).thenReturn(DEFAULT_SLOT_INDEX); 281 mIwlanDataService.removeDataServiceProvider(mMockIwlanDataServiceProvider); 282 mTestLooper.dispatchAll(); 283 verify(mIwlanDataService, times(1)).deinitNetworkCallback(); 284 mIwlanDataService.onCreateDataServiceProvider(DEFAULT_SLOT_INDEX); 285 mTestLooper.dispatchAll(); 286 } 287 288 @Test testRequestDataCallListPass()289 public void testRequestDataCallListPass() throws Exception { 290 DataProfile dp = buildDataProfile(); 291 List<LinkAddress> mInternalAddressList; 292 List<InetAddress> mDNSAddressList; 293 List<InetAddress> mGatewayAddressList; 294 List<InetAddress> mPCSFAddressList; 295 296 latch = new CountDownLatch(1); 297 IwlanDataServiceCallback callback = new IwlanDataServiceCallback("requestDataCallList"); 298 TunnelLinkProperties mLinkProperties = 299 TunnelLinkPropertiesTest.createTestTunnelLinkProperties(); 300 mIwlanDataServiceProvider.setTunnelState( 301 dp, 302 new DataServiceCallback(callback), 303 TunnelState.TUNNEL_UP, 304 mLinkProperties, 305 false, 306 1); 307 mIwlanDataServiceProvider.requestDataCallList(new DataServiceCallback(callback)); 308 mTestLooper.dispatchAll(); 309 latch.await(1, TimeUnit.SECONDS); 310 311 assertEquals(mResultCode, DataServiceCallback.RESULT_SUCCESS); 312 assertEquals(mResultDataCallList.size(), 1); 313 for (DataCallResponse dataCallInfo : mResultDataCallList) { 314 assertEquals(dataCallInfo.getId(), TEST_APN_NAME.hashCode()); 315 assertEquals(dataCallInfo.getLinkStatus(), DataCallResponse.LINK_STATUS_ACTIVE); 316 assertEquals(dataCallInfo.getProtocolType(), ApnSetting.PROTOCOL_IPV4V6); 317 assertEquals(dataCallInfo.getInterfaceName(), INTERFACE_NAME); 318 319 mInternalAddressList = dataCallInfo.getAddresses(); 320 assertEquals(mInternalAddressList.size(), 1); 321 for (LinkAddress mLinkAddress : mInternalAddressList) { 322 assertEquals(mLinkAddress, new LinkAddress(InetAddress.getByName(IP_ADDRESS), 3)); 323 } 324 325 mDNSAddressList = dataCallInfo.getDnsAddresses(); 326 assertEquals(mDNSAddressList.size(), 1); 327 for (InetAddress mInetAddress : mDNSAddressList) { 328 assertEquals(mInetAddress, InetAddress.getByName(DNS_ADDRESS)); 329 } 330 331 mGatewayAddressList = dataCallInfo.getGatewayAddresses(); 332 assertEquals(mGatewayAddressList.size(), 1); 333 for (InetAddress mInetAddress : mGatewayAddressList) { 334 assertEquals(mInetAddress, Inet4Address.getByName(GATEWAY_ADDRESS)); 335 } 336 337 mPCSFAddressList = dataCallInfo.getPcscfAddresses(); 338 assertEquals(mPCSFAddressList.size(), 1); 339 for (InetAddress mInetAddress : mPCSFAddressList) { 340 assertEquals(mInetAddress, InetAddress.getByName(PSCF_ADDRESS)); 341 } 342 343 assertEquals(dataCallInfo.getMtuV4(), LINK_MTU); 344 assertEquals(dataCallInfo.getMtuV6(), LINK_MTU); 345 } 346 } 347 348 @Test testRequestDataCallListEmpty()349 public void testRequestDataCallListEmpty() throws Exception { 350 latch = new CountDownLatch(1); 351 IwlanDataServiceCallback callback = new IwlanDataServiceCallback("requestDataCallList"); 352 mIwlanDataServiceProvider.requestDataCallList(new DataServiceCallback(callback)); 353 mTestLooper.dispatchAll(); 354 latch.await(1, TimeUnit.SECONDS); 355 356 assertEquals(mResultCode, DataServiceCallback.RESULT_SUCCESS); 357 assertEquals(mResultDataCallList.size(), 0); 358 } 359 360 @Test testIwlanSetupDataCallWithInvalidArg()361 public void testIwlanSetupDataCallWithInvalidArg() { 362 mIwlanDataServiceProvider.setupDataCall( 363 AccessNetworkType.UNKNOWN, /* AccessNetworkType */ 364 null, /* dataProfile */ 365 false, /* isRoaming */ 366 true, /* allowRoaming */ 367 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 368 null, /* LinkProperties */ 369 2, /* pdu session id */ 370 null, /* sliceInfo */ 371 null, /* trafficDescriptor */ 372 true, /* matchAllRuleAllowed */ 373 mMockDataServiceCallback); 374 mTestLooper.dispatchAll(); 375 376 verify(mMockDataServiceCallback, timeout(1000).times(1)) 377 .onSetupDataCallComplete( 378 eq(DataServiceCallback.RESULT_ERROR_INVALID_ARG), isNull()); 379 } 380 381 @Test testIwlanSetupDataCallWithIllegalState()382 public void testIwlanSetupDataCallWithIllegalState() { 383 DataProfile dp = buildDataProfile(); 384 385 /* Wifi is not connected */ 386 mIwlanDataService.setNetworkConnected( 387 false, mMockNetwork, IwlanDataService.Transport.UNSPECIFIED_NETWORK); 388 389 mIwlanDataServiceProvider.setupDataCall( 390 AccessNetworkType.IWLAN, /* AccessNetworkType */ 391 dp, /* dataProfile */ 392 false, /* isRoaming */ 393 true, /* allowRoaming */ 394 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 395 null, /* LinkProperties */ 396 1, /* pdu session id */ 397 null, /* sliceInfo */ 398 null, /* trafficDescriptor */ 399 true, /* matchAllRuleAllowed */ 400 mMockDataServiceCallback); 401 mTestLooper.dispatchAll(); 402 403 verify(mMockDataServiceCallback, timeout(1000).times(1)) 404 .onSetupDataCallComplete( 405 eq(5 /*DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE */), 406 isNull()); 407 } 408 409 @Test testIwlanDeactivateDataCallWithInvalidArg()410 public void testIwlanDeactivateDataCallWithInvalidArg() { 411 mIwlanDataServiceProvider.deactivateDataCall( 412 0, /* cid */ 413 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 414 mMockDataServiceCallback); 415 mTestLooper.dispatchAll(); 416 417 verify(mMockDataServiceCallback, timeout(1000).times(1)) 418 .onDeactivateDataCallComplete(eq(DataServiceCallback.RESULT_ERROR_INVALID_ARG)); 419 } 420 421 @Test testIwlanSetupDataCallWithBringUpTunnel()422 public void testIwlanSetupDataCallWithBringUpTunnel() { 423 DataProfile dp = buildDataProfile(); 424 425 /* Wifi is connected */ 426 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 427 428 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 429 430 mSpyIwlanDataServiceProvider.setupDataCall( 431 AccessNetworkType.IWLAN, /* AccessNetworkType */ 432 dp, /* dataProfile */ 433 false, /* isRoaming */ 434 true, /* allowRoaming */ 435 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 436 null, /* LinkProperties */ 437 1, /* pduSessionId */ 438 null, /* sliceInfo */ 439 null, /* trafficDescriptor */ 440 true, /* matchAllRuleAllowed */ 441 mMockDataServiceCallback); 442 mTestLooper.dispatchAll(); 443 444 /* Check bringUpTunnel() is called. */ 445 verify(mMockEpdgTunnelManager, times(1)) 446 .bringUpTunnel( 447 any(TunnelSetupRequest.class), 448 any(IwlanTunnelCallback.class), 449 any(IwlanTunnelCallbackMetrics.class)); 450 451 /* Check callback result is RESULT_SUCCESS when onOpened() is called. */ 452 mSpyIwlanDataServiceProvider 453 .getIwlanTunnelCallback() 454 .onOpened(TEST_APN_NAME, mMockTunnelLinkProperties); 455 mTestLooper.dispatchAll(); 456 verify(mMockDataServiceCallback, times(1)) 457 .onSetupDataCallComplete( 458 eq(DataServiceCallback.RESULT_SUCCESS), any(DataCallResponse.class)); 459 } 460 461 @Test testSliceInfoInclusionInDataCallResponse()462 public void testSliceInfoInclusionInDataCallResponse() throws Exception { 463 DataProfile dp = buildDataProfile(); 464 465 /* Wifi is connected */ 466 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 467 468 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 469 470 mSpyIwlanDataServiceProvider.setupDataCall( 471 AccessNetworkType.IWLAN, /* AccessNetworkType */ 472 dp, /* dataProfile */ 473 false, /* isRoaming */ 474 true, /* allowRoaming */ 475 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 476 null, /* LinkProperties */ 477 1, /* pduSessionId */ 478 null, /* sliceInfo */ 479 null, /* trafficDescriptor */ 480 true, /* matchAllRuleAllowed */ 481 mMockDataServiceCallback); 482 mTestLooper.dispatchAll(); 483 484 /* Check bringUpTunnel() is called. */ 485 verify(mMockEpdgTunnelManager, times(1)) 486 .bringUpTunnel( 487 any(TunnelSetupRequest.class), 488 any(IwlanTunnelCallback.class), 489 any(IwlanTunnelCallbackMetrics.class)); 490 491 /* Check callback result is RESULT_SUCCESS when onOpened() is called. */ 492 TunnelLinkProperties tp = TunnelLinkPropertiesTest.createTestTunnelLinkProperties(); 493 494 ArgumentCaptor<DataCallResponse> dataCallResponseCaptor = 495 ArgumentCaptor.forClass(DataCallResponse.class); 496 497 mSpyIwlanDataServiceProvider.getIwlanTunnelCallback().onOpened(TEST_APN_NAME, tp); 498 mTestLooper.dispatchAll(); 499 verify(mMockDataServiceCallback, times(1)) 500 .onSetupDataCallComplete( 501 eq(DataServiceCallback.RESULT_SUCCESS), dataCallResponseCaptor.capture()); 502 503 /* check that sliceinfo is filled up and matches */ 504 DataCallResponse dataCallResponse = dataCallResponseCaptor.getValue(); 505 assertNotNull(dataCallResponse.getSliceInfo()); 506 assertEquals(dataCallResponse.getSliceInfo(), tp.sliceInfo().get()); 507 } 508 509 @Test testIwlanDeactivateDataCallWithCloseTunnel()510 public void testIwlanDeactivateDataCallWithCloseTunnel() { 511 DataProfile dp = buildDataProfile(); 512 513 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 514 515 mSpyIwlanDataServiceProvider.setTunnelState( 516 dp, mMockDataServiceCallback, TunnelState.TUNNEL_IN_BRINGUP, null, false, 1); 517 518 mSpyIwlanDataServiceProvider.deactivateDataCall( 519 TEST_APN_NAME.hashCode() /* cid: hashcode() of "ims" */, 520 DataService.REQUEST_REASON_NORMAL /* DataService.REQUEST_REASON_NORMAL */, 521 mMockDataServiceCallback); 522 mTestLooper.dispatchAll(); 523 524 /* Check closeTunnel() is called. */ 525 verify(mMockEpdgTunnelManager, times(1)).closeTunnel(eq(TEST_APN_NAME), anyBoolean()); 526 527 /* Check callback result is RESULT_SUCCESS when onClosed() is called. */ 528 mSpyIwlanDataServiceProvider 529 .getIwlanTunnelCallback() 530 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR)); 531 mTestLooper.dispatchAll(); 532 verify(mMockDataServiceCallback, times(1)) 533 .onDeactivateDataCallComplete(eq(DataServiceCallback.RESULT_SUCCESS)); 534 } 535 536 @Test testHandoverFailureModeNormal()537 public void testHandoverFailureModeNormal() { 538 DataProfile dp = buildDataProfile(); 539 int setupDataReason = DataService.REQUEST_REASON_NORMAL; 540 541 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 542 .thenReturn(mMockErrorPolicyManager); 543 when(mMockErrorPolicyManager.getCurrentRetryTimeMs(eq(TEST_APN_NAME))).thenReturn(5L); 544 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 545 .thenReturn(DataFailCause.USER_AUTHENTICATION); 546 547 mSpyIwlanDataServiceProvider.setTunnelState( 548 dp, 549 mMockDataServiceCallback, 550 TunnelState.TUNNEL_IN_BRINGUP, 551 null, 552 (setupDataReason == DataService.REQUEST_REASON_HANDOVER), 553 1); 554 555 mSpyIwlanDataServiceProvider.setMetricsAtom( 556 TEST_APN_NAME, 557 64, // type IMS 558 true, 559 13, // LTE 560 false, 561 true, 562 1 // Transport Wi-Fi 563 ); 564 565 mSpyIwlanDataServiceProvider 566 .getIwlanTunnelCallback() 567 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR)); 568 mTestLooper.dispatchAll(); 569 570 ArgumentCaptor<DataCallResponse> dataCallResponseCaptor = 571 ArgumentCaptor.forClass(DataCallResponse.class); 572 573 verify(mMockDataServiceCallback, times(1)) 574 .onSetupDataCallComplete( 575 eq(DataServiceCallback.RESULT_SUCCESS), dataCallResponseCaptor.capture()); 576 577 DataCallResponse dataCallResponse = dataCallResponseCaptor.getValue(); 578 assertEquals( 579 dataCallResponse.getHandoverFailureMode(), 580 DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_SETUP_NORMAL); 581 assertEquals(dataCallResponse.getCause(), DataFailCause.USER_AUTHENTICATION); 582 assertEquals(dataCallResponse.getRetryDurationMillis(), 5L); 583 } 584 585 @Test testHandoverFailureModeHandover()586 public void testHandoverFailureModeHandover() { 587 DataProfile dp = buildDataProfile(); 588 int setupDataReason = DataService.REQUEST_REASON_HANDOVER; 589 590 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 591 .thenReturn(mMockErrorPolicyManager); 592 when(mMockErrorPolicyManager.getCurrentRetryTimeMs(eq(TEST_APN_NAME))).thenReturn(-1L); 593 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 594 .thenReturn(DataFailCause.ERROR_UNSPECIFIED); 595 596 mSpyIwlanDataServiceProvider.setTunnelState( 597 dp, 598 mMockDataServiceCallback, 599 TunnelState.TUNNEL_IN_BRINGUP, 600 null, 601 (setupDataReason == DataService.REQUEST_REASON_HANDOVER), 602 1); 603 604 mSpyIwlanDataServiceProvider.setMetricsAtom( 605 TEST_APN_NAME, 606 64, // type IMS 607 true, 608 13, // LTE 609 false, 610 true, 611 1 // Transport Wi-Fi 612 ); 613 614 mSpyIwlanDataServiceProvider 615 .getIwlanTunnelCallback() 616 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR)); 617 mTestLooper.dispatchAll(); 618 619 ArgumentCaptor<DataCallResponse> dataCallResponseCaptor = 620 ArgumentCaptor.forClass(DataCallResponse.class); 621 622 verify(mMockDataServiceCallback, times(1)) 623 .onSetupDataCallComplete( 624 eq(DataServiceCallback.RESULT_SUCCESS), dataCallResponseCaptor.capture()); 625 626 DataCallResponse dataCallResponse = dataCallResponseCaptor.getValue(); 627 assertEquals( 628 dataCallResponse.getHandoverFailureMode(), 629 DataCallResponse.HANDOVER_FAILURE_MODE_NO_FALLBACK_RETRY_HANDOVER); 630 assertEquals(dataCallResponse.getCause(), DataFailCause.ERROR_UNSPECIFIED); 631 assertEquals(dataCallResponse.getRetryDurationMillis(), -1L); 632 } 633 634 @Test testDnsPrefetching()635 public void testDnsPrefetching() throws Exception { 636 IwlanNetworkMonitorCallback mNetworkMonitorCallback = 637 mIwlanDataService.getNetworkMonitorCallback(); 638 /* Wifi is connected */ 639 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 640 641 List<LinkAddress> linkAddresses = new ArrayList<>(); 642 linkAddresses.add(mMockIPv4LinkAddress); 643 644 when(mMockLinkProperties.getLinkAddresses()).thenReturn(linkAddresses); 645 mNetworkMonitorCallback.onLinkPropertiesChanged(mMockNetwork, mMockLinkProperties); 646 647 mIwlanDataService 648 .mIwlanDataServiceHandler 649 .obtainMessage( 650 IwlanEventListener.CARRIER_CONFIG_CHANGED_EVENT, 651 DEFAULT_SLOT_INDEX, 652 0 /* unused */) 653 .sendToTarget(); 654 655 mIwlanDataService 656 .mIwlanDataServiceHandler 657 .obtainMessage( 658 IwlanEventListener.WIFI_CALLING_ENABLE_EVENT, 659 DEFAULT_SLOT_INDEX, 660 0 /* unused */) 661 .sendToTarget(); 662 mTestLooper.dispatchAll(); 663 664 linkAddresses.add(mMockIPv6LinkAddress); 665 666 when(mMockLinkProperties.getLinkAddresses()).thenReturn(linkAddresses); 667 mNetworkMonitorCallback.onLinkPropertiesChanged(mMockNetwork, mMockLinkProperties); 668 669 /* Prefetching will be triggered twice. 670 1. Network connected, CarrierConfig ready, WifiCallingSetting enabled 671 2. Connection ipFamily changed. 672 */ 673 verify(mMockEpdgSelector, times(2)) 674 .getValidatedServerList( 675 eq(0), 676 eq(EpdgSelector.PROTO_FILTER_IPV4V6), 677 eq(false), 678 eq(false), 679 eq(mMockNetwork), 680 isNull()); 681 verify(mMockEpdgSelector, times(2)) 682 .getValidatedServerList( 683 eq(0), 684 eq(EpdgSelector.PROTO_FILTER_IPV4V6), 685 eq(false), 686 eq(true), 687 eq(mMockNetwork), 688 isNull()); 689 } 690 sleep(long time)691 private void sleep(long time) { 692 try { 693 Thread.sleep(time); 694 } catch (Exception e) { 695 e.printStackTrace(); 696 } 697 } 698 buildDataProfile()699 private DataProfile buildDataProfile() { 700 DataProfile dp = 701 new DataProfile.Builder() 702 .setProfileId(1) 703 .setApn(TEST_APN_NAME) 704 .setProtocolType(ApnSetting.PROTOCOL_IPV4V6) // IPv4v6 705 .setAuthType(0) // none 706 .setUserName("") 707 .setPassword("") 708 .setType(1) // 3gpp 709 // .setMaxConnectionsTime(1) 710 // .setMaxConnections(3) 711 // .setWaitTime(10) 712 .enable(true) 713 .setSupportedApnTypesBitmask(ApnSetting.TYPE_IMS) 714 .setRoamingProtocolType(ApnSetting.PROTOCOL_IPV4V6) // IPv4v6 715 .setBearerBitmask((int) TelephonyManager.NETWORK_TYPE_BITMASK_IWLAN) 716 .setPersistent(true) 717 .setPreferred(true) 718 .build(); 719 return dp; 720 } 721 722 @Test testIwlanSetupDataCallWithCellularAndCstDisabled()723 public void testIwlanSetupDataCallWithCellularAndCstDisabled() { 724 DataProfile dp = buildDataProfile(); 725 726 /* Mobile is connected */ 727 mIwlanDataService.setNetworkConnected( 728 true, mMockNetwork, IwlanDataService.Transport.MOBILE); 729 730 lenient() 731 .when( 732 IwlanHelper.isCrossSimCallingEnabled( 733 eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 734 .thenReturn(false); 735 lenient() 736 .when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 737 .thenReturn(true); 738 739 mIwlanDataServiceProvider.setupDataCall( 740 AccessNetworkType.IWLAN, /* AccessNetworkType */ 741 dp, /* dataProfile */ 742 false, /* isRoaming */ 743 true, /* allowRoaming */ 744 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 745 null, /* LinkProperties */ 746 1, /* pdu session id */ 747 null, /* sliceInfo */ 748 null, /* trafficDescriptor */ 749 true, /* matchAllRuleAllowed */ 750 mMockDataServiceCallback); 751 mTestLooper.dispatchAll(); 752 753 verify(mMockDataServiceCallback, timeout(1000).times(1)) 754 .onSetupDataCallComplete( 755 eq(5 /* DataServiceCallback.RESULT_ERROR_TEMPORARILY_UNAVAILABLE */), 756 isNull()); 757 } 758 759 @Test testIwlanSetupDataCallWithCellularAndCstEnabled()760 public void testIwlanSetupDataCallWithCellularAndCstEnabled() { 761 DataProfile dp = buildDataProfile(); 762 763 /* Clear state */ 764 mIwlanDataService.setNetworkConnected( 765 false, mMockNetwork, IwlanDataService.Transport.UNSPECIFIED_NETWORK); 766 767 /* Mobile is connected */ 768 mIwlanDataService.setNetworkConnected( 769 true, mMockNetwork, IwlanDataService.Transport.MOBILE); 770 771 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 772 773 lenient() 774 .when( 775 IwlanHelper.isCrossSimCallingEnabled( 776 eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 777 .thenReturn(true); 778 lenient() 779 .when(IwlanHelper.isDefaultDataSlot(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 780 .thenReturn(false); 781 782 mSpyIwlanDataServiceProvider.setupDataCall( 783 AccessNetworkType.IWLAN, /* AccessNetworkType */ 784 dp, /* dataProfile */ 785 false, /* isRoaming */ 786 true, /* allowRoaming */ 787 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 788 null, /* LinkProperties */ 789 1, /* pduSessionId */ 790 null, /* sliceInfo */ 791 null, /* trafficDescriptor */ 792 true, /* matchAllRuleAllowed */ 793 mMockDataServiceCallback); 794 mTestLooper.dispatchAll(); 795 796 /* Check bringUpTunnel() is called. */ 797 verify(mMockEpdgTunnelManager, times(1)) 798 .bringUpTunnel( 799 any(TunnelSetupRequest.class), 800 any(IwlanTunnelCallback.class), 801 any(IwlanTunnelCallbackMetrics.class)); 802 803 /* Check callback result is RESULT_SUCCESS when onOpened() is called. */ 804 mSpyIwlanDataServiceProvider 805 .getIwlanTunnelCallback() 806 .onOpened(TEST_APN_NAME, mMockTunnelLinkProperties); 807 mTestLooper.dispatchAll(); 808 verify(mMockDataServiceCallback, times(1)) 809 .onSetupDataCallComplete( 810 eq(DataServiceCallback.RESULT_SUCCESS), any(DataCallResponse.class)); 811 } 812 813 @Test testIwlanTunnelStatsFailureCounts()814 public void testIwlanTunnelStatsFailureCounts() { 815 DataProfile dp = buildDataProfile(); 816 817 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 818 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 819 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 820 .thenReturn(mMockErrorPolicyManager); 821 822 long count = 3L; 823 for (int i = 0; i < count; i++) { 824 mockTunnelSetupFail(dp); 825 sleep(1000); 826 } 827 828 IwlanDataServiceProvider.IwlanDataTunnelStats stats = 829 mSpyIwlanDataServiceProvider.getTunnelStats(); 830 long result = stats.mTunnelSetupFailureCounts.get(TEST_APN_NAME); 831 assertEquals(result, count); 832 } 833 834 @Test testIwlanTunnelStatsUnsolDownCounts()835 public void testIwlanTunnelStatsUnsolDownCounts() { 836 DataProfile dp = buildDataProfile(); 837 838 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 839 .thenReturn(mMockErrorPolicyManager); 840 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 841 .thenReturn(DataFailCause.ERROR_UNSPECIFIED); 842 843 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 844 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 845 846 long count = 3L; 847 for (int i = 0; i < count; i++) { 848 mockTunnelSetupSuccess(dp, 0); 849 mockUnsolTunnelDown(); 850 } 851 852 IwlanDataServiceProvider.IwlanDataTunnelStats stats = 853 mSpyIwlanDataServiceProvider.getTunnelStats(); 854 long result = stats.mUnsolTunnelDownCounts.get(TEST_APN_NAME); 855 assertEquals(result, count); 856 } 857 858 @Test testIwlanTunnelStats()859 public void testIwlanTunnelStats() { 860 DataProfile dp = buildDataProfile(); 861 862 mIwlanDataService.setNetworkConnected(true, mMockNetwork, IwlanDataService.Transport.WIFI); 863 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 864 865 LongSummaryStatistics tunnelSetupSuccessStats = new LongSummaryStatistics(); 866 LongSummaryStatistics tunnelUpStats = new LongSummaryStatistics(); 867 868 Date beforeSetup = Calendar.getInstance().getTime(); 869 mockTunnelSetupSuccess(dp, 0); 870 Date tunnelUp = Calendar.getInstance().getTime(); 871 mockDeactivateTunnelDown(0); 872 Date tunnelDown = Calendar.getInstance().getTime(); 873 tunnelSetupSuccessStats.accept(tunnelUp.getTime() - beforeSetup.getTime()); 874 tunnelUpStats.accept(tunnelDown.getTime() - tunnelUp.getTime()); 875 876 beforeSetup = Calendar.getInstance().getTime(); 877 mockTunnelSetupSuccess(dp, 1000); 878 tunnelUp = Calendar.getInstance().getTime(); 879 mockDeactivateTunnelDown(3000); 880 tunnelDown = Calendar.getInstance().getTime(); 881 tunnelSetupSuccessStats.accept(tunnelUp.getTime() - beforeSetup.getTime()); 882 tunnelUpStats.accept(tunnelDown.getTime() - tunnelUp.getTime()); 883 884 beforeSetup = Calendar.getInstance().getTime(); 885 mockTunnelSetupSuccess(dp, 600); 886 tunnelUp = Calendar.getInstance().getTime(); 887 mockDeactivateTunnelDown(500); 888 tunnelDown = Calendar.getInstance().getTime(); 889 tunnelSetupSuccessStats.accept(tunnelUp.getTime() - beforeSetup.getTime()); 890 tunnelUpStats.accept(tunnelDown.getTime() - tunnelUp.getTime()); 891 892 IwlanDataServiceProvider.IwlanDataTunnelStats stats = 893 mSpyIwlanDataServiceProvider.getTunnelStats(); 894 LongSummaryStatistics finalSetupStats = stats.mTunnelSetupSuccessStats.get(TEST_APN_NAME); 895 LongSummaryStatistics finalUpStats = stats.mTunnelUpStats.get(TEST_APN_NAME); 896 897 assertEquals(finalSetupStats.getAverage(), tunnelSetupSuccessStats.getAverage(), 100); 898 assertEquals(finalSetupStats.getCount(), tunnelSetupSuccessStats.getCount()); 899 assertEquals(finalSetupStats.getMax(), tunnelSetupSuccessStats.getMax(), 100); 900 901 assertEquals(finalUpStats.getAverage(), tunnelUpStats.getAverage(), 100); 902 assertEquals(finalUpStats.getCount(), tunnelUpStats.getCount()); 903 assertEquals(finalUpStats.getMax(), tunnelUpStats.getMax(), 100); 904 } 905 906 @Test testIwlanDataServiceHandlerOnUnbind()907 public void testIwlanDataServiceHandlerOnUnbind() { 908 DataProfile dp = buildDataProfile(); 909 doReturn(mMockEpdgTunnelManager).when(mSpyIwlanDataServiceProvider).getTunnelManager(); 910 mSpyIwlanDataServiceProvider.setTunnelState( 911 dp, mMockDataServiceCallback, TunnelState.TUNNEL_UP, null, false, 1); 912 913 mSpyIwlanDataServiceProvider.setMetricsAtom( 914 TEST_APN_NAME, 915 64, // type IMS 916 true, 917 13, // LTE 918 false, 919 true, 920 1 // Transport Wi-Fi 921 ); 922 923 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 924 .thenReturn(mMockErrorPolicyManager); 925 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 926 .thenReturn(DataFailCause.ERROR_UNSPECIFIED); 927 928 // Simulate IwlanDataService.onUnbind() which force close all tunnels 929 mSpyIwlanDataServiceProvider.forceCloseTunnels(); 930 // Simulate DataService.onUnbind() which remove all IwlanDataServiceProviders 931 mSpyIwlanDataServiceProvider.close(); 932 mTestLooper.dispatchAll(); 933 934 verify(mMockEpdgTunnelManager, atLeastOnce()).closeTunnel(eq(TEST_APN_NAME), eq(true)); 935 assertNotNull(mIwlanDataService.mIwlanDataServiceHandler); 936 // Should not raise NullPointerException 937 mSpyIwlanDataServiceProvider 938 .getIwlanTunnelCallback() 939 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR)); 940 mTestLooper.dispatchAll(); 941 } 942 943 @Test testMetricsWhenTunnelClosedWithWrappedException()944 public void testMetricsWhenTunnelClosedWithWrappedException() { 945 DataProfile dp = buildDataProfile(); 946 947 mSpyIwlanDataServiceProvider.setTunnelState( 948 dp, 949 mMockDataServiceCallback, 950 TunnelState.TUNNEL_IN_BRINGUP, 951 null, /* linkProperties */ 952 false /* isHandover */, 953 1 /* pduSessionId */); 954 955 mSpyIwlanDataServiceProvider.setMetricsAtom( 956 TEST_APN_NAME, 957 64, // type IMS 958 true, 959 13, // LTE 960 false, 961 true, 962 1 // Transport Wi-Fi 963 ); 964 965 MetricsAtom metricsAtom = mSpyIwlanDataServiceProvider.getMetricsAtomByApn(TEST_APN_NAME); 966 assertNotNull(metricsAtom); 967 968 String exceptionMessage = "Some exception message"; 969 Exception mockException = spy(new IllegalStateException(exceptionMessage)); 970 String firstDeclaringClassName = "test.test.TestClass"; 971 String firstMethodName = "someMethod"; 972 String firstFileName = "TestClass.java"; 973 int firstLineNumber = 12345; 974 StackTraceElement[] stackTraceElements = { 975 new StackTraceElement( 976 firstDeclaringClassName, firstMethodName, firstFileName, firstLineNumber), 977 new StackTraceElement("test", "test", "test.java", 123) 978 }; 979 doReturn(stackTraceElements).when(mockException).getStackTrace(); 980 981 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 982 .thenReturn(mMockErrorPolicyManager); 983 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 984 .thenReturn(DataFailCause.ERROR_UNSPECIFIED); 985 986 mSpyIwlanDataServiceProvider 987 .getIwlanTunnelCallback() 988 .onClosed(TEST_APN_NAME, new IwlanError(new IkeInternalException(mockException))); 989 990 mTestLooper.dispatchAll(); 991 992 var expectedStackFirstFrame = 993 firstDeclaringClassName 994 + "." 995 + firstMethodName 996 + "(" 997 + firstFileName 998 + ":" 999 + firstLineNumber 1000 + ")"; 1001 1002 assertEquals( 1003 mockException.getClass().getCanonicalName(), 1004 metricsAtom.getIwlanErrorWrappedClassname()); 1005 1006 assertEquals(expectedStackFirstFrame, metricsAtom.getIwlanErrorWrappedStackFirstFrame()); 1007 } 1008 1009 @Test testMetricsWhenTunnelClosedWithoutWrappedException()1010 public void testMetricsWhenTunnelClosedWithoutWrappedException() { 1011 DataProfile dp = buildDataProfile(); 1012 1013 mSpyIwlanDataServiceProvider.setTunnelState( 1014 dp, 1015 mMockDataServiceCallback, 1016 TunnelState.TUNNEL_IN_BRINGUP, 1017 null, /* linkProperties */ 1018 false /* isHandover */, 1019 1 /* pduSessionId */); 1020 1021 mSpyIwlanDataServiceProvider.setMetricsAtom( 1022 TEST_APN_NAME, 1023 64, // type IMS 1024 true, 1025 13, // LTE 1026 false, 1027 true, 1028 1 // Transport Wi-Fi 1029 ); 1030 1031 MetricsAtom metricsAtom = mSpyIwlanDataServiceProvider.getMetricsAtomByApn(TEST_APN_NAME); 1032 assertNotNull(metricsAtom); 1033 1034 when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX))) 1035 .thenReturn(mMockErrorPolicyManager); 1036 when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME))) 1037 .thenReturn(DataFailCause.ERROR_UNSPECIFIED); 1038 1039 mSpyIwlanDataServiceProvider 1040 .getIwlanTunnelCallback() 1041 .onClosed( 1042 TEST_APN_NAME, 1043 new IwlanError(IwlanError.EPDG_SELECTOR_SERVER_SELECTION_FAILED)); 1044 1045 mTestLooper.dispatchAll(); 1046 1047 assertEquals(null, metricsAtom.getIwlanErrorWrappedClassname()); 1048 assertEquals(null, metricsAtom.getIwlanErrorWrappedStackFirstFrame()); 1049 } 1050 mockTunnelSetupFail(DataProfile dp)1051 private void mockTunnelSetupFail(DataProfile dp) { 1052 mSpyIwlanDataServiceProvider.setupDataCall( 1053 AccessNetworkType.IWLAN, /* AccessNetworkType */ 1054 dp, /* dataProfile */ 1055 false, /* isRoaming */ 1056 true, /* allowRoaming */ 1057 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 1058 null, /* LinkProperties */ 1059 1, /* pduSessionId */ 1060 null, /* sliceInfo */ 1061 null, /* trafficDescriptor */ 1062 true, /* matchAllRuleAllowed */ 1063 mMockDataServiceCallback); 1064 doReturn(true) 1065 .when(mMockEpdgTunnelManager) 1066 .bringUpTunnel( 1067 any(TunnelSetupRequest.class), 1068 any(IwlanTunnelCallback.class), 1069 any(IwlanTunnelCallbackMetrics.class)); 1070 1071 mSpyIwlanDataServiceProvider 1072 .getIwlanTunnelCallback() 1073 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.IKE_INTERNAL_IO_EXCEPTION)); 1074 mTestLooper.dispatchAll(); 1075 verify(mMockDataServiceCallback, atLeastOnce()) 1076 .onSetupDataCallComplete( 1077 eq(DataServiceCallback.RESULT_SUCCESS), any(DataCallResponse.class)); 1078 } 1079 mockTunnelSetupSuccess(DataProfile dp, long sleepTime)1080 private void mockTunnelSetupSuccess(DataProfile dp, long sleepTime) { 1081 mSpyIwlanDataServiceProvider.setupDataCall( 1082 AccessNetworkType.IWLAN, /* AccessNetworkType */ 1083 dp, /* dataProfile */ 1084 false, /* isRoaming */ 1085 true, /* allowRoaming */ 1086 DataService.REQUEST_REASON_NORMAL, /* DataService.REQUEST_REASON_NORMAL */ 1087 null, /* LinkProperties */ 1088 1, /* pduSessionId */ 1089 null, /* sliceInfo */ 1090 null, /* trafficDescriptor */ 1091 true, /* matchAllRuleAllowed */ 1092 mMockDataServiceCallback); 1093 doReturn(true) 1094 .when(mMockEpdgTunnelManager) 1095 .bringUpTunnel( 1096 any(TunnelSetupRequest.class), 1097 any(IwlanTunnelCallback.class), 1098 any(IwlanTunnelCallbackMetrics.class)); 1099 mTestLooper.dispatchAll(); 1100 1101 sleep(sleepTime); 1102 1103 mSpyIwlanDataServiceProvider 1104 .getIwlanTunnelCallback() 1105 .onOpened(TEST_APN_NAME, mMockTunnelLinkProperties); 1106 mTestLooper.dispatchAll(); 1107 verify(mMockDataServiceCallback, atLeastOnce()) 1108 .onSetupDataCallComplete( 1109 eq(DataServiceCallback.RESULT_SUCCESS), any(DataCallResponse.class)); 1110 } 1111 mockUnsolTunnelDown()1112 private void mockUnsolTunnelDown() { 1113 mSpyIwlanDataServiceProvider 1114 .getIwlanTunnelCallback() 1115 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.IKE_INTERNAL_IO_EXCEPTION)); 1116 mTestLooper.dispatchAll(); 1117 } 1118 mockDeactivateTunnelDown(long sleepTime)1119 private void mockDeactivateTunnelDown(long sleepTime) { 1120 mSpyIwlanDataServiceProvider.deactivateDataCall( 1121 TEST_APN_NAME.hashCode() /* cid: hashcode() of "ims" */, 1122 DataService.REQUEST_REASON_NORMAL /* DataService.REQUEST_REASON_NORMAL */, 1123 mMockDataServiceCallback); 1124 mTestLooper.dispatchAll(); 1125 verify(mMockEpdgTunnelManager, atLeastOnce()).closeTunnel(eq(TEST_APN_NAME), anyBoolean()); 1126 1127 sleep(sleepTime); 1128 1129 mSpyIwlanDataServiceProvider 1130 .getIwlanTunnelCallback() 1131 .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR)); 1132 mTestLooper.dispatchAll(); 1133 verify(mMockDataServiceCallback, atLeastOnce()) 1134 .onDeactivateDataCallComplete(eq(DataServiceCallback.RESULT_SUCCESS)); 1135 } 1136 } 1137