Merge "ConnectivityServiceTest: fix flaky tests" am: ee4f8f30eb am: 96a8a237b0
am: 1adc6c2054
Change-Id: Iaa1ab50a323133cadfa4f39440fce982cde8d1fe
This commit is contained in:
@@ -1112,7 +1112,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
// Chosen to be much less than the linger timeout. This ensures that we can distinguish
|
// Chosen to be much less than the linger timeout. This ensures that we can distinguish
|
||||||
// between a LOST callback that arrives immediately and a LOST callback that arrives after
|
// between a LOST callback that arrives immediately and a LOST callback that arrives after
|
||||||
// the linger timeout.
|
// the linger timeout.
|
||||||
private final static int TIMEOUT_MS = 50;
|
private final static int TIMEOUT_MS = 100;
|
||||||
|
|
||||||
private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>();
|
private final LinkedBlockingQueue<CallbackInfo> mCallbacks = new LinkedBlockingQueue<>();
|
||||||
|
|
||||||
@@ -1464,8 +1464,8 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
// Let linger run its course.
|
// Let linger run its course.
|
||||||
callback.assertNoCallback();
|
callback.assertNoCallback();
|
||||||
callback.expectCallback(CallbackState.LOST, mCellNetworkAgent,
|
final int lingerTimeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4;
|
||||||
TEST_LINGER_DELAY_MS /* timeoutMs */);
|
callback.expectCallback(CallbackState.LOST, mCellNetworkAgent, lingerTimeoutMs);
|
||||||
|
|
||||||
// Clean up.
|
// Clean up.
|
||||||
mWiFiNetworkAgent.disconnect();
|
mWiFiNetworkAgent.disconnect();
|
||||||
@@ -1954,7 +1954,9 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
assertTrue(isForegroundNetwork(mWiFiNetworkAgent));
|
assertTrue(isForegroundNetwork(mWiFiNetworkAgent));
|
||||||
|
|
||||||
// When lingering is complete, cell is still there but is now in the background.
|
// When lingering is complete, cell is still there but is now in the background.
|
||||||
fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, TEST_LINGER_DELAY_MS);
|
mService.waitForIdle();
|
||||||
|
int timeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4;
|
||||||
|
fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, timeoutMs);
|
||||||
callback.assertNoCallback();
|
callback.assertNoCallback();
|
||||||
assertFalse(isForegroundNetwork(mCellNetworkAgent));
|
assertFalse(isForegroundNetwork(mCellNetworkAgent));
|
||||||
assertTrue(isForegroundNetwork(mWiFiNetworkAgent));
|
assertTrue(isForegroundNetwork(mWiFiNetworkAgent));
|
||||||
@@ -1980,6 +1982,7 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
|
|
||||||
// Disconnect wifi and check that cell is foreground again.
|
// Disconnect wifi and check that cell is foreground again.
|
||||||
mWiFiNetworkAgent.disconnect();
|
mWiFiNetworkAgent.disconnect();
|
||||||
|
mService.waitForIdle();
|
||||||
callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
|
fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent);
|
||||||
@@ -2316,14 +2319,14 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||||
NetworkCapabilities.TRANSPORT_WIFI).build();
|
NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||||
mCm.requestNetwork(nr, networkCallback, 10);
|
final int timeoutMs = 150;
|
||||||
|
mCm.requestNetwork(nr, networkCallback, timeoutMs);
|
||||||
|
|
||||||
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
||||||
mWiFiNetworkAgent.connect(false);
|
mWiFiNetworkAgent.connect(false);
|
||||||
networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
|
networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent, timeoutMs);
|
||||||
|
|
||||||
// pass timeout and validate that UNAVAILABLE is not called
|
// pass timeout and validate that UNAVAILABLE is not called
|
||||||
sleepFor(15);
|
|
||||||
networkCallback.assertNoCallback();
|
networkCallback.assertNoCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2336,17 +2339,19 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||||
NetworkCapabilities.TRANSPORT_WIFI).build();
|
NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||||
mCm.requestNetwork(nr, networkCallback, 500);
|
final int requestTimeoutMs = 100;
|
||||||
|
mCm.requestNetwork(nr, networkCallback, requestTimeoutMs);
|
||||||
|
|
||||||
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
||||||
mWiFiNetworkAgent.connect(false);
|
mWiFiNetworkAgent.connect(false);
|
||||||
networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent);
|
final int assertTimeoutMs = 150;
|
||||||
|
networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent, assertTimeoutMs);
|
||||||
sleepFor(20);
|
sleepFor(20);
|
||||||
mWiFiNetworkAgent.disconnect();
|
mWiFiNetworkAgent.disconnect();
|
||||||
networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent);
|
||||||
|
|
||||||
// pass timeout and validate that UNAVAILABLE is not called
|
// pass timeout and validate that UNAVAILABLE is not called
|
||||||
sleepFor(600);
|
sleepFor(100);
|
||||||
networkCallback.assertNoCallback();
|
networkCallback.assertNoCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2360,7 +2365,8 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||||
NetworkCapabilities.TRANSPORT_WIFI).build();
|
NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||||
mCm.requestNetwork(nr, networkCallback, 10);
|
final int timeoutMs = 10;
|
||||||
|
mCm.requestNetwork(nr, networkCallback, timeoutMs);
|
||||||
|
|
||||||
// pass timeout and validate that UNAVAILABLE is called
|
// pass timeout and validate that UNAVAILABLE is called
|
||||||
networkCallback.expectCallback(CallbackState.UNAVAILABLE, null);
|
networkCallback.expectCallback(CallbackState.UNAVAILABLE, null);
|
||||||
@@ -2380,7 +2386,8 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
NetworkRequest nr = new NetworkRequest.Builder().addTransportType(
|
||||||
NetworkCapabilities.TRANSPORT_WIFI).build();
|
NetworkCapabilities.TRANSPORT_WIFI).build();
|
||||||
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
final TestNetworkCallback networkCallback = new TestNetworkCallback();
|
||||||
mCm.requestNetwork(nr, networkCallback, 10);
|
final int timeoutMs = 10;
|
||||||
|
mCm.requestNetwork(nr, networkCallback, timeoutMs);
|
||||||
|
|
||||||
// remove request
|
// remove request
|
||||||
mCm.unregisterNetworkCallback(networkCallback);
|
mCm.unregisterNetworkCallback(networkCallback);
|
||||||
@@ -2397,13 +2404,13 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
networkCallback.assertNoCallback();
|
networkCallback.assertNoCallback();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void assertEventuallyTrue(BooleanSupplier fn, long maxWaitingTimeMs) throws Exception {
|
public void assertEventuallyTrue(BooleanSupplier fn, long maxWaitingTimeMs) {
|
||||||
long start = SystemClock.elapsedRealtime();
|
long start = SystemClock.elapsedRealtime();
|
||||||
while (SystemClock.elapsedRealtime() <= start + maxWaitingTimeMs) {
|
while (SystemClock.elapsedRealtime() <= start + maxWaitingTimeMs) {
|
||||||
if (fn.getAsBoolean()) {
|
if (fn.getAsBoolean()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Thread.sleep(10);
|
sleepFor(15);
|
||||||
}
|
}
|
||||||
assertTrue(fn.getAsBoolean());
|
assertTrue(fn.getAsBoolean());
|
||||||
}
|
}
|
||||||
@@ -2571,7 +2578,9 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK);
|
callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK);
|
||||||
|
|
||||||
// ... and that stopping it after that has no adverse effects.
|
// ... and that stopping it after that has no adverse effects.
|
||||||
assertNull(mCm.getNetworkCapabilities(myNet));
|
// TODO: investigate assertEventuallyTrue is needed and waitForIdle() is not enough
|
||||||
|
final Network myNetAlias = myNet;
|
||||||
|
assertEventuallyTrue(() -> mCm.getNetworkCapabilities(myNetAlias) == null, 100);
|
||||||
ka.stop();
|
ka.stop();
|
||||||
|
|
||||||
// Reconnect.
|
// Reconnect.
|
||||||
@@ -2815,11 +2824,11 @@ public class ConnectivityServiceTest extends AndroidTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* test utilities */
|
/* test utilities */
|
||||||
|
// TODO: eliminate all usages of sleepFor and replace by proper timeouts/waitForIdle.
|
||||||
static private void sleepFor(int ms) {
|
static private void sleepFor(int ms) {
|
||||||
try {
|
try {
|
||||||
Thread.sleep(ms);
|
Thread.sleep(ms);
|
||||||
} catch (InterruptedException e) {
|
} catch (InterruptedException e) {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user