Merge "Fix CtsNetUtils connectTo/disconnectFromWifi"

This commit is contained in:
Treehugger Robot
2020-06-03 07:21:49 +00:00
committed by Gerrit Code Review
2 changed files with 32 additions and 9 deletions

View File

@@ -18,8 +18,11 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.net.cts.api23test"> package="android.net.cts.api23test">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.INTERNET" />
<application android:usesCleartextTraffic="true"> <application android:usesCleartextTraffic="true">

View File

@@ -30,8 +30,8 @@ import static org.junit.Assert.fail;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -44,6 +44,8 @@ import android.net.NetworkInfo;
import android.net.NetworkInfo.State; import android.net.NetworkInfo.State;
import android.net.NetworkRequest; import android.net.NetworkRequest;
import android.net.TestNetworkManager; import android.net.TestNetworkManager;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Binder; import android.os.Binder;
import android.os.Build; import android.os.Build;
@@ -169,6 +171,7 @@ public final class CtsNetUtils {
boolean connected = false; boolean connected = false;
try { try {
clearWifiBlacklist();
SystemUtil.runShellCommand("svc wifi enable"); SystemUtil.runShellCommand("svc wifi enable");
SystemUtil.runWithShellPermissionIdentity(() -> mWifiManager.reconnect(), SystemUtil.runWithShellPermissionIdentity(() -> mWifiManager.reconnect(),
NETWORK_SETTINGS); NETWORK_SETTINGS);
@@ -188,11 +191,23 @@ public final class CtsNetUtils {
return wifiNetwork; return wifiNetwork;
} }
/**
* Re-enable wifi networks that were blacklisted, typically because no internet connection was
* detected the last time they were connected. This is necessary to make sure wifi can reconnect
* to them.
*/
private void clearWifiBlacklist() {
SystemUtil.runWithShellPermissionIdentity(() -> {
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
mWifiManager.enableNetwork(config.networkId, false /* attemptConnect */);
}
});
}
/** Disable WiFi and wait for it to become disconnected from the network. */ /** Disable WiFi and wait for it to become disconnected from the network. */
public void disconnectFromWifi(Network wifiNetworkToCheck) { public void disconnectFromWifi(Network wifiNetworkToCheck) {
final TestNetworkCallback callback = new TestNetworkCallback(); final TestNetworkCallback callback = new TestNetworkCallback();
mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback); mCm.registerNetworkCallback(makeWifiNetworkRequest(), callback);
Network lostWifiNetwork = null;
ConnectivityActionReceiver receiver = new ConnectivityActionReceiver( ConnectivityActionReceiver receiver = new ConnectivityActionReceiver(
mCm, ConnectivityManager.TYPE_WIFI, NetworkInfo.State.DISCONNECTED); mCm, ConnectivityManager.TYPE_WIFI, NetworkInfo.State.DISCONNECTED);
@@ -200,9 +215,15 @@ public final class CtsNetUtils {
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
mContext.registerReceiver(receiver, filter); mContext.registerReceiver(receiver, filter);
final WifiInfo wifiInfo = mWifiManager.getConnectionInfo();
final boolean wasWifiConnected = wifiInfo != null && wifiInfo.getNetworkId() != -1;
// Assert that we can establish a TCP connection on wifi. // Assert that we can establish a TCP connection on wifi.
Socket wifiBoundSocket = null; Socket wifiBoundSocket = null;
if (wifiNetworkToCheck != null) { if (wifiNetworkToCheck != null) {
assertTrue("Cannot check network " + wifiNetworkToCheck + ": wifi is not connected",
wasWifiConnected);
final NetworkCapabilities nc = mCm.getNetworkCapabilities(wifiNetworkToCheck);
assertNotNull("Network " + wifiNetworkToCheck + " is not connected", nc);
try { try {
wifiBoundSocket = getBoundSocket(wifiNetworkToCheck, TEST_HOST, HTTP_PORT); wifiBoundSocket = getBoundSocket(wifiNetworkToCheck, TEST_HOST, HTTP_PORT);
testHttpRequest(wifiBoundSocket); testHttpRequest(wifiBoundSocket);
@@ -211,13 +232,14 @@ public final class CtsNetUtils {
} }
} }
boolean disconnected = false;
try { try {
SystemUtil.runShellCommand("svc wifi disable"); SystemUtil.runShellCommand("svc wifi disable");
// Ensure we get both an onLost callback and a CONNECTIVITY_ACTION. if (wasWifiConnected) {
lostWifiNetwork = callback.waitForLost(); // Ensure we get both an onLost callback and a CONNECTIVITY_ACTION.
assertNotNull(lostWifiNetwork); assertNotNull("Did not receive onLost callback after disabling wifi",
disconnected = receiver.waitForState(); callback.waitForLost());
assertTrue("Wifi failed to reach DISCONNECTED state.", receiver.waitForState());
}
} catch (InterruptedException ex) { } catch (InterruptedException ex) {
fail("disconnectFromWifi was interrupted"); fail("disconnectFromWifi was interrupted");
} finally { } finally {
@@ -225,8 +247,6 @@ public final class CtsNetUtils {
mContext.unregisterReceiver(receiver); mContext.unregisterReceiver(receiver);
} }
assertTrue("Wifi failed to reach DISCONNECTED state.", disconnected);
// Check that the socket is closed when wifi disconnects. // Check that the socket is closed when wifi disconnects.
if (wifiBoundSocket != null) { if (wifiBoundSocket != null) {
try { try {