diff options
author | Po-Chun Lee <pochunlee@google.com> | 2023-11-23 06:33:51 +0000 |
---|---|---|
committer | Po-Chun Lee <pochunlee@google.com> | 2023-11-28 10:22:47 +0000 |
commit | f69a5f90aaf38ac160198e1dfe256e8df42f666a (patch) | |
tree | d057d5c0259f6e8a3ca72a23fa6b79a43aed9cd9 /test/com/google/android/iwlan/IwlanDataServiceTest.java | |
parent | 4c84686e45a374412649596eab5bb69ce748aecf (diff) | |
download | Iwlan-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.java | 138 |
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; |