Merge changes from topics "recoveryTimeUnit", "vpnRecovery"

* changes:
  Update tests to reflect the time unit change in Vpn
  Update tests for VPN data stall recovery
This commit is contained in:
Chiachang Wang
2023-07-04 08:50:45 +00:00
committed by Gerrit Code Review

View File

@@ -2768,23 +2768,30 @@ public class VpnTest extends VpnTestBase {
new PersistableBundle());
}
private void verifyMobikeTriggered(List<Network> expected) {
private void verifyMobikeTriggered(List<Network> expected, int retryIndex) {
// Verify retry is scheduled
final long expectedDelayMs = mTestDeps.getValidationFailRecoveryMs(retryIndex);
final ArgumentCaptor<Long> delayCaptor = ArgumentCaptor.forClass(Long.class);
verify(mExecutor, times(retryIndex + 1)).schedule(
any(Runnable.class), delayCaptor.capture(), eq(TimeUnit.MILLISECONDS));
final List<Long> delays = delayCaptor.getAllValues();
assertEquals(expectedDelayMs, (long) delays.get(delays.size() - 1));
final ArgumentCaptor<Network> networkCaptor = ArgumentCaptor.forClass(Network.class);
verify(mIkeSessionWrapper).setNetwork(networkCaptor.capture(),
anyInt() /* ipVersion */, anyInt() /* encapType */, anyInt() /* keepaliveDelay */);
verify(mIkeSessionWrapper, timeout(TEST_TIMEOUT_MS + expectedDelayMs))
.setNetwork(networkCaptor.capture(), anyInt() /* ipVersion */,
anyInt() /* encapType */, anyInt() /* keepaliveDelay */);
assertEquals(expected, Collections.singletonList(networkCaptor.getValue()));
}
@Test
public void testDataStallInIkev2VpnMobikeDisabled() throws Exception {
verifySetupPlatformVpn(
final PlatformVpnSnapshot vpnSnapShot = verifySetupPlatformVpn(
createIkeConfig(createIkeConnectInfo(), false /* isMobikeEnabled */));
doReturn(TEST_NETWORK).when(mMockNetworkAgent).getNetwork();
final ConnectivityDiagnosticsCallback connectivityDiagCallback =
getConnectivityDiagCallback();
final DataStallReport report = createDataStallReport();
connectivityDiagCallback.onDataStallSuspected(report);
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
// Should not trigger MOBIKE if MOBIKE is not enabled
verify(mIkeSessionWrapper, never()).setNetwork(any() /* network */,
@@ -2797,19 +2804,11 @@ public class VpnTest extends VpnTestBase {
createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */));
doReturn(TEST_NETWORK).when(mMockNetworkAgent).getNetwork();
final ConnectivityDiagnosticsCallback connectivityDiagCallback =
getConnectivityDiagCallback();
final DataStallReport report = createDataStallReport();
connectivityDiagCallback.onDataStallSuspected(report);
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
// Verify MOBIKE is triggered
verifyMobikeTriggered(vpnSnapShot.vpn.mNetworkCapabilities.getUnderlyingNetworks());
// Expect to skip other data stall event if MOBIKE was started.
reset(mIkeSessionWrapper);
connectivityDiagCallback.onDataStallSuspected(report);
verify(mIkeSessionWrapper, never()).setNetwork(any() /* network */,
anyInt() /* ipVersion */, anyInt() /* encapType */, anyInt() /* keepaliveDelay */);
verifyMobikeTriggered(vpnSnapShot.vpn.mNetworkCapabilities.getUnderlyingNetworks(),
0 /* retryIndex */);
reset(mIkev2SessionCreator);
@@ -2819,14 +2818,6 @@ public class VpnTest extends VpnTestBase {
NetworkAgent.VALIDATION_STATUS_VALID);
verify(mIkev2SessionCreator, never()).createIkeSession(
any(), any(), any(), any(), any(), any());
// Send invalid result to verify no ike session reset since the data stall suspected
// variables(timer counter and boolean) was reset.
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
verify(mIkev2SessionCreator, never()).createIkeSession(
any(), any(), any(), any(), any(), any());
}
@Test
@@ -2834,31 +2825,46 @@ public class VpnTest extends VpnTestBase {
final PlatformVpnSnapshot vpnSnapShot = verifySetupPlatformVpn(
createIkeConfig(createIkeConnectInfo(), true /* isMobikeEnabled */));
final ConnectivityDiagnosticsCallback connectivityDiagCallback =
getConnectivityDiagCallback();
int retry = 0;
doReturn(TEST_NETWORK).when(mMockNetworkAgent).getNetwork();
final DataStallReport report = createDataStallReport();
connectivityDiagCallback.onDataStallSuspected(report);
verifyMobikeTriggered(vpnSnapShot.vpn.mNetworkCapabilities.getUnderlyingNetworks());
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
verifyMobikeTriggered(vpnSnapShot.vpn.mNetworkCapabilities.getUnderlyingNetworks(),
retry++);
reset(mIkev2SessionCreator);
// Second validation status update.
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
verifyMobikeTriggered(vpnSnapShot.vpn.mNetworkCapabilities.getUnderlyingNetworks(),
retry++);
// Use real delay to verify reset session will not be performed if there is an existing
// recovery for resetting the session.
mExecutor.delayMs = TestExecutor.REAL_DELAY;
mExecutor.executeDirect = true;
// Send validation status update should result in ike session reset.
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
// Verify reset is scheduled and run.
verify(mExecutor, atLeastOnce()).schedule(any(Runnable.class), anyLong(), any());
// Verify session reset is scheduled
long expectedDelay = mTestDeps.getValidationFailRecoveryMs(retry++);
final ArgumentCaptor<Long> delayCaptor = ArgumentCaptor.forClass(Long.class);
verify(mExecutor, times(retry)).schedule(any(Runnable.class), delayCaptor.capture(),
eq(TimeUnit.MILLISECONDS));
final List<Long> delays = delayCaptor.getAllValues();
assertEquals(expectedDelay, (long) delays.get(delays.size() - 1));
// Another invalid status reported should not trigger other scheduled recovery.
reset(mExecutor);
expectedDelay = mTestDeps.getValidationFailRecoveryMs(retry++);
((Vpn.IkeV2VpnRunner) vpnSnapShot.vpn.mVpnRunner).onValidationStatus(
NetworkAgent.VALIDATION_STATUS_NOT_VALID);
verify(mExecutor, never()).schedule(any(Runnable.class), anyLong(), any());
verify(mExecutor, never()).schedule(
any(Runnable.class), eq(expectedDelay), eq(TimeUnit.MILLISECONDS));
verify(mIkev2SessionCreator, timeout(TEST_TIMEOUT_MS))
// Verify that session being reset
verify(mIkev2SessionCreator, timeout(TEST_TIMEOUT_MS + expectedDelay))
.createIkeSession(any(), any(), any(), any(), any(), any());
}
@@ -3136,6 +3142,12 @@ public class VpnTest extends VpnTestBase {
return retryCount * 1000;
}
@Override
public long getValidationFailRecoveryMs(int retryCount) {
// Simply return retryCount as the delay seconds for retrying.
return retryCount * 100L;
}
@Override
public ScheduledThreadPoolExecutor newScheduledThreadPoolExecutor() {
return mExecutor;