summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/java/com/android/server/wifi/WifiNetworkSelector.java6
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java50
2 files changed, 56 insertions, 0 deletions
diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java
index 97ef221e7..883ba9301 100644
--- a/service/java/com/android/server/wifi/WifiNetworkSelector.java
+++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java
@@ -179,6 +179,12 @@ public class WifiNetworkSelector {
return false;
}
+ // Network with no internet access reports is not qualified.
+ if (network.numNoInternetAccessReports > 0 && !network.noInternetAccessExpected) {
+ localLog("Current network has [" + network.numNoInternetAccessReports
+ + "] no-internet access reports.");
+ return false;
+ }
return true;
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
index 6fab007b7..23003c2f0 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
@@ -427,6 +427,56 @@ public class WifiNetworkSelectorTest {
}
/**
+ * New network selection is performed if the currently connected network
+ * has no internet access and the user did not explicitly choose to stay connected.
+ *
+ * WifiStateMachine is connected to a network with no internet connectivity.
+ * scanDetails contains a valid networks.
+ * Perform a network selection after the first one.
+ *
+ * Expected behavior: the first network is recommended by Network Selector
+ */
+ @Test
+ public void noInternetAccessNetworkIsNotSufficient() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G + 5};
+ int[] securities = {SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ HashSet<String> blacklist = new HashSet<String>();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // connect to test1
+ mWifiNetworkSelector.selectNetwork(scanDetails, blacklist, mWifiInfo, false, true, false);
+ when(mWifiInfo.getNetworkId()).thenReturn(0);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiInfo.is24GHz()).thenReturn(false);
+ when(mWifiInfo.is5GHz()).thenReturn(true);
+ when(mWifiInfo.getFrequency()).thenReturn(5000);
+ when(mWifiInfo.getRssi()).thenReturn(levels[0]);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ // Increment the network's no internet access reports.
+ savedConfigs[0].numNoInternetAccessReports = 5;
+
+ // Do another network selection.
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ blacklist, mWifiInfo, true, false, false);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
* Blacklisted BSSID is filtered out for network selection.
*
* WifiStateMachine is disconnected.