summaryrefslogtreecommitdiff
path: root/test/com/google/android/iwlan/IwlanDataServiceTest.java
diff options
context:
space:
mode:
authorPo-Chun Lee <pochunlee@google.com>2023-11-23 06:33:51 +0000
committerPo-Chun Lee <pochunlee@google.com>2023-11-28 10:22:47 +0000
commitf69a5f90aaf38ac160198e1dfe256e8df42f666a (patch)
treed057d5c0259f6e8a3ca72a23fa6b79a43aed9cd9 /test/com/google/android/iwlan/IwlanDataServiceTest.java
parent4c84686e45a374412649596eab5bb69ce748aecf (diff)
downloadIwlan-f69a5f90aaf38ac160198e1dfe256e8df42f666a.tar.gz
Add a delay in deactivateDataCall for handovers
To address issues during handovers, a delay is added in handling deactivateDataCall after handover to WWAN. This change ensures that the network has time to release the tunnel. If not released within 3 seconds, Iwlan will forcefully terminate the session using IkeSession#kill(). Bug: 312074917 Test: atest(new) Test: on-device regression Change-Id: If85b2f5ba345e128a539960c116149a8290c66f0
Diffstat (limited to 'test/com/google/android/iwlan/IwlanDataServiceTest.java')
-rw-r--r--test/com/google/android/iwlan/IwlanDataServiceTest.java138
1 files changed, 134 insertions, 4 deletions
diff --git a/test/com/google/android/iwlan/IwlanDataServiceTest.java b/test/com/google/android/iwlan/IwlanDataServiceTest.java
index c7d40e1..f1da225 100644
--- a/test/com/google/android/iwlan/IwlanDataServiceTest.java
+++ b/test/com/google/android/iwlan/IwlanDataServiceTest.java
@@ -202,12 +202,12 @@ public class IwlanDataServiceTest {
.mockStatic(ErrorPolicyManager.class)
.mockStatic(IwlanBroadcastReceiver.class)
.mockStatic(SubscriptionManager.class)
+ .spyStatic(IwlanCarrierConfig.class)
.strictness(Strictness.LENIENT)
.startMocking();
when(mMockContext.getSystemService(eq(ConnectivityManager.class)))
.thenReturn(mMockConnectivityManager);
-
when(mMockContext.getSystemService(eq(SubscriptionManager.class)))
.thenReturn(mMockSubscriptionManager);
@@ -271,6 +271,11 @@ public class IwlanDataServiceTest {
when(mMockTunnelLinkProperties.ifaceName()).thenReturn("mockipsec0");
}
+ private void moveTimeForwardAndDispatch(long milliSeconds) {
+ mTestLooper.moveTimeForward(milliSeconds);
+ mTestLooper.dispatchAll();
+ }
+
@After
public void cleanUp() throws Exception {
mStaticMockSession.finishMocking();
@@ -830,7 +835,7 @@ public class IwlanDataServiceTest {
}
@Test
- public void testIwlanDeactivateDataCallAfterSuccessHandover() {
+ public void testDeactivateDataCall_ImmediateReleaseAfterHandover() {
DataProfile dp = buildImsDataProfile();
onSystemDefaultNetworkConnected(TRANSPORT_WIFI);
@@ -838,7 +843,7 @@ public class IwlanDataServiceTest {
mSpyIwlanDataServiceProvider.setTunnelState(
dp,
mMockDataServiceCallback,
- TunnelState.TUNNEL_IN_BRINGUP,
+ TunnelState.TUNNEL_UP,
null, /* linkProperties */
false, /* isHandover */
1, /* pduSessionId */
@@ -849,11 +854,13 @@ public class IwlanDataServiceTest {
DataService.REQUEST_REASON_HANDOVER,
mMockDataServiceCallback);
mTestLooper.dispatchAll();
+
+ moveTimeForwardAndDispatch(50);
/* Check closeTunnel() is called. */
verify(mMockEpdgTunnelManager, times(1))
.closeTunnel(
eq(TEST_APN_NAME),
- eq(true),
+ eq(true) /* forceClose */,
any(IwlanTunnelCallback.class),
any(IwlanTunnelMetricsImpl.class));
@@ -867,6 +874,129 @@ public class IwlanDataServiceTest {
}
@Test
+ public void testDeactivateDataCall_DelayedReleaseAfterHandover() {
+ DataProfile dp = buildImsDataProfile();
+
+ when(IwlanCarrierConfig.getConfig(
+ mMockContext,
+ DEFAULT_SLOT_INDEX,
+ IwlanCarrierConfig.KEY_HANDOVER_TO_WWAN_RELEASE_DELAY_SECOND_INT))
+ .thenReturn(3);
+ onSystemDefaultNetworkConnected(TRANSPORT_WIFI);
+
+ mSpyIwlanDataServiceProvider.setTunnelState(
+ dp,
+ mMockDataServiceCallback,
+ TunnelState.TUNNEL_UP,
+ null, /* linkProperties */
+ false, /* isHandover */
+ 1, /* pduSessionId */
+ true /* isImsOrEmergency */);
+
+ mSpyIwlanDataServiceProvider.deactivateDataCall(
+ TEST_APN_NAME.hashCode() /* cid: hashcode() of "ims" */,
+ DataService.REQUEST_REASON_HANDOVER,
+ mMockDataServiceCallback);
+ mTestLooper.dispatchAll();
+
+ moveTimeForwardAndDispatch(2950);
+ /* Check closeTunnel() is called. */
+ verify(mMockEpdgTunnelManager, never())
+ .closeTunnel(
+ eq(TEST_APN_NAME),
+ anyBoolean(),
+ any(IwlanTunnelCallback.class),
+ any(IwlanTunnelMetricsImpl.class));
+
+ moveTimeForwardAndDispatch(50);
+ /* Check closeTunnel() is called. */
+ verify(mMockEpdgTunnelManager, times(1))
+ .closeTunnel(
+ eq(TEST_APN_NAME),
+ eq(true) /* forceClose */,
+ any(IwlanTunnelCallback.class),
+ any(IwlanTunnelMetricsImpl.class));
+
+ /* Check callback result is RESULT_SUCCESS when onClosed() is called. */
+ mSpyIwlanDataServiceProvider
+ .getIwlanTunnelCallback()
+ .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR));
+ mTestLooper.dispatchAll();
+ verify(mMockDataServiceCallback, times(1))
+ .onDeactivateDataCallComplete(eq(DataServiceCallback.RESULT_SUCCESS));
+ }
+
+ @Test
+ public void testDeactivateDataCall_DelayedReleaseAfterHandover_NetworkReleaseBeforeDelay() {
+ DataProfile dp = buildImsDataProfile();
+
+ when(IwlanCarrierConfig.getConfig(
+ mMockContext,
+ DEFAULT_SLOT_INDEX,
+ IwlanCarrierConfig.KEY_HANDOVER_TO_WWAN_RELEASE_DELAY_SECOND_INT))
+ .thenReturn(3);
+ when(ErrorPolicyManager.getInstance(eq(mMockContext), eq(DEFAULT_SLOT_INDEX)))
+ .thenReturn(mMockErrorPolicyManager);
+ when(mMockErrorPolicyManager.getDataFailCause(eq(TEST_APN_NAME)))
+ .thenReturn(DataFailCause.NONE);
+
+ onSystemDefaultNetworkConnected(TRANSPORT_WIFI);
+
+ mSpyIwlanDataServiceProvider.setTunnelState(
+ dp,
+ mMockDataServiceCallback,
+ TunnelState.TUNNEL_UP,
+ null, /* linkProperties */
+ false, /* isHandover */
+ 1, /* pduSessionId */
+ true /* isImsOrEmergency */);
+
+ mSpyIwlanDataServiceProvider.setMetricsAtom(
+ TEST_APN_NAME,
+ 64, /* type IMS */
+ true,
+ 13, /* LTE */
+ false,
+ true,
+ 1 /* Transport WiFi */);
+
+ mSpyIwlanDataServiceProvider.deactivateDataCall(
+ TEST_APN_NAME.hashCode() /* cid: hashcode() of "ims" */,
+ DataService.REQUEST_REASON_HANDOVER,
+ mMockDataServiceCallback);
+ mTestLooper.dispatchAll();
+
+ moveTimeForwardAndDispatch(50);
+ /* Check closeTunnel() is called. */
+ verify(mMockEpdgTunnelManager, never())
+ .closeTunnel(
+ eq(TEST_APN_NAME),
+ anyBoolean(),
+ any(IwlanTunnelCallback.class),
+ any(IwlanTunnelMetricsImpl.class));
+
+ /* Check callback result is RESULT_SUCCESS when onClosed() is called. */
+ mSpyIwlanDataServiceProvider
+ .getIwlanTunnelCallback()
+ .onClosed(TEST_APN_NAME, new IwlanError(IwlanError.NO_ERROR));
+ mTestLooper.dispatchAll();
+ verify(mMockDataServiceCallback, times(1))
+ .onDeactivateDataCallComplete(eq(DataServiceCallback.RESULT_ERROR_INVALID_ARG));
+
+ moveTimeForwardAndDispatch(4000);
+
+ verify(mMockEpdgTunnelManager, never())
+ .closeTunnel(
+ eq(TEST_APN_NAME),
+ anyBoolean(),
+ any(IwlanTunnelCallback.class),
+ any(IwlanTunnelMetricsImpl.class));
+
+ // No additional callbacks are involved.
+ verify(mMockDataServiceCallback, times(1)).onDeactivateDataCallComplete(anyInt());
+ }
+
+ @Test
public void testHandoverFailureModeDefault() {
DataProfile dp = buildImsDataProfile();
int setupDataReason = DataService.REQUEST_REASON_NORMAL;