• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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