Merge "Toggle wifi when running CaptivePortalTest"

This commit is contained in:
Treehugger Robot
2020-06-16 00:43:07 +00:00
committed by Gerrit Code Review
2 changed files with 83 additions and 15 deletions

View File

@@ -41,6 +41,7 @@ import android.text.TextUtils
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
import androidx.test.runner.AndroidJUnit4
import com.android.compatibility.common.util.SystemUtil
import com.android.testutils.isDevSdkInRange
import fi.iki.elonen.NanoHTTPD
import fi.iki.elonen.NanoHTTPD.Response.IStatus
import fi.iki.elonen.NanoHTTPD.Response.Status
@@ -105,6 +106,9 @@ class CaptivePortalTest {
@After
fun tearDown() {
clearTestUrls()
if (pm.hasSystemFeature(FEATURE_WIFI)) {
reconnectWifi()
}
server.stop()
}
@@ -167,7 +171,7 @@ class CaptivePortalTest {
assertNotEquals(network, cm.activeNetwork, wifiDefaultMessage)
val startPortalAppPermission =
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.Q) CONNECTIVITY_INTERNAL
if (isDevSdkInRange(0, Build.VERSION_CODES.Q)) CONNECTIVITY_INTERNAL
else NETWORK_SETTINGS
doAsShell(startPortalAppPermission) { cm.startCaptivePortalApp(network) }
assertTrue(portalContentRequestCv.block(TEST_TIMEOUT_MS), "The captive portal login " +
@@ -180,9 +184,6 @@ class CaptivePortalTest {
// disconnectFromCell should be called after connectToCell
utils.disconnectFromCell()
}
clearTestUrls()
reconnectWifi()
}
private fun setHttpsUrl(url: String?) = setConfig(TEST_CAPTIVE_PORTAL_HTTPS_URL_SETTING, url)
@@ -203,10 +204,8 @@ class CaptivePortalTest {
}
private fun reconnectWifi() {
doAsShell(NETWORK_SETTINGS) {
assertTrue(wm.disconnect())
assertTrue(wm.reconnect())
}
utils.ensureWifiDisconnected(null /* wifiNetworkToCheck */)
utils.ensureWifiConnected()
}
/**

View File

@@ -157,8 +157,36 @@ public final class CtsNetUtils {
}
}
/** Enable WiFi and wait for it to become connected to a network. */
/**
* Enable WiFi and wait for it to become connected to a network.
*
* This method expects to receive a legacy broadcast on connect, which may not be sent if the
* network does not become default or if it is not the first network.
*/
public Network connectToWifi() {
return connectToWifi(true /* expectLegacyBroadcast */);
}
/**
* Enable WiFi and wait for it to become connected to a network.
*
* A network is considered connected when a {@link NetworkCallback#onAvailable(Network)}
* callback is received.
*/
public Network ensureWifiConnected() {
return connectToWifi(false /* expectLegacyBroadcast */);
}
/**
* Enable WiFi and wait for it to become connected to a network.
*
* @param expectLegacyBroadcast Whether to check for a legacy CONNECTIVITY_ACTION connected
* broadcast. The broadcast is typically not sent if the network
* does not become the default network, and is not the first
* network to appear.
* @return The network that was newly connected.
*/
private Network connectToWifi(boolean expectLegacyBroadcast) {
final TestNetworkCallback callback = new TestNetworkCallback();
mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
Network wifiNetwork = null;
@@ -170,15 +198,16 @@ public final class CtsNetUtils {
mContext.registerReceiver(receiver, filter);
boolean connected = false;
final String err = "Wifi must be configured to connect to an access point for this test.";
try {
clearWifiBlacklist();
SystemUtil.runShellCommand("svc wifi enable");
SystemUtil.runWithShellPermissionIdentity(() -> mWifiManager.reconnect(),
NETWORK_SETTINGS);
// Ensure we get both an onAvailable callback and a CONNECTIVITY_ACTION.
// Ensure we get an onAvailable callback and possibly a CONNECTIVITY_ACTION.
wifiNetwork = callback.waitForAvailable();
assertNotNull(wifiNetwork);
connected = receiver.waitForState();
assertNotNull(err, wifiNetwork);
connected = !expectLegacyBroadcast || receiver.waitForState();
} catch (InterruptedException ex) {
fail("connectToWifi was interrupted");
} finally {
@@ -186,8 +215,7 @@ public final class CtsNetUtils {
mContext.unregisterReceiver(receiver);
}
assertTrue("Wifi must be configured to connect to an access point for this test.",
connected);
assertTrue(err, connected);
return wifiNetwork;
}
@@ -204,8 +232,47 @@ public final class CtsNetUtils {
});
}
/** Disable WiFi and wait for it to become disconnected from the network. */
/**
* Disable WiFi and wait for it to become disconnected from the network.
*
* This method expects to receive a legacy broadcast on disconnect, which may not be sent if the
* network was not default, or was not the first network.
*
* @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
* is expected to be able to establish a TCP connection to a remote
* server before disconnecting, and to have that connection closed in
* the process.
*/
public void disconnectFromWifi(Network wifiNetworkToCheck) {
disconnectFromWifi(wifiNetworkToCheck, true /* expectLegacyBroadcast */);
}
/**
* Disable WiFi and wait for it to become disconnected from the network.
*
* @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
* is expected to be able to establish a TCP connection to a remote
* server before disconnecting, and to have that connection closed in
* the process.
*/
public void ensureWifiDisconnected(Network wifiNetworkToCheck) {
disconnectFromWifi(wifiNetworkToCheck, false /* expectLegacyBroadcast */);
}
/**
* Disable WiFi and wait for it to become disconnected from the network.
*
* @param wifiNetworkToCheck If non-null, a network that should be disconnected. This network
* is expected to be able to establish a TCP connection to a remote
* server before disconnecting, and to have that connection closed in
* the process.
* @param expectLegacyBroadcast Whether to check for a legacy CONNECTIVITY_ACTION disconnected
* broadcast. The broadcast is typically not sent if the network
* was not the default network and not the first network to appear.
* The check will always be skipped if the device was not connected
* to wifi in the first place.
*/
private void disconnectFromWifi(Network wifiNetworkToCheck, boolean expectLegacyBroadcast) {
final TestNetworkCallback callback = new TestNetworkCallback();
mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
@@ -238,6 +305,8 @@ public final class CtsNetUtils {
// Ensure we get both an onLost callback and a CONNECTIVITY_ACTION.
assertNotNull("Did not receive onLost callback after disabling wifi",
callback.waitForLost());
}
if (wasWifiConnected && expectLegacyBroadcast) {
assertTrue("Wifi failed to reach DISCONNECTED state.", receiver.waitForState());
}
} catch (InterruptedException ex) {