diff options
-rw-r--r-- | service/java/com/android/server/wifi/WifiNetworkSelector.java | 6 | ||||
-rw-r--r-- | tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java | 50 |
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. |