Merge "ConnectivityServiceTest: fix flaky tests" am: ee4f8f30eb am: 96a8a237b0

am: 1adc6c2054

Change-Id: Iaa1ab50a323133cadfa4f39440fce982cde8d1fe
This commit is contained in:
Lorenzo Colitti
2017-01-27 10:00:06 +00:00
committed by android-build-merger

View File

@@ -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) {
} }
} }
} }