summaryrefslogtreecommitdiffstats
path: root/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java361
1 files changed, 359 insertions, 2 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
index 1726e7d32..c97618d6a 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
@@ -23,9 +23,12 @@ import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConf
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+import org.mockito.AdditionalAnswers;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.validateMockitoUsage;
@@ -41,11 +44,14 @@ import android.net.wifi.WifiEnterpriseConfig;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiSsid;
import android.os.SystemClock;
+import android.os.UserManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.LocalLog;
+import com.android.server.wifi.NetworkUpdateResult;
import com.android.internal.R;
import com.android.server.wifi.MockAnswerUtil.AnswerWithArguments;
+import com.android.server.wifi.util.ScanDetailUtil;
import org.junit.After;
import org.junit.Before;
@@ -79,6 +85,31 @@ public class WifiQualifiedNetworkSelectorTest {
mWifiQualifiedNetworkSelector.setUserPreferredBand(1);
mWifiQualifiedNetworkSelector.setWifiNetworkScoreCache(mScoreCache);
when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime());
+
+ //setup Carrier Networks
+ int eapType = 4;
+
+ WifiConfiguration wifiConfig = new WifiConfiguration();
+ wifiConfig.SSID = "\"TEST1\"";
+ wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+ wifiConfig.enterpriseConfig = new WifiEnterpriseConfig();
+ wifiConfig.enterpriseConfig.setEapMethod(eapType);
+ mCarrierConfiguredNetworks.add(wifiConfig);
+
+ WifiConfiguration wifiConfig1 = new WifiConfiguration();
+ wifiConfig1.SSID = "\"TEST2\"";
+ wifiConfig1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+ wifiConfig1.enterpriseConfig = new WifiEnterpriseConfig();
+ wifiConfig1.enterpriseConfig.setEapMethod(eapType);
+ mCarrierConfiguredNetworks.add(wifiConfig1);
+
+ WifiConfiguration wifiConfig2 = new WifiConfiguration();
+ wifiConfig2.SSID = "\"TEST3\"";
+ wifiConfig2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
+ wifiConfig2.enterpriseConfig = new WifiEnterpriseConfig();
+ wifiConfig2.enterpriseConfig.setEapMethod(eapType);
+ mCarrierConfiguredNetworks.add(wifiConfig2);
+ mWifiQualifiedNetworkSelector.setCarrierConfiguredNetworks(mCarrierConfiguredNetworks);
}
@After
@@ -98,6 +129,7 @@ public class WifiQualifiedNetworkSelectorTest {
private static final String[] DEFAULT_SSIDS = {"\"test1\"", "\"test2\""};
private static final String[] DEFAULT_BSSIDS = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
private static final String TAG = "QNS Unit Test";
+ List<WifiConfiguration> mCarrierConfiguredNetworks = new ArrayList<WifiConfiguration>();
private List<ScanDetail> getScanDetails(String[] ssids, String[] bssids, int[] frequencies,
String[] caps, int[] levels) {
@@ -1070,6 +1102,10 @@ public class WifiQualifiedNetworkSelectorTest {
//first QNS
mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false,
false, true, false);
+ when(mWifiInfo.getNetworkId()).thenReturn(1);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
+ when(mWifiInfo.is24GHz()).thenReturn(false);
+ when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true);
//immediately second QNS
WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(true,
false, scanDetails, false, true, false, false);
@@ -1879,10 +1915,12 @@ public class WifiQualifiedNetworkSelectorTest {
// The second scan result is for an ephemeral network which was previously deleted
when(mWifiConfigManager
- .wasEphemeralNetworkDeleted(scanDetails.get(0).getScanResult().SSID))
+ .wasEphemeralNetworkDeleted(ScanDetailUtil.createQuotedSSID(
+ scanDetails.get(0).getScanResult().SSID)))
.thenReturn(false);
when(mWifiConfigManager
- .wasEphemeralNetworkDeleted(scanDetails.get(1).getScanResult().SSID))
+ .wasEphemeralNetworkDeleted(ScanDetailUtil.createQuotedSSID(
+ scanDetails.get(1).getScanResult().SSID)))
.thenReturn(true);
WifiConfiguration.NetworkSelectionStatus selectionStatus =
@@ -2325,4 +2363,323 @@ public class WifiQualifiedNetworkSelectorTest {
false, scanDetails, false, true, false, false);
verifySelectedResult(chosenScanResult, candidate);
}
+
+ /**
+ * Case #48 no new QNS if current network doesn't show up in the
+ * scan results.
+ *
+ * In this test. we simulate following scenario:
+ * WifiStateMachine is under connected state and 2.4GHz test1 is connected.
+ * The second scan results contains test2 which is 5GHz but no test1. Skip
+ * QNS to avoid aggressive network switching.
+ *
+ * expected return null
+ */
+ @Test
+ public void noNewQNSCurrentNetworkNotInScanResults() {
+ //Prepare saved network configurations.
+ String[] ssidsConfig = DEFAULT_SSIDS;
+ int[] security = {SECURITY_PSK, SECURITY_PSK};
+ WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssidsConfig, security);
+ prepareConfigStore(savedConfigs);
+ final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs);
+ when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork);
+
+ //Prepare the first scan results.
+ String[] ssids = {DEFAULT_SSIDS[0]};
+ String[] bssids = {DEFAULT_BSSIDS[0]};
+ int[] frequencies = {2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {-78};
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ scanResultLinkConfiguration(savedConfigs, scanDetails);
+
+ //Connect to test1.
+ mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false,
+ false, true, false);
+
+ when(mWifiInfo.getNetworkId()).thenReturn(1);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiInfo.is24GHz()).thenReturn(true);
+ mWifiQualifiedNetworkSelector.setWifiNetworkScoreCache(null);
+ when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true);
+ when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
+
+ //Prepare the second scan results which doesn't contain test1.
+ ssids[0] = DEFAULT_SSIDS[1];
+ bssids[0] = DEFAULT_BSSIDS[1];
+ frequencies[0] = 5180;
+ caps[0] = "[WPA2-EAP-CCMP][ESS]";
+ levels[0] = WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND;
+ scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ scanResultLinkConfiguration(savedConfigs, scanDetails);
+
+ //Skip the second network selection since current connected network is
+ //missing from the scan results.
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ false, scanDetails, false, true, false, false);
+ assertEquals("Expect no network selection", null, candidate);
+ }
+
+ boolean compareCarrierConfigs(WifiConfiguration candidate, WifiConfiguration carrierConfig) {
+ if (!candidate.SSID.equals(carrierConfig.SSID)) {
+ return false;
+ }
+ if (!candidate.ephemeral || carrierConfig.ephemeral) {
+ return false;
+ }
+ if (!candidate.isCarrierNetwork || carrierConfig.isCarrierNetwork) {
+ return false;
+ }
+ if (candidate.enterpriseConfig.getEapMethod() !=
+ carrierConfig.enterpriseConfig.getEapMethod()) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Case #49 Between two 2G Carrier networks, choose the one with stronger RSSI value
+ * if other conditions are the same and the RSSI values are not staturated.
+ */
+ @Test
+ public void chooseStrongerRssi2GCarrierNetwork() {
+
+ String[] ssids = {"TEST1", "TEST2"};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] frequencies = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {-65,-55};
+ int[] security = {SECURITY_PSK, SECURITY_PSK};
+
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class),
+ any(Boolean.class))).thenReturn(null);
+ when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class),
+ any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg());
+ when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class)))
+ .thenReturn(chosenScanResult);
+ when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true);
+
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ false, scanDetails, false, false, true, false);
+ assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(1)));
+ }
+
+
+ /**
+ * Case #50 Choose 5G over 2G.
+ */
+ @Test
+ public void choose5GNetworkOver2GNetwork() {
+
+ String[] ssids = {"TEST1", "TEST2"};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] frequencies = {2437, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {-65,-55};
+
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class),
+ any(Boolean.class))).thenReturn(null);
+ when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class),
+ any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg());
+ when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class)))
+ .thenReturn(chosenScanResult);
+ when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true);
+
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ false, scanDetails, false, false, true, false);
+ assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(1)));
+ }
+
+ /**
+ * Case #51 Stay on same BSSID & SSID.
+ */
+ @Test
+ public void chooseSameNetwork() {
+
+ String[] ssids = {"TEST1", "TEST2"};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] frequencies = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {-65,-55};
+ int[] security = {SECURITY_PSK, SECURITY_PSK};
+
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
+ prepareConfigStore(savedConfigs);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class),
+ any(Boolean.class))).thenReturn(null);
+ when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class),
+ any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg());
+ when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class)))
+ .thenReturn(chosenScanResult);
+ when(mWifiInfo.getNetworkId()).thenReturn(0);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true);
+
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ false, scanDetails, false, true, false, false);
+
+ assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(0)));
+ }
+
+ /**
+ * Case #52 Test condition where no Carrier networks are defined.
+ */
+ @Test
+ public void testNoCarrierNetworks() {
+
+ String[] ssids = {"TEST1", "TEST2"};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] frequencies = {5200, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ // test2 has slightly stronger RSSI value than test1
+ int[] levels = {-65,-53};
+
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+
+ List<WifiConfiguration> nullCarrierConfiguredNetworks = new ArrayList<WifiConfiguration>();
+ mWifiQualifiedNetworkSelector.setCarrierConfiguredNetworks(nullCarrierConfiguredNetworks);
+ when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true);
+
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ true, scanDetails, false, false, true, false);
+ assertEquals("Expect no network selection", null, candidate);
+ }
+
+ /**
+ * Case #53 Test condition where no Carrier networks are defined.
+ */
+ @Test
+ public void testParseCarrierInfoSuccess() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4";
+ wifiArray[1] = "R29vZ2xlLUE=|2|4";
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4";
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right number of etnries", configList.size(), 3);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\"");
+ assertEquals("Expect right network", configList.get(1).SSID, "\"Google-A\"");
+ assertEquals("Expect right network", configList.get(2).SSID, "\"Google-Guest\"");
+ assertTrue("Expect right key",
+ configList.get(0).allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
+ assertEquals("Expect right EAP method",
+ configList.get(0).enterpriseConfig.getEapMethod(), 4);
+ }
+
+ /**
+ * Case #54 Test condition where string has non-numerics.
+ */
+ @Test
+ public void testParseCarrierInfoBadEntries1() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4";
+ wifiArray[1] = "R29vZ2xlLUE=|2|A"; //Invalid entry. Non-numeric.
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4";
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right number of etnries", configList.size(), 2);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\"");
+ assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\"");
+ }
+
+ /**
+ * Case #55 Test condition where the config does not have the right number of entries.
+ */
+ @Test
+ public void testParseCarrierInfoBadEntries2() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2"; //Invalid number of entries
+ wifiArray[1] = "R29vZ2xlLUE=|2|4";
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4";
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Google-A\"");
+ assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\"");
+ }
+
+ /**
+ * Case #56 Test invalid base-64.
+ */
+ @Test
+ public void testParseCarrierInfoBadBase64() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4";
+ wifiArray[1] = "xyz==|2|4"; //Invalid base64
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4";
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\"");
+ assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\"");
+ }
+
+ /**
+ * Case #56 Test invalid eap-method
+ */
+ @Test
+ public void testParseCarrierInfoBadEapMethod() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4";
+ wifiArray[1] = "R29vZ2xlLUE=|2|4";
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|11"; //Invalid eap-method
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\"");
+ assertEquals("Expect right network", configList.get(1).SSID, "\"Google-A\"");
+ }
+
+ /**
+ * Case #56 Test invalid key
+ */
+ @Test
+ public void testParseCarrierInfoBadKey() {
+ String[] wifiArray = new String[3];
+ wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4";
+ wifiArray[1] = "R29vZ2xlLUE=|9|4"; //Invalid key
+ wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4";
+
+ List<WifiConfiguration> configList =
+ mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray);
+ assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\"");
+ assertEquals("Expect right network", configList.get(2).SSID, "\"Google-Guest\"");
+ }
+
+ /**
+ * Case #57 Test condition where no Carrier networks are defined.
+ */
+ @Test
+ public void testCarrierNotEnabledByUser() {
+
+ String[] ssids = {"TEST1", "TEST2"};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] frequencies = {2437, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {-65,-55};
+
+ List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class),
+ any(Boolean.class))).thenReturn(null);
+ when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class),
+ any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg());
+ when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class)))
+ .thenReturn(chosenScanResult);
+ when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(false);
+
+ WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
+ false, scanDetails, false, false, true, false);
+ assertEquals("Expect no network selection", null, candidate);
+ }
}