diff options
| -rw-r--r-- | tests/net/java/com/android/server/ConnectivityServiceTest.java | 285 |
1 files changed, 185 insertions, 100 deletions
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java index 39406a117410..52d2b63adf63 100644 --- a/tests/net/java/com/android/server/ConnectivityServiceTest.java +++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java @@ -369,6 +369,11 @@ public class ConnectivityServiceTest extends AndroidTestCase { connect(false); } + public void suspend() { + mNetworkInfo.setDetailedState(DetailedState.SUSPENDED, null, null); + mNetworkAgent.sendNetworkInfo(mNetworkInfo); + } + public void disconnect() { mNetworkInfo.setDetailedState(DetailedState.DISCONNECTED, null, null); mNetworkAgent.sendNetworkInfo(mNetworkInfo); @@ -1048,6 +1053,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { AVAILABLE, NETWORK_CAPABILITIES, LINK_PROPERTIES, + SUSPENDED, LOSING, LOST, UNAVAILABLE @@ -1061,7 +1067,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { state = s; network = n; arg = o; } public String toString() { - return String.format("%s (%s)", state, network); + return String.format("%s (%s) (%s)", state, network, arg); } @Override public boolean equals(Object o) { @@ -1099,11 +1105,26 @@ public class ConnectivityServiceTest extends AndroidTestCase { } @Override + public void onCapabilitiesChanged(Network network, NetworkCapabilities netCap) { + setLastCallback(CallbackState.NETWORK_CAPABILITIES, network, netCap); + } + + @Override + public void onLinkPropertiesChanged(Network network, LinkProperties linkProp) { + setLastCallback(CallbackState.LINK_PROPERTIES, network, linkProp); + } + + @Override public void onUnavailable() { setLastCallback(CallbackState.UNAVAILABLE, null, null); } @Override + public void onNetworkSuspended(Network network) { + setLastCallback(CallbackState.SUSPENDED, network, null); + } + + @Override public void onLosing(Network network, int maxMsToLive) { setLastCallback(CallbackState.LOSING, network, maxMsToLive /* autoboxed int */); } @@ -1126,11 +1147,12 @@ public class ConnectivityServiceTest extends AndroidTestCase { return cb; } - void expectCallback(CallbackState state, MockNetworkAgent mockAgent, int timeoutMs) { - CallbackInfo expected = new CallbackInfo( - state, (mockAgent != null) ? mockAgent.getNetwork() : null, 0); + CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent, int timeoutMs) { + final Network expectedNetwork = (agent != null) ? agent.getNetwork() : null; + CallbackInfo expected = new CallbackInfo(state, expectedNetwork, 0); CallbackInfo actual = nextCallback(timeoutMs); assertEquals("Unexpected callback:", expected, actual); + if (state == CallbackState.LOSING) { String msg = String.format( "Invalid linger time value %d, must be between %d and %d", @@ -1138,10 +1160,50 @@ public class ConnectivityServiceTest extends AndroidTestCase { int maxMsToLive = (Integer) actual.arg; assertTrue(msg, 0 <= maxMsToLive && maxMsToLive <= TEST_LINGER_DELAY_MS); } + + return actual; } - void expectCallback(CallbackState state, MockNetworkAgent mockAgent) { - expectCallback(state, mockAgent, TIMEOUT_MS); + CallbackInfo expectCallback(CallbackState state, MockNetworkAgent agent) { + return expectCallback(state, agent, TIMEOUT_MS); + } + + void expectAvailableCallbacks(MockNetworkAgent agent, boolean expectSuspended, int timeoutMs) { + expectCallback(CallbackState.AVAILABLE, agent, timeoutMs); + + final boolean HAS_DATASYNC_ON_AVAILABLE = false; + if (HAS_DATASYNC_ON_AVAILABLE) { + if (expectSuspended) { + expectCallback(CallbackState.SUSPENDED, agent, timeoutMs); + } + expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs); + expectCallback(CallbackState.LINK_PROPERTIES, agent, timeoutMs); + } + } + + void expectAvailableCallbacks(MockNetworkAgent agent) { + expectAvailableCallbacks(agent, false, TIMEOUT_MS); + } + + void expectAvailableAndSuspendedCallbacks(MockNetworkAgent agent) { + expectAvailableCallbacks(agent, true, TIMEOUT_MS); + } + + void expectAvailableAndValidatedCallbacks(MockNetworkAgent agent) { + expectAvailableCallbacks(agent, true, TIMEOUT_MS); + expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent); + } + + void expectCapabilitiesWith(int capability, MockNetworkAgent agent) { + CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent); + NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; + assertTrue(nc.hasCapability(capability)); + } + + void expectCapabilitiesWithout(int capability, MockNetworkAgent agent) { + CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent); + NetworkCapabilities nc = (NetworkCapabilities) cbi.arg; + assertFalse(nc.hasCapability(capability)); } void assertNoCallback() { @@ -1178,8 +1240,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { ConditionVariable cv = waitForConnectivityBroadcasts(1); mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(false); - genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + genericNetworkCallback.expectAvailableCallbacks(mCellNetworkAgent); + cellNetworkCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); waitFor(cv); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); @@ -1193,8 +1255,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { cv = waitForConnectivityBroadcasts(2); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - wifiNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + genericNetworkCallback.expectAvailableCallbacks(mWiFiNetworkAgent); + wifiNetworkCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); waitFor(cv); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); @@ -1217,8 +1279,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Test validated networks mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + genericNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); @@ -1230,9 +1292,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - genericNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + genericNetworkCallback.expectAvailableCallbacks(mWiFiNetworkAgent); genericNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); - wifiNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + genericNetworkCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + wifiNetworkCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); cellNetworkCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); assertNoCallbacks(genericNetworkCallback, wifiNetworkCallback, cellNetworkCallback); @@ -1268,28 +1331,32 @@ public class ConnectivityServiceTest extends AndroidTestCase { mEthernetNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED); mCellNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + callback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.connect(true); // We get AVAILABLE on wifi when wifi connects and satisfies our unmetered request. // We then get LOSING when wifi validates and cell is outscored. - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); + // TODO: Investigate sending validated before losing. callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mEthernetNetworkAgent); + callback.expectAvailableCallbacks(mEthernetNetworkAgent); + // TODO: Investigate sending validated before losing. callback.expectCallback(CallbackState.LOSING, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mEthernetNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mEthernetNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mEthernetNetworkAgent); assertEquals(mEthernetNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mEthernetNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mEthernetNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); for (int i = 0; i < 4; i++) { MockNetworkAgent oldNetwork, newNetwork; @@ -1306,7 +1373,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { callback.expectCallback(CallbackState.LOSING, oldNetwork); // TODO: should we send an AVAILABLE callback to newNetwork, to indicate that it is no // longer lingering? - defaultCallback.expectCallback(CallbackState.AVAILABLE, newNetwork); + defaultCallback.expectAvailableCallbacks(newNetwork); assertEquals(newNetwork.getNetwork(), mCm.getActiveNetwork()); } assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); @@ -1314,17 +1381,19 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Verify that if a network no longer satisfies a request, we send LOST and not LOSING, even // if the network is still up. mWiFiNetworkAgent.removeCapability(NET_CAPABILITY_NOT_METERED); + // We expect a notification about the capabilities change, and nothing else. + defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_NOT_METERED, mWiFiNetworkAgent); + defaultCallback.assertNoCallback(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); // Wifi no longer satisfies our listen, which is for an unmetered network. // But because its score is 55, it's still up (and the default network). - defaultCallback.assertNoCallback(); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Disconnect our test networks. mWiFiNetworkAgent.disconnect(); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); mCellNetworkAgent.disconnect(); defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); @@ -1340,22 +1409,22 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(false); // Score: 10 - callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + callback.expectAvailableCallbacks(mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Bring up wifi with a score of 20. // Cell stays up because it would satisfy the default request if it validated. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); // Score: 20 - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Bring up wifi with a score of 70. @@ -1363,31 +1432,33 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.adjustScore(50); mWiFiNetworkAgent.connect(false); // Score: 70 - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Tear down wifi. mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCellNetworkAgent.getNetwork(), mCm.getActiveNetwork()); // Bring up wifi, then validate it. Previous versions would immediately tear down cell, but // it's arguably correct to linger it, since it was the default network before it validated. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); + // TODO: Investigate sending validated before losing. callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork()); mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); mCellNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mCellNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); @@ -1395,13 +1466,15 @@ public class ConnectivityServiceTest extends AndroidTestCase { // If a network is lingering, and we add and remove a request from it, resume lingering. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + callback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); + // TODO: Investigate sending validated before losing. callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); NetworkRequest cellRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR).build(); @@ -1417,7 +1490,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); defaultCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); // Cell is now the default network. Pin it with a cell-specific request. noopCallback = new NetworkCallback(); // Can't reuse NetworkCallbacks. http://b/20701525 @@ -1426,8 +1499,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Now connect wifi, and expect it to become the default network. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); // The default request is lingering on cell, but nothing happens to cell, and we send no // callbacks for it, because it's kept up by cellRequest. callback.assertNoCallback(); @@ -1613,7 +1686,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.addCapability(NET_CAPABILITY_MMS); mCellNetworkAgent.connectWithoutInternet(); - networkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + networkCallback.expectAvailableCallbacks(mCellNetworkAgent); verifyActiveNetwork(TRANSPORT_WIFI); // Test releasing NetworkRequest disconnects cellular with MMS cv = mCellNetworkAgent.getDisconnectedCV(); @@ -1639,7 +1712,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { MockNetworkAgent mmsNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mmsNetworkAgent.addCapability(NET_CAPABILITY_MMS); mmsNetworkAgent.connectWithoutInternet(); - networkCallback.expectCallback(CallbackState.AVAILABLE, mmsNetworkAgent); + networkCallback.expectAvailableCallbacks(mmsNetworkAgent); verifyActiveNetwork(TRANSPORT_CELLULAR); // Test releasing MMS NetworkRequest does not disconnect main cellular NetworkAgent cv = mmsNetworkAgent.getDisconnectedCV(); @@ -1665,7 +1738,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); String firstRedirectUrl = "http://example.com/firstPath"; mWiFiNetworkAgent.connectWithCaptivePortal(firstRedirectUrl); - captivePortalCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + captivePortalCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.waitForRedirectUrl(), firstRedirectUrl); // Take down network. @@ -1678,7 +1751,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); String secondRedirectUrl = "http://example.com/secondPath"; mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); - captivePortalCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + captivePortalCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mWiFiNetworkAgent.waitForRedirectUrl(), secondRedirectUrl); // Make captive portal disappear then revalidate. @@ -1688,7 +1761,9 @@ public class ConnectivityServiceTest extends AndroidTestCase { captivePortalCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); // Expect NET_CAPABILITY_VALIDATED onAvailable callback. - validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + validatedCallback.expectAvailableCallbacks(mWiFiNetworkAgent); + // TODO: Investigate only sending available callbacks. + validatedCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); // Break network connectivity. // Expect NET_CAPABILITY_VALIDATED onLost callback. @@ -1733,7 +1808,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent.connectWithCaptivePortal(secondRedirectUrl); // Expect NET_CAPABILITY_VALIDATED onAvailable callback. - validatedCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + validatedCallback.expectAvailableCallbacks(mWiFiNetworkAgent); // But there should be no CaptivePortal callback. captivePortalCallback.assertNoCallback(); } @@ -1786,14 +1861,14 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Bring up cell and expect CALLBACK_AVAILABLE. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + defaultNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); // Bring up wifi and expect CALLBACK_AVAILABLE. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); cellNetworkCallback.assertNoCallback(); - defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultNetworkCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); // Bring down cell. Expect no default network callback, since it wasn't the default. mCellNetworkAgent.disconnect(); @@ -1803,7 +1878,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Bring up cell. Expect no default network callback, since it won't be the default. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); defaultNetworkCallback.assertNoCallback(); // Bring down wifi. Expect the default network callback to notified of LOST wifi @@ -1811,28 +1886,16 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent.disconnect(); cellNetworkCallback.assertNoCallback(); defaultNetworkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - defaultNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultNetworkCallback.expectAvailableCallbacks(mCellNetworkAgent); mCellNetworkAgent.disconnect(); cellNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); defaultNetworkCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); } - private class TestRequestUpdateCallback extends TestNetworkCallback { - @Override - public void onCapabilitiesChanged(Network network, NetworkCapabilities netCap) { - setLastCallback(CallbackState.NETWORK_CAPABILITIES, network, netCap); - } - - @Override - public void onLinkPropertiesChanged(Network network, LinkProperties linkProp) { - setLastCallback(CallbackState.LINK_PROPERTIES, network, linkProp); - } - } - @SmallTest - public void testRequestCallbackUpdates() throws Exception { + public void testAdditionalStateCallbacks() throws Exception { // File a network request for mobile. - final TestNetworkCallback cellNetworkCallback = new TestRequestUpdateCallback(); + final TestNetworkCallback cellNetworkCallback = new TestNetworkCallback(); final NetworkRequest cellRequest = new NetworkRequest.Builder() .addTransportType(TRANSPORT_CELLULAR).build(); mCm.requestNetwork(cellRequest, cellNetworkCallback); @@ -1841,10 +1904,10 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - // We should get onAvailable(). - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - // We should get onCapabilitiesChanged(), when the mobile network successfully validates. - cellNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, mCellNetworkAgent); + // We should get onAvailable(), onCapabilitiesChanged(), and + // onLinkPropertiesChanged() in rapid succession. Additionally, we + // should get onCapabilitiesChanged() when the mobile network validates. + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); // Update LinkProperties. @@ -1855,20 +1918,28 @@ public class ConnectivityServiceTest extends AndroidTestCase { cellNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); + // Suspend the network. + mCellNetworkAgent.suspend(); + cellNetworkCallback.expectCallback(CallbackState.SUSPENDED, mCellNetworkAgent); + cellNetworkCallback.assertNoCallback(); + // Register a garden variety default network request. - final TestNetworkCallback dfltNetworkCallback = new TestRequestUpdateCallback(); + final TestNetworkCallback dfltNetworkCallback = new TestNetworkCallback(); mCm.registerDefaultNetworkCallback(dfltNetworkCallback); - // Only onAvailable() is called; no other information is delivered. - dfltNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + // We should get onAvailable(), onCapabilitiesChanged(), onLinkPropertiesChanged(), + // as well as onNetworkSuspended() in rapid succession. + dfltNetworkCallback.expectAvailableAndSuspendedCallbacks(mCellNetworkAgent); dfltNetworkCallback.assertNoCallback(); // Request a NetworkCapabilities update; only the requesting callback is notified. + // TODO: Delete this together with Connectivity{Manager,Service} code. mCm.requestNetworkCapabilities(dfltNetworkCallback); dfltNetworkCallback.expectCallback(CallbackState.NETWORK_CAPABILITIES, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); dfltNetworkCallback.assertNoCallback(); // Request a LinkProperties update; only the requesting callback is notified. + // TODO: Delete this together with Connectivity{Manager,Service} code. mCm.requestLinkProperties(dfltNetworkCallback); dfltNetworkCallback.expectCallback(CallbackState.LINK_PROPERTIES, mCellNetworkAgent); cellNetworkCallback.assertNoCallback(); @@ -1911,18 +1982,20 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - callback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + callback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + fgCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); // When wifi connects, cell lingers. - callback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - fgCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + callback.expectAvailableCallbacks(mWiFiNetworkAgent); callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); + fgCallback.expectAvailableCallbacks(mWiFiNetworkAgent); fgCallback.expectCallback(CallbackState.LOSING, mCellNetworkAgent); + fgCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); @@ -1930,7 +2003,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { mService.waitForIdle(); int timeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4; fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent, timeoutMs); - callback.assertNoCallback(); + // Expect a network capabilities update sans FOREGROUND. + callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); assertFalse(isForegroundNetwork(mCellNetworkAgent)); assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); @@ -1939,9 +2013,15 @@ public class ConnectivityServiceTest extends AndroidTestCase { .addTransportType(TRANSPORT_CELLULAR).build(); final TestNetworkCallback cellCallback = new TestNetworkCallback(); mCm.requestNetwork(cellRequest, cellCallback); - cellCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - callback.assertNoCallback(); // Because the network is already up. + // NOTE: This request causes the network's capabilities to change. This + // is currently delivered before the onAvailable() callbacks. + // TODO: Fix this. + cellCallback.expectCapabilitiesWith(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); + cellCallback.expectAvailableCallbacks(mCellNetworkAgent); + fgCallback.expectAvailableCallbacks(mCellNetworkAgent); + // Expect a network capabilities update with FOREGROUND, because the most recent + // request causes its state to change. + callback.expectCapabilitiesWith(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); @@ -1949,7 +2029,8 @@ public class ConnectivityServiceTest extends AndroidTestCase { // lingering. mCm.unregisterNetworkCallback(cellCallback); fgCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - callback.assertNoCallback(); + // Expect a network capabilities update sans FOREGROUND. + callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent); assertFalse(isForegroundNetwork(mCellNetworkAgent)); assertTrue(isForegroundNetwork(mWiFiNetworkAgent)); @@ -1957,7 +2038,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent.disconnect(); callback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); fgCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); - fgCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + fgCallback.expectAvailableCallbacks(mCellNetworkAgent); assertTrue(isForegroundNetwork(mCellNetworkAgent)); mCm.unregisterNetworkCallback(callback); @@ -2098,7 +2179,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); testFactory.expectAddRequests(2); // Because the cell request changes score twice. mCellNetworkAgent.connect(true); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); testFactory.waitForNetworkRequests(2); assertFalse(testFactory.getMyStartRequested()); // Because the cell network outscores us. @@ -2189,20 +2270,22 @@ public class ConnectivityServiceTest extends AndroidTestCase { // Bring up validated cell. mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR); mCellNetworkAgent.connect(true); - cellNetworkCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + cellNetworkCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mCellNetworkAgent); Network cellNetwork = mCellNetworkAgent.getNetwork(); // Bring up validated wifi. mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); + validatedWifiCallback.expectAvailableCallbacks(mWiFiNetworkAgent); + validatedWifiCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); Network wifiNetwork = mWiFiNetworkAgent.getNetwork(); // Fail validation on wifi. mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; mCm.reportNetworkConnectivity(wifiNetwork, false); + defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); // Because avoid bad wifi is off, we don't switch to cellular. @@ -2217,18 +2300,18 @@ public class ConnectivityServiceTest extends AndroidTestCase { // that we switch back to cell. tracker.configRestrictsAvoidBadWifi = false; tracker.reevaluate(); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCm.getActiveNetwork(), cellNetwork); // Switch back to a restrictive carrier. tracker.configRestrictsAvoidBadWifi = true; tracker.reevaluate(); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mCm.getActiveNetwork(), wifiNetwork); // Simulate the user selecting "switch" on the dialog, and check that we switch to cell. mCm.setAvoidUnvalidated(wifiNetwork); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability( NET_CAPABILITY_VALIDATED)); assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability( @@ -2239,13 +2322,15 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent.disconnect(); mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(true); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); - validatedWifiCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableAndValidatedCallbacks(mWiFiNetworkAgent); + validatedWifiCallback.expectAvailableCallbacks(mWiFiNetworkAgent); + validatedWifiCallback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); wifiNetwork = mWiFiNetworkAgent.getNetwork(); // Fail validation on wifi and expect the dialog to appear. mWiFiNetworkAgent.getWrappedNetworkMonitor().gen204ProbeResult = 599; mCm.reportNetworkConnectivity(wifiNetwork, false); + defaultCallback.expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent); validatedWifiCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); // Simulate the user selecting "switch" and checking the don't ask again checkbox. @@ -2253,7 +2338,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { tracker.reevaluate(); // We now switch to cell. - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertFalse(mCm.getNetworkCapabilities(wifiNetwork).hasCapability( NET_CAPABILITY_VALIDATED)); assertTrue(mCm.getNetworkCapabilities(cellNetwork).hasCapability( @@ -2264,17 +2349,17 @@ public class ConnectivityServiceTest extends AndroidTestCase { // We switch to wifi and then to cell. Settings.Global.putString(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, null); tracker.reevaluate(); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); assertEquals(mCm.getActiveNetwork(), wifiNetwork); Settings.Global.putInt(cr, Settings.Global.NETWORK_AVOID_BAD_WIFI, 1); tracker.reevaluate(); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mCellNetworkAgent); + defaultCallback.expectAvailableCallbacks(mCellNetworkAgent); assertEquals(mCm.getActiveNetwork(), cellNetwork); // If cell goes down, we switch to wifi. mCellNetworkAgent.disconnect(); defaultCallback.expectCallback(CallbackState.LOST, mCellNetworkAgent); - defaultCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent); + defaultCallback.expectAvailableCallbacks(mWiFiNetworkAgent); validatedWifiCallback.assertNoCallback(); mCm.unregisterNetworkCallback(cellNetworkCallback); @@ -2296,7 +2381,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); - networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent, timeoutMs); + networkCallback.expectAvailableCallbacks(mWiFiNetworkAgent, false, timeoutMs); // pass timeout and validate that UNAVAILABLE is not called networkCallback.assertNoCallback(); @@ -2317,7 +2402,7 @@ public class ConnectivityServiceTest extends AndroidTestCase { mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI); mWiFiNetworkAgent.connect(false); final int assertTimeoutMs = 150; - networkCallback.expectCallback(CallbackState.AVAILABLE, mWiFiNetworkAgent, assertTimeoutMs); + networkCallback.expectAvailableCallbacks(mWiFiNetworkAgent, false, assertTimeoutMs); sleepFor(20); mWiFiNetworkAgent.disconnect(); networkCallback.expectCallback(CallbackState.LOST, mWiFiNetworkAgent); |