summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorRandy Pan <zpan@google.com>2016-09-27 21:49:38 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2016-09-27 21:49:38 +0000
commit8ef24fce3bac0c107324d6f8592a1215772ab397 (patch)
tree038c66834e693f2782527042b84f3992c2886e3e /tests
parente1103ae70435f0aac61d167aeada6f1862d5b907 (diff)
parent57c8c1165d5ea5c10cd96ea51652c11db7635302 (diff)
Merge changes from topic 'WifiNetworkSelector'
* changes: Unit tests for ExternalScoreEvaluator Unit tests for SavedNetworkEvaluator WifiNetworkSelector unit tests. WCM: unit tests Wifi Network Selector
Diffstat (limited to 'tests')
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java419
-rw-r--r--tests/wifitests/src/com/android/server/wifi/SavedNetworkEvaluatorTest.java323
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java32
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java491
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java367
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java2299
6 files changed, 1616 insertions, 2315 deletions
diff --git a/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java b/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
new file mode 100644
index 000000000..16bd4f8d8
--- /dev/null
+++ b/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
@@ -0,0 +1,419 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import android.app.test.MockAnswerUtil.AnswerWithArguments;
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.INetworkScoreCache;
+import android.net.NetworkScoreManager;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.os.SystemClock;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.internal.R;
+import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * Unit tests for {@link com.android.server.wifi.ExternalScoreEvaluator}.
+ */
+@SmallTest
+public class ExternalScoreEvaluatorTest {
+
+ /** Sets up test. */
+ @Before
+ public void setUp() throws Exception {
+ mResource = getResource();
+ mScoreManager = getScoreManager();
+ mContext = getContext();
+ mWifiConfigManager = getWifiConfigManager();
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
+
+ mThresholdQualifiedRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz);
+ mThresholdQualifiedRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz);
+
+ mExternalScoreEvaluator = new ExternalScoreEvaluator(mContext, mWifiConfigManager,
+ mClock, null);
+ }
+
+ /** Cleans up test. */
+ @After
+ public void cleanup() {
+ validateMockitoUsage();
+ }
+
+ private ExternalScoreEvaluator mExternalScoreEvaluator;
+ private WifiConfigManager mWifiConfigManager;
+ private Context mContext;
+ private Resources mResource;
+ private NetworkScoreManager mScoreManager;
+ private WifiNetworkScoreCache mScoreCache;
+ private Clock mClock = mock(Clock.class);
+ private int mThresholdQualifiedRssi2G;
+ private int mThresholdQualifiedRssi5G;
+ private static final String TAG = "External Score Evaluator Unit Test";
+
+ NetworkScoreManager getScoreManager() {
+ NetworkScoreManager scoreManager = mock(NetworkScoreManager.class);
+
+ doAnswer(new AnswerWithArguments() {
+ public void answer(int networkType, INetworkScoreCache scoreCache) {
+ mScoreCache = (WifiNetworkScoreCache) scoreCache;
+ }}).when(scoreManager).registerNetworkScoreCache(anyInt(), anyObject());
+
+ return scoreManager;
+ }
+
+ Context getContext() {
+ Context context = mock(Context.class);
+
+ when(context.getResources()).thenReturn(mResource);
+ when(context.getSystemService(Context.NETWORK_SCORE_SERVICE)).thenReturn(mScoreManager);
+
+ return context;
+ }
+
+ Resources getResource() {
+ Resources resource = mock(Resources.class);
+
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz))
+ .thenReturn(-70);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz))
+ .thenReturn(-73);
+
+ return resource;
+ }
+
+ WifiConfigManager getWifiConfigManager() {
+ WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class);
+ when(wifiConfigManager.getLastSelectedNetwork())
+ .thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
+ return wifiConfigManager;
+ }
+
+
+ /**
+ * When no saved networks available, choose the available ephemeral networks
+ * if untrusted networks are allowed.
+ */
+ @Test
+ public void chooseEphemeralNetworkBecauseOfNoSavedNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
+ Integer[] scores = {null, 120};
+ boolean[] meteredHints = {false, true};
+
+ List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
+ ssids, bssids, freqs, caps, levels, mClock);
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ // No saved networks.
+ when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
+ .thenReturn(null);
+
+ ScanResult scanResult = scanDetails.get(1).getScanResult();
+ WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
+ .setupEphemeralNetwork(mWifiConfigManager, 1, scanResult, meteredHints[1]);
+
+ // Untrusted networks allowed.
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ scanResult, candidate);
+ assertEquals(meteredHints[1], candidate.meteredHint);
+ }
+
+ /**
+ * When no saved networks available, choose the highest scored ephemeral networks
+ * if untrusted networks are allowed.
+ */
+ @Test
+ public void chooseHigherScoredEphemeralNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[ESS]", "[ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
+ Integer[] scores = {100, 120};
+ boolean[] meteredHints = {true, true};
+ ScanResult[] scanResults = new ScanResult[2];
+ WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2];
+
+ List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
+ ssids, bssids, freqs, caps, levels, mClock);
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ // No saved networks.
+ when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
+ .thenReturn(null);
+
+ for (int i = 0; i < 2; i++) {
+ scanResults[i] = scanDetails.get(i).getScanResult();
+ ephemeralNetworkConfigs[i] = WifiNetworkSelectorTestUtil
+ .setupEphemeralNetwork(mWifiConfigManager, i, scanResults[i], meteredHints[i]);
+ }
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ scanResults[1], candidate);
+ assertEquals(meteredHints[1], candidate.meteredHint);
+ }
+
+ /**
+ * Don't choose available ephemeral networks if no saved networks and untrusted networks
+ * are not allowed.
+ */
+ @Test
+ public void noEphemeralNetworkWhenUntrustedNetworksNotAllowed() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
+ Integer[] scores = {null, 120};
+ boolean[] meteredHints = {false, true};
+
+ List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
+ ssids, bssids, freqs, caps, levels, mClock);
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ // No saved networks.
+ when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
+ .thenReturn(null);
+
+ ScanResult scanResult = scanDetails.get(1).getScanResult();
+ WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
+ .setupEphemeralNetwork(mWifiConfigManager, 1, scanResult, meteredHints[1]);
+
+ // Untursted networks not allowed.
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, false, null);
+
+ assertEquals("Expect null configuration", null, candidate);
+ }
+
+
+ /**
+ * Choose externally scored saved network.
+ */
+ @Test
+ public void chooseSavedNetworkWithExternalScore() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {5200};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] securities = {SECURITY_PSK};
+ int[] levels = {mThresholdQualifiedRssi5G + 8};
+ Integer[] scores = {120};
+ boolean[] meteredHints = {false};
+
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ savedConfigs[0].useExternalScores = true;
+
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ scanDetails.get(0).getScanResult(), candidate);
+ }
+
+ /**
+ * Choose externally scored saved network with higher score.
+ */
+ @Test
+ public void chooseSavedNetworkWithHigherExternalScore() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
+ Integer[] scores = {100, 120};
+ boolean[] meteredHints = {false, false};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true;
+
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ scanDetails.get(1).getScanResult(), candidate);
+ }
+
+ /**
+ * Prefer externally scored saved network over untrusted network when they have
+ * the same score.
+ */
+ @Test
+ public void chooseExternallyScoredSavedNetworkOverUntrustedNetworksWithSameScore() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
+ int[] securities = {SECURITY_PSK, SECURITY_NONE};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
+ Integer[] scores = {120, 120};
+ boolean[] meteredHints = {false, true};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ savedConfigs[0].useExternalScores = true;
+
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ scanDetails.get(0).getScanResult(), candidate);
+ }
+
+ /**
+ * Choose untrusted network when it has higher score than the externally scored
+ * saved network.
+ */
+ @Test
+ public void chooseUntrustedNetworkWithHigherScoreThanExternallyScoredSavedNetwork() {
+ // Saved network.
+ String[] savedSsids = {"\"test1\""};
+ String[] savedBssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] savedFreqs = {2470};
+ String[] savedCaps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] savedSecurities = {SECURITY_PSK};
+ int[] savedLevels = {mThresholdQualifiedRssi2G + 8};
+ // Ephemeral network.
+ String[] ephemeralSsids = {"\"test2\""};
+ String[] ephemeralBssids = {"6c:f3:7f:ae:8c:f4"};
+ int[] ephemeralFreqs = {2437};
+ String[] ephemeralCaps = {"[ESS]"};
+ int[] ephemeralLevels = {mThresholdQualifiedRssi2G + 8};
+ // Ephemeral network has higher score than the saved network.
+ Integer[] scores = {100, 120};
+ boolean[] meteredHints = {false, true};
+
+ // Set up the saved network.
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(savedSsids,
+ savedBssids, savedFreqs, savedCaps, savedLevels, savedSecurities,
+ mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ savedConfigs[0].useExternalScores = true;
+
+ // Set up the ephemeral network.
+ scanDetails.addAll(WifiNetworkSelectorTestUtil.buildScanDetails(
+ ephemeralSsids, ephemeralBssids, ephemeralFreqs,
+ ephemeralCaps, ephemeralLevels, mClock));
+ ScanResult ephemeralScanResult = scanDetails.get(1).getScanResult();
+ WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
+ .setupEphemeralNetwork(mWifiConfigManager, 1, ephemeralScanResult,
+ meteredHints[1]);
+
+ // Set up score cache for both the saved network and the ephemeral network.
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ ephemeralScanResult, candidate);
+ }
+
+ /**
+ * Prefer externally scored saved network over untrusted network when they have
+ * the same score.
+ */
+ @Test
+ public void nullScoredNetworks() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
+ int[] securities = {SECURITY_PSK, SECURITY_NONE};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
+ Integer[] scores = {null, null};
+ boolean[] meteredHints = {false, true};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ savedConfigs[0].useExternalScores = true;
+
+ WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
+ scanDetails, scores, meteredHints);
+
+ WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
+ null, null, false, true, null);
+
+ assertEquals("Expect null configuration", null, candidate);
+ }
+}
diff --git a/tests/wifitests/src/com/android/server/wifi/SavedNetworkEvaluatorTest.java b/tests/wifitests/src/com/android/server/wifi/SavedNetworkEvaluatorTest.java
new file mode 100644
index 000000000..fe290cd8a
--- /dev/null
+++ b/tests/wifitests/src/com/android/server/wifi/SavedNetworkEvaluatorTest.java
@@ -0,0 +1,323 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.os.SystemClock;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.internal.R;
+import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * Unit tests for {@link com.android.server.wifi.SavedNetworkEvaluator}.
+ */
+@SmallTest
+public class SavedNetworkEvaluatorTest {
+
+ /** Sets up test. */
+ @Before
+ public void setUp() throws Exception {
+ mResource = getResource();
+ mContext = getContext();
+ mWifiConfigManager = getWifiConfigManager();
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
+
+ mThresholdMinimumRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz);
+ mThresholdMinimumRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz);
+ mThresholdQualifiedRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz);
+ mThresholdQualifiedRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz);
+ mThresholdSaturatedRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_24GHz);
+ mThresholdSaturatedRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_5GHz);
+
+ mSavedNetworkEvaluator = new SavedNetworkEvaluator(mContext, mWifiConfigManager,
+ mClock, null);
+ }
+
+ /** Cleans up test. */
+ @After
+ public void cleanup() {
+ validateMockitoUsage();
+ }
+
+ private SavedNetworkEvaluator mSavedNetworkEvaluator;
+ private WifiConfigManager mWifiConfigManager;
+ private Context mContext;
+ private Resources mResource;
+ private Clock mClock = mock(Clock.class);
+ private int mThresholdMinimumRssi2G;
+ private int mThresholdMinimumRssi5G;
+ private int mThresholdQualifiedRssi2G;
+ private int mThresholdQualifiedRssi5G;
+ private int mThresholdSaturatedRssi2G;
+ private int mThresholdSaturatedRssi5G;
+ private static final String TAG = "Saved Network Evaluator Unit Test";
+
+ Context getContext() {
+ Context context = mock(Context.class);
+ Resources resource = mock(Resources.class);
+
+ when(context.getResources()).thenReturn(mResource);
+ return context;
+ }
+
+ Resources getResource() {
+ Resources resource = mock(Resources.class);
+
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_5GHz))
+ .thenReturn(-70);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_24GHz))
+ .thenReturn(-73);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz))
+ .thenReturn(-70);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz))
+ .thenReturn(-73);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz))
+ .thenReturn(-82);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz))
+ .thenReturn(-85);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_RSSI_SCORE_SLOPE))
+ .thenReturn(4);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_RSSI_SCORE_OFFSET))
+ .thenReturn(85);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_SAME_BSSID_AWARD))
+ .thenReturn(24);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_SECURITY_AWARD))
+ .thenReturn(80);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_5GHz_preference_boost_factor))
+ .thenReturn(16);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_current_network_boost))
+ .thenReturn(16);
+
+ return resource;
+ }
+
+ WifiConfigManager getWifiConfigManager() {
+ WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class);
+ when(wifiConfigManager.getLastSelectedNetwork())
+ .thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
+ return wifiConfigManager;
+ }
+
+
+ /**
+ * Between two 2G networks, choose the one with stronger RSSI value if other conditions
+ * are the same and the RSSI values are not satuarted.
+ */
+ @Test
+ public void chooseStrongerRssi2GNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2470, 2437};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ null, null, true, false, null);
+
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * Between two 5G networks, choose the one with stronger RSSI value if other conditions
+ * are the same and the RSSI values are not satuarted.
+ */
+ @Test
+ public void chooseStrongerRssi5GNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {5200, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G + 8, mThresholdQualifiedRssi5G + 10};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ null, null, true, false, null);
+
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * Choose secure network over open network if other conditions are the same.
+ */
+ @Test
+ public void chooseSecureNetworkOverOpenNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {5200, 5240};
+ String[] caps = {"[ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G, mThresholdQualifiedRssi5G};
+ int[] securities = {SECURITY_NONE, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ null, null, true, false, null);
+
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * Choose 5G network over 2G network if other conditions are the same.
+ */
+ @Test
+ public void choose5GNetworkOver2GNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2437, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G, mThresholdQualifiedRssi5G};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ null, null, true, false, null);
+
+ ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * Verify that we stick to the currently connected network if the other one is
+ * just slightly better scored.
+ */
+ @Test
+ public void stickToCurrentNetwork() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {5200, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ // test2 has slightly stronger RSSI value than test1
+ int[] levels = {mThresholdMinimumRssi5G + 2, mThresholdMinimumRssi5G + 4};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // Simuluate we are connected to SSID test1 already.
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ savedConfigs[0], null, true, false, null);
+
+ // Even though test2 has higher RSSI value, test1 is chosen because of the
+ // currently connected network bonus.
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * Verify that we stick to the currently connected BSSID if the other one is
+ * just slightly better scored.
+ */
+ @Test
+ public void stickToCurrentBSSID() {
+ // Same SSID
+ String[] ssids = {"\"test1\"", "\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {5200, 5240};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ // test2 has slightly stronger RSSI value than test1
+ int[] levels = {mThresholdMinimumRssi5G + 2, mThresholdMinimumRssi5G + 6};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // Simuluate we are connected to BSSID "6c:f3:7f:ae:8c:f3" already
+ WifiConfiguration candidate = mSavedNetworkEvaluator.evaluateNetworks(scanDetails,
+ null, bssids[0], true, false, null);
+
+ // Even though test2 has higher RSSI value, test1 is chosen because of the
+ // currently connected BSSID bonus.
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ }
+}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
index 84133acb7..c952f65ff 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiConnectivityManagerTest.java
@@ -72,7 +72,7 @@ public class WifiConnectivityManagerTest {
mWifiConfigManager = mockWifiConfigManager();
mWifiInfo = getWifiInfo();
mWifiScanner = mockWifiScanner();
- mWifiQNS = mockWifiQualifiedNetworkSelector();
+ mWifiNS = mockWifiNetworkSelector();
mWifiConnectivityManager = createConnectivityManager();
mWifiConnectivityManager.setWifiEnabled(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
@@ -91,7 +91,7 @@ public class WifiConnectivityManagerTest {
private TestAlarmManager mAlarmManager;
private TestLooper mLooper = new TestLooper();
private WifiConnectivityManager mWifiConnectivityManager;
- private WifiQualifiedNetworkSelector mWifiQNS;
+ private WifiNetworkSelector mWifiNS;
private WifiStateMachine mWifiStateMachine;
private WifiScanner mWifiScanner;
private WifiConfigManager mWifiConfigManager;
@@ -117,10 +117,10 @@ public class WifiConnectivityManagerTest {
R.bool.config_wifi_framework_enable_associated_network_selection)).thenReturn(true);
when(resource.getInteger(
R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_24GHz))
- .thenReturn(WifiQualifiedNetworkSelector.RSSI_SATURATION_2G_BAND);
+ .thenReturn(-60);
when(resource.getInteger(
R.integer.config_wifi_framework_current_network_boost))
- .thenReturn(WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD);
+ .thenReturn(16);
return resource;
}
@@ -197,8 +197,8 @@ public class WifiConnectivityManagerTest {
return stateMachine;
}
- WifiQualifiedNetworkSelector mockWifiQualifiedNetworkSelector() {
- WifiQualifiedNetworkSelector qns = mock(WifiQualifiedNetworkSelector.class);
+ WifiNetworkSelector mockWifiNetworkSelector() {
+ WifiNetworkSelector ns = mock(WifiNetworkSelector.class);
WifiConfiguration candidate = generateWifiConfig(
0, CANDIDATE_NETWORK_ID, CANDIDATE_SSID, false, true, null, null);
@@ -208,9 +208,9 @@ public class WifiConnectivityManagerTest {
candidateScanResult.BSSID = CANDIDATE_BSSID;
candidate.getNetworkSelectionStatus().setCandidate(candidateScanResult);
- when(qns.selectQualifiedNetwork(anyBoolean(), anyBoolean(), anyBoolean(),
- anyBoolean(), anyBoolean(), anyBoolean(), anyObject())).thenReturn(candidate);
- return qns;
+ when(ns.selectNetwork(anyObject(), anyBoolean(), anyBoolean(),
+ anyBoolean())).thenReturn(candidate);
+ return ns;
}
WifiInfo getWifiInfo() {
@@ -250,7 +250,7 @@ public class WifiConnectivityManagerTest {
WifiConnectivityManager createConnectivityManager() {
return new WifiConnectivityManager(mContext, mWifiStateMachine, mWifiScanner,
- mWifiConfigManager, mWifiInfo, mWifiQNS, mWifiInjector, mLooper.getLooper(), true);
+ mWifiConfigManager, mWifiInfo, mWifiNS, mWifiInjector, mLooper.getLooper(), true);
}
/**
@@ -490,9 +490,9 @@ public class WifiConnectivityManagerTest {
* because of their low RSSI values.
*/
@Test
- public void PnoRetryForLowRssiNetwork() {
- when(mWifiQNS.selectQualifiedNetwork(anyBoolean(), anyBoolean(), anyBoolean(),
- anyBoolean(), anyBoolean(), anyBoolean(), anyObject())).thenReturn(null);
+ public void pnoRetryForLowRssiNetwork() {
+ when(mWifiNS.selectNetwork(anyObject(), anyBoolean(), anyBoolean(),
+ anyBoolean())).thenReturn(null);
// Set screen to off
mWifiConnectivityManager.handleScreenStateChanged(false);
@@ -511,7 +511,7 @@ public class WifiConnectivityManagerTest {
.getLowRssiNetworkRetryDelay();
assertEquals(lowRssiNetworkRetryDelayStartValue * 2,
- lowRssiNetworkRetryDelayAfterPnoValue);
+ lowRssiNetworkRetryDelayAfterPnoValue);
}
/**
@@ -546,8 +546,8 @@ public class WifiConnectivityManagerTest {
@Test
public void watchdogBitePnoGoodIncrementsMetrics() {
// Qns returns no candidate after watchdog single scan.
- when(mWifiQNS.selectQualifiedNetwork(anyBoolean(), anyBoolean(), anyBoolean(),
- anyBoolean(), anyBoolean(), anyBoolean(), anyObject())).thenReturn(null);
+ when(mWifiNS.selectNetwork(anyObject(), anyBoolean(), anyBoolean(),
+ anyBoolean())).thenReturn(null);
// Set screen to off
mWifiConnectivityManager.handleScreenStateChanged(false);
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
new file mode 100644
index 000000000..a03e17457
--- /dev/null
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java
@@ -0,0 +1,491 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
+import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.net.NetworkScoreManager;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.os.SystemClock;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.util.Pair;
+
+import com.android.internal.R;
+import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.List;
+
+/**
+ * Unit tests for {@link com.android.server.wifi.WifiNetworkSelector}.
+ */
+@SmallTest
+public class WifiNetworkSelectorTest {
+
+ /** Sets up test. */
+ @Before
+ public void setUp() throws Exception {
+ mResource = getResource();
+ mContext = getContext();
+ mWifiConfigManager = getWifiConfigManager();
+ mWifiInfo = getWifiInfo();
+
+ mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiConfigManager,
+ mWifiInfo, mClock);
+ mWifiNetworkSelector.registerNetworkEvaluator(mDummyEvaluator, 1);
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
+
+ mThresholdMinimumRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz);
+ mThresholdMinimumRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz);
+ mThresholdQualifiedRssi2G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz);
+ mThresholdQualifiedRssi5G = mResource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz);
+ }
+
+ /** Cleans up test. */
+ @After
+ public void cleanup() {
+ validateMockitoUsage();
+ }
+
+ /**
+ * All this dummy network evaluator does is to pick the very first network
+ * in the scan results.
+ */
+ public class DummyNetworkEvaluator implements WifiNetworkSelector.NetworkEvaluator {
+ private static final String NAME = "DummyNetworkEvaluator";
+ private WifiConfigManager mConfigManager;
+
+ /**
+ * Get the evaluator name.
+ */
+ public String getName() {
+ return NAME;
+ }
+
+ /**
+ * Update thee evaluator.
+ */
+ public void update(List<ScanDetail> scanDetails) {
+ }
+
+ /**
+ * Always return the first network in the scan results for connection.
+ */
+ public WifiConfiguration evaluateNetworks(List<ScanDetail> scanDetails,
+ WifiConfiguration currentNetwork, String currentBssid, boolean connected,
+ boolean untrustedNetworkAllowed,
+ List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks) {
+ ScanDetail scanDetail = scanDetails.get(0);
+ mWifiConfigManager.setNetworkCandidateScanResult(0, scanDetail.getScanResult(), 100);
+
+ return mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
+ }
+ }
+
+ private WifiNetworkSelector mWifiNetworkSelector = null;
+ private DummyNetworkEvaluator mDummyEvaluator = new DummyNetworkEvaluator();
+ private WifiConfigManager mWifiConfigManager = null;
+ private Context mContext;
+ private Resources mResource;
+ private WifiInfo mWifiInfo;
+ private Clock mClock = mock(Clock.class);
+ private int mThresholdMinimumRssi2G;
+ private int mThresholdMinimumRssi5G;
+ private int mThresholdQualifiedRssi2G;
+ private int mThresholdQualifiedRssi5G;
+
+ Context getContext() {
+ Context context = mock(Context.class);
+ Resources resource = mock(Resources.class);
+
+ when(context.getResources()).thenReturn(mResource);
+ return context;
+ }
+
+ Resources getResource() {
+ Resources resource = mock(Resources.class);
+
+ when(resource.getBoolean(
+ R.bool.config_wifi_framework_enable_associated_network_selection)).thenReturn(true);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz))
+ .thenReturn(-70);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_24GHz))
+ .thenReturn(-73);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz))
+ .thenReturn(-82);
+ when(resource.getInteger(
+ R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz))
+ .thenReturn(-85);
+ return resource;
+ }
+
+ NetworkScoreManager getNetworkScoreManager() {
+ NetworkScoreManager networkScoreManager = mock(NetworkScoreManager.class);
+
+ return networkScoreManager;
+ }
+
+ WifiInfo getWifiInfo() {
+ WifiInfo wifiInfo = mock(WifiInfo.class);
+
+ // simulate a disconnected state
+ when(wifiInfo.is24GHz()).thenReturn(true);
+ when(wifiInfo.is5GHz()).thenReturn(false);
+ when(wifiInfo.getRssi()).thenReturn(-70);
+ when(wifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
+ when(wifiInfo.getBSSID()).thenReturn(null);
+ return wifiInfo;
+ }
+
+ WifiConfigManager getWifiConfigManager() {
+ WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class);
+ when(wifiConfigManager.getLastSelectedNetwork())
+ .thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
+ return wifiConfigManager;
+ }
+
+
+ /**
+ * No network selection if scan result is empty.
+ *
+ * WifiStateMachine is in disconnected state.
+ * scanDetails is empty.
+ *
+ * Expected behavior: no network recommended by Network Selector
+ */
+ @Test
+ public void emptyScanResults() {
+ String[] ssids = new String[0];
+ String[] bssids = new String[0];
+ int[] freqs = new int[0];
+ String[] caps = new String[0];
+ int[] levels = new int[0];
+ int[] securities = new int[0];
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ false, true, false);
+ assertEquals("Expect null configuration", null, candidate);
+ }
+
+
+ /**
+ * No network selection if the RSSI values in scan result are too low.
+ *
+ * WifiStateMachine is in disconnected state.
+ * scanDetails contains a 2.4GHz and a 5GHz network, but both with RSSI lower than
+ * the threshold
+ *
+ * Expected behavior: no network recommended by Network Selector
+ */
+ @Test
+ public void verifyMinimumRssiThreshold() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2437, 5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdMinimumRssi2G - 1, mThresholdMinimumRssi5G - 1};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ false, true, false);
+ assertEquals("Expect null configuration", null, candidate);
+ }
+
+ /**
+ * No network selection if WiFi is connected and it is too short from last
+ * network selection.
+ *
+ * WifiStateMachine is in connected state.
+ * scanDetails contains two valid networks.
+ * Perform a network seletion right after the first one.
+ *
+ * Expected behavior: no network recommended by Network Selector
+ */
+ @Test
+ public void verifyMinimumTimeGapWhenConnected() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2437, 5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdMinimumRssi2G + 1, mThresholdMinimumRssi5G + 1};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ // Make a network selection.
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ false, true, false);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS - 2000);
+
+ // Do another network selection with WSM in CONNECTED state.
+ candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ true, false, false);
+
+ assertEquals("Expect null configuration", null, candidate);
+ }
+
+ /**
+ * Perform network selection if WiFi is disconnected even if it is too short from last
+ * network selection.
+ *
+ * WifiStateMachine is in disconnected state.
+ * scanDetails contains two valid networks.
+ * Perform a network seletion right after the first one.
+ *
+ * Expected behavior: the first network is recommended by Network Selector
+ */
+ @Test
+ public void verifyNoMinimumTimeGapWhenDisconnected() {
+ String[] ssids = {"\"test1\"", "\"test2\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
+ int[] freqs = {2437, 5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdMinimumRssi2G + 1, mThresholdMinimumRssi5G + 1};
+ int[] securities = {SECURITY_PSK, SECURITY_PSK};
+
+ // Make a network selection.
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ false, true, false);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS - 2000);
+
+ // Do another network selection with WSM in DISCONNECTED state.
+ candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ false, true, false);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * No network selection if the currently connected on is already sufficient.
+ *
+ * WifiStateMachine is connected to a qualified (5G, secure, good RSSI) network.
+ * scanDetails contains a valid network.
+ * Perform a network seletion after the first one.
+ *
+ * Expected behavior: no network recommended by Network Selector
+ */
+ @Test
+ public void noNetworkSelectionWhenCurrentOneIsSufficient() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G + 8};
+ int[] securities = {SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+
+ // connect to test1
+ mWifiNetworkSelector.selectNetwork(scanDetails, false, true, false);
+ when(mWifiInfo.getNetworkId()).thenReturn(0);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiInfo.is24GHz()).thenReturn(false);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ levels[0] = mThresholdQualifiedRssi5G + 20;
+ scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ scanDetails = scanDetailsAndConfigs.getScanDetails();
+
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ true, false, false);
+ assertEquals("Expect null configuration", null, candidate);
+ }
+
+
+ /**
+ * New network selection is performed if the currently connected network
+ * band is 2G.
+ *
+ * WifiStateMachine is connected to a 2G network.
+ * scanDetails contains a valid networks.
+ * Perform a network seletion after the first one.
+ *
+ * Expected behavior: the first network is recommended by Network Selector
+ */
+ @Test
+ public void band2GNetworkIsNotSufficient() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {2470};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi2G + 8};
+ int[] securities = {SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // connect to test1
+ mWifiNetworkSelector.selectNetwork(scanDetails, false, true, false);
+ when(mWifiInfo.getNetworkId()).thenReturn(0);
+ when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
+ when(mWifiInfo.is24GHz()).thenReturn(true);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ // Do another network selection.
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ true, false, false);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+
+ /**
+ * New network selection is performed if the currently connected network
+ * is a open one.
+ *
+ * WifiStateMachine is connected to a open network.
+ * scanDetails contains a valid networks.
+ * Perform a network seletion after the first one.
+ *
+ * Expected behavior: the first network is recommended by Network Selector
+ */
+ @Test
+ public void openNetworkIsNotSufficient() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {5180};
+ String[] caps = {"[ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G + 8};
+ int[] securities = {SECURITY_NONE};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // connect to test1
+ mWifiNetworkSelector.selectNetwork(scanDetails, 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(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ // Do another network selection.
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ true, false, false);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+
+ /**
+ * New network selection is performed if the currently connected network
+ * has low RSSI value.
+ *
+ * WifiStateMachine is connected to a low RSSI 5GHz network.
+ * scanDetails contains a valid networks.
+ * Perform a network seletion after the first one.
+ *
+ * Expected behavior: the first network is recommended by Network Selector
+ */
+ @Test
+ public void lowRssi5GNetworkIsNotSufficient() {
+ String[] ssids = {"\"test1\""};
+ String[] bssids = {"6c:f3:7f:ae:8c:f3"};
+ int[] freqs = {5180};
+ String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
+ int[] levels = {mThresholdQualifiedRssi5G - 2};
+ int[] securities = {SECURITY_PSK};
+
+ ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
+ WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
+ freqs, caps, levels, securities, mWifiConfigManager, mClock);
+ List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
+ WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
+
+ // connect to test1
+ mWifiNetworkSelector.selectNetwork(scanDetails, 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.getRssi()).thenReturn(levels[0]);
+
+ when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
+ + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000);
+
+ // Do another network selection.
+ WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(scanDetails,
+ true, false, false);
+
+ ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
+ WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
+ WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
+ chosenScanResult, candidate);
+ }
+}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java
new file mode 100644
index 000000000..db3aff14c
--- /dev/null
+++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java
@@ -0,0 +1,367 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wifi;
+
+import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig;
+
+import static org.junit.Assert.*;
+import static org.mockito.Mockito.*;
+
+import android.app.test.MockAnswerUtil.AnswerWithArguments;
+import android.net.NetworkKey;
+import android.net.RssiCurve;
+import android.net.ScoredNetwork;
+import android.net.WifiKey;
+import android.net.wifi.ScanResult;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
+import android.net.wifi.WifiSsid;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.text.TextUtils;
+
+import com.android.server.wifi.util.ScanResultUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Helper for WifiNetworkSelector unit tests.
+ */
+@SmallTest
+public class WifiNetworkSelectorTestUtil {
+
+ /**
+ * A class that holds a list of scanDetail and their associated WifiConfiguration.
+ */
+ public static class ScanDetailsAndWifiConfigs {
+ List<ScanDetail> mScanDetails;
+ WifiConfiguration[] mWifiConfigs;
+
+ ScanDetailsAndWifiConfigs(List<ScanDetail> scanDetails, WifiConfiguration[] configs) {
+ mScanDetails = scanDetails;
+ mWifiConfigs = configs;
+ }
+
+ List<ScanDetail> getScanDetails() {
+ return mScanDetails;
+ }
+
+ WifiConfiguration[] getWifiConfigs() {
+ return mWifiConfigs;
+ }
+ }
+
+ /**
+ * Build a list of ScanDetail based on the caller supplied network SSID, BSSID,
+ * frequency, capability and RSSI level information. Create the corresponding
+ * WifiConfiguration for these networks and set up the mocked WifiConfigManager.
+ *
+ * @param ssids an array of SSIDs
+ * @param bssids an array of BSSIDs
+ * @param freqs an array of the network's frequency
+ * @param caps an array of the network's capability
+ * @param levels an array of the network's RSSI levels
+ * @param securities an array of the network's security setting
+ * @param wifiConfigManager the mocked WifiConfigManager
+ * @return the constructed ScanDetail list and WifiConfiguration array
+ */
+ public static ScanDetailsAndWifiConfigs setupScanDetailsAndConfigStore(String[] ssids,
+ String[] bssids, int[] freqs, String[] caps, int[] levels, int[] securities,
+ WifiConfigManager wifiConfigManager, Clock clock) {
+ List<ScanDetail> scanDetails = buildScanDetails(ssids, bssids, freqs, caps, levels, clock);
+ WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, securities);
+ prepareConfigStore(wifiConfigManager, savedConfigs);
+ scanResultLinkConfiguration(wifiConfigManager, savedConfigs, scanDetails);
+
+ return new ScanDetailsAndWifiConfigs(scanDetails, savedConfigs);
+ }
+
+ /**
+ * Verify whether the WifiConfiguration chosen by WifiNetworkSelector matches
+ * with the chosen scan result.
+ *
+ * @param chosenScanResult the chosen scan result
+ * @param chosenCandidate the chosen configuration
+ */
+ public static void verifySelectedScanResult(WifiConfigManager wifiConfigManager,
+ ScanResult chosenScanResult, WifiConfiguration chosenCandidate) {
+ verify(wifiConfigManager, atLeastOnce()).setNetworkCandidateScanResult(
+ eq(chosenCandidate.networkId), eq(chosenScanResult), anyInt());
+ }
+
+
+ /**
+ * Build a list of scanDetails based on the caller supplied network SSID, BSSID,
+ * frequency, capability and RSSI level information.
+ *
+ * @param ssids an array of SSIDs
+ * @param bssids an array of BSSIDs
+ * @param freqs an array of the network's frequency
+ * @param caps an array of the network's capability
+ * @param levels an array of the network's RSSI levels
+ * @return the constructed list of ScanDetail
+ */
+ public static List<ScanDetail> buildScanDetails(String[] ssids, String[] bssids, int[] freqs,
+ String[] caps, int[] levels, Clock clock) {
+ List<ScanDetail> scanDetailList = new ArrayList<ScanDetail>();
+
+ long timeStamp = clock.getElapsedSinceBootMillis();
+ for (int index = 0; index < ssids.length; index++) {
+ ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssids[index]),
+ bssids[index], caps[index], levels[index], freqs[index], timeStamp, 0);
+ scanDetailList.add(scanDetail);
+ }
+ return scanDetailList;
+ }
+
+
+ /**
+ * Generate an array of {@link android.net.wifi.WifiConfiguration} based on the caller
+ * supplied network SSID and sencurity information.
+ *
+ * @param ssids an array of SSIDs
+ * @param securities an array of the network's security setting
+ * @return the constructed array of {@link android.net.wifi.WifiConfiguration}
+ */
+ public static WifiConfiguration[] generateWifiConfigurations(String[] ssids,
+ int[] securities) {
+ if (ssids == null || securities == null || ssids.length != securities.length
+ || ssids.length == 0) {
+ return null;
+ }
+
+ WifiConfiguration[] configs = new WifiConfiguration[ssids.length];
+ for (int index = 0; index < ssids.length; index++) {
+ configs[index] = generateWifiConfig(index, 0, ssids[index], false, true, null, null,
+ securities[index]);
+ }
+
+ return configs;
+ }
+
+ /**
+ * Add the Configurations to WifiConfigManager (WifiConfigureStore can take them out according
+ * to the networkd ID) and setup the WifiConfigManager mocks for these networks.
+ * This simulates the WifiConfigManager class behaviour.
+ *
+ * @param wifiConfigManager the mocked WifiConfigManager
+ * @param configs input configuration need to be added to WifiConfigureStore
+ */
+ private static void prepareConfigStore(WifiConfigManager wifiConfigManager,
+ final WifiConfiguration[] configs) {
+ when(wifiConfigManager.getConfiguredNetwork(anyInt()))
+ .then(new AnswerWithArguments() {
+ public WifiConfiguration answer(int netId) {
+ if (netId >= 0 && netId < configs.length) {
+ return new WifiConfiguration(configs[netId]);
+ } else {
+ return null;
+ }
+ }
+ });
+ when(wifiConfigManager.getConfiguredNetwork(anyString()))
+ .then(new AnswerWithArguments() {
+ public WifiConfiguration answer(String configKey) {
+ for (int netId = 0; netId < configs.length; netId++) {
+ if (TextUtils.equals(configs[netId].configKey(), configKey)) {
+ return new WifiConfiguration(configs[netId]);
+ }
+ }
+ return null;
+ }
+ });
+ when(wifiConfigManager.getSavedNetworks())
+ .then(new AnswerWithArguments() {
+ public List<WifiConfiguration> answer() {
+ List<WifiConfiguration> savedNetworks = new ArrayList<>();
+ for (int netId = 0; netId < configs.length; netId++) {
+ savedNetworks.add(new WifiConfiguration(configs[netId]));
+ }
+ return savedNetworks;
+ }
+ });
+ when(wifiConfigManager.clearNetworkCandidateScanResult(anyInt()))
+ .then(new AnswerWithArguments() {
+ public boolean answer(int netId) {
+ if (netId >= 0 && netId < configs.length) {
+ configs[netId].getNetworkSelectionStatus().setCandidate(null);
+ configs[netId].getNetworkSelectionStatus()
+ .setCandidateScore(Integer.MIN_VALUE);
+ configs[netId].getNetworkSelectionStatus()
+ .setSeenInLastQualifiedNetworkSelection(false);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ when(wifiConfigManager.setNetworkCandidateScanResult(
+ anyInt(), any(ScanResult.class), anyInt()))
+ .then(new AnswerWithArguments() {
+ public boolean answer(int netId, ScanResult scanResult, int score) {
+ if (netId >= 0 && netId < configs.length) {
+ configs[netId].getNetworkSelectionStatus().setCandidate(scanResult);
+ configs[netId].getNetworkSelectionStatus().setCandidateScore(score);
+ configs[netId].getNetworkSelectionStatus()
+ .setSeenInLastQualifiedNetworkSelection(true);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ when(wifiConfigManager.clearNetworkConnectChoice(anyInt()))
+ .then(new AnswerWithArguments() {
+ public boolean answer(int netId) {
+ if (netId >= 0 && netId < configs.length) {
+ configs[netId].getNetworkSelectionStatus().setConnectChoice(null);
+ configs[netId].getNetworkSelectionStatus()
+ .setConnectChoiceTimestamp(
+ NetworkSelectionStatus
+ .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ when(wifiConfigManager.setNetworkConnectChoice(anyInt(), anyString(), anyLong()))
+ .then(new AnswerWithArguments() {
+ public boolean answer(int netId, String configKey, long timestamp) {
+ if (netId >= 0 && netId < configs.length) {
+ configs[netId].getNetworkSelectionStatus().setConnectChoice(configKey);
+ configs[netId].getNetworkSelectionStatus().setConnectChoiceTimestamp(
+ timestamp);
+ return true;
+ } else {
+ return false;
+ }
+ }
+ });
+ }
+
+
+ /**
+ * Link scan results to the saved configurations.
+ *
+ * The shorter of the 2 input params will be used to loop over so the inputs don't
+ * need to be of equal length. If there are more scan details then configs the remaining scan
+ * details will be associated with a NULL config.
+ *
+ * @param wifiConfigManager the mocked WifiConfigManager
+ * @param configs saved configurations
+ * @param scanDetails come in scan results
+ */
+ private static void scanResultLinkConfiguration(WifiConfigManager wifiConfigManager,
+ WifiConfiguration[] configs, List<ScanDetail> scanDetails) {
+ if (configs == null || scanDetails == null) {
+ return;
+ }
+
+ if (scanDetails.size() <= configs.length) {
+ for (int i = 0; i < scanDetails.size(); i++) {
+ ScanDetail scanDetail = scanDetails.get(i);
+ when(wifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetail)))
+ .thenReturn(configs[i]);
+ }
+ } else {
+ for (int i = 0; i < configs.length; i++) {
+ ScanDetail scanDetail = scanDetails.get(i);
+ when(wifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetail)))
+ .thenReturn(configs[i]);
+ }
+
+ // associated the remaining scan details with a NULL config.
+ for (int i = configs.length; i < scanDetails.size(); i++) {
+ when(wifiConfigManager.getSavedNetworkForScanDetailAndCache(
+ eq(scanDetails.get(i)))).thenReturn(null);
+ }
+ }
+ }
+
+
+
+ /**
+ * Configure the score cache for externally scored networks
+ *
+ * @param scoreCache Wifi network score cache to be configured
+ * @param scanDetails a list of ScanDetail
+ * @param scores scores of the networks
+ * @param meteredHints hints of if the networks are metered
+ */
+ public static void configureScoreCache(WifiNetworkScoreCache scoreCache,
+ List<ScanDetail> scanDetails, Integer[] scores, boolean[] meteredHints) {
+ List<ScoredNetwork> networks = new ArrayList<>();
+
+ for (int i = 0; i < scanDetails.size(); i++) {
+ ScanDetail scanDetail = scanDetails.get(i);
+ byte rssiScore;
+ Integer score = scores[i];
+ ScanResult scanResult = scanDetail.getScanResult();
+ WifiKey wifiKey = new WifiKey("\"" + scanResult.SSID + "\"", scanResult.BSSID);
+ NetworkKey ntwkKey = new NetworkKey(wifiKey);
+ if (scores[i] == null) {
+ rssiScore = WifiNetworkScoreCache.INVALID_NETWORK_SCORE;
+ } else {
+ rssiScore = scores[i].byteValue();
+ }
+ RssiCurve rssiCurve = new RssiCurve(-100, 100, new byte[] {rssiScore});
+ ScoredNetwork scoredNetwork = new ScoredNetwork(ntwkKey, rssiCurve, meteredHints[i]);
+
+ networks.add(scoredNetwork);
+ }
+
+ scoreCache.updateScores(networks);
+ }
+
+ /**
+ * Setup WifiConfigManager mock for ephemeral networks.
+ *
+ * @param wifiConfigManager WifiConfigManager mock
+ * @param networkId ID of the ephemeral network
+ * @param scanResult scanResult of the ephemeral network
+ * @param meteredHint flag to indidate if the network has meteredHint
+ */
+ public static WifiConfiguration setupEphemeralNetwork(WifiConfigManager wifiConfigManager,
+ int networkId, ScanResult scanResult, boolean meteredHint) {
+ // Return the correct networkID for ephemeral network addition.
+ when(wifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
+ .thenReturn(new NetworkUpdateResult(networkId));
+ final WifiConfiguration config = ScanResultUtil.createNetworkFromScanResult(scanResult);
+ config.networkId = networkId;
+ config.meteredHint = meteredHint;
+
+ when(wifiConfigManager.getConfiguredNetwork(eq(networkId)))
+ .then(new AnswerWithArguments() {
+ public WifiConfiguration answer(int netId) {
+ return new WifiConfiguration(config);
+ }
+ });
+ when(wifiConfigManager.setNetworkCandidateScanResult(
+ eq(networkId), any(ScanResult.class), anyInt()))
+ .then(new AnswerWithArguments() {
+ public boolean answer(int netId, ScanResult scanResult, int score) {
+ config.getNetworkSelectionStatus().setCandidate(scanResult);
+ config.getNetworkSelectionStatus().setCandidateScore(score);
+ config.getNetworkSelectionStatus()
+ .setSeenInLastQualifiedNetworkSelection(true);
+ return true;
+ }
+ });
+ return config;
+ }
+}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
deleted file mode 100644
index c83400b93..000000000
--- a/tests/wifitests/src/com/android/server/wifi/WifiQualifiedNetworkSelectorTest.java
+++ /dev/null
@@ -1,2299 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.wifi;
-
-import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_EAP;
-import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
-import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
-import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig;
-
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
-
-import android.app.test.MockAnswerUtil.AnswerWithArguments;
-import android.content.Context;
-import android.content.res.Resources;
-import android.net.NetworkScoreManager;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
-import android.net.wifi.WifiEnterpriseConfig;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiSsid;
-import android.os.SystemClock;
-import android.test.suitebuilder.annotation.SmallTest;
-import android.text.TextUtils;
-import android.util.LocalLog;
-
-import com.android.internal.R;
-import com.android.server.wifi.util.ScanResultUtil;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * Unit tests for {@link com.android.server.wifi.WifiQualifiedNetworkSelector}.
- */
-@SmallTest
-public class WifiQualifiedNetworkSelectorTest {
-
- @Before
- public void setUp() throws Exception {
- mResource = getResource();
- mScoreManager = getNetworkScoreManager();
- mScoreCache = getScoreCache();
- mContext = getContext();
- mWifiConfigManager = getWifiConfigManager();
- mWifiInfo = getWifiInfo();
- mLocalLog = getLocalLog();
-
- mWifiQualifiedNetworkSelector = new WifiQualifiedNetworkSelector(mWifiConfigManager,
- mContext, mWifiInfo, mClock);
- mWifiQualifiedNetworkSelector.enableVerboseLogging(1);
- mWifiQualifiedNetworkSelector.setWifiNetworkScoreCache(mScoreCache);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
- }
-
- @After
- public void cleanup() {
- validateMockitoUsage();
- }
-
- private WifiQualifiedNetworkSelector mWifiQualifiedNetworkSelector = null;
- private WifiConfigManager mWifiConfigManager = null;
- private Context mContext;
- private Resources mResource;
- private NetworkScoreManager mScoreManager;
- private WifiNetworkScoreCache mScoreCache;
- private WifiInfo mWifiInfo;
- private LocalLog mLocalLog;
- private Clock mClock = mock(Clock.class);
- 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";
-
- private List<ScanDetail> getScanDetails(String[] ssids, String[] bssids, int[] frequencies,
- String[] caps, int[] levels) {
- List<ScanDetail> scanDetailList = new ArrayList<ScanDetail>();
- long timeStamp = mClock.getElapsedSinceBootMillis();
- for (int index = 0; index < ssids.length; index++) {
- ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssids[index]),
- bssids[index], caps[index], levels[index], frequencies[index], timeStamp, 0);
- scanDetailList.add(scanDetail);
- }
- return scanDetailList;
- }
-
- Context getContext() {
- Context context = mock(Context.class);
- Resources resource = mock(Resources.class);
-
- when(context.getResources()).thenReturn(mResource);
- when(context.getSystemService(Context.NETWORK_SCORE_SERVICE)).thenReturn(mScoreManager);
- return context;
- }
-
- Resources getResource() {
- Resources resource = mock(Resources.class);
-
- when(resource.getInteger(R.integer.config_wifi_framework_SECURITY_AWARD)).thenReturn(80);
- when(resource.getInteger(R.integer.config_wifi_framework_RSSI_SCORE_OFFSET)).thenReturn(85);
- when(resource.getInteger(R.integer.config_wifi_framework_SAME_BSSID_AWARD)).thenReturn(24);
- when(resource.getInteger(R.integer.config_wifi_framework_LAST_SELECTION_AWARD))
- .thenReturn(480);
- when(resource.getInteger(R.integer.config_wifi_framework_PASSPOINT_SECURITY_AWARD))
- .thenReturn(40);
- when(resource.getInteger(R.integer.config_wifi_framework_SECURITY_AWARD)).thenReturn(80);
- when(resource.getInteger(R.integer.config_wifi_framework_RSSI_SCORE_SLOPE)).thenReturn(4);
- when(resource.getBoolean(
- R.bool.config_wifi_framework_enable_associated_network_selection)).thenReturn(true);
- when(resource.getInteger(
- R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_24GHz))
- .thenReturn(WifiQualifiedNetworkSelector.RSSI_SATURATION_2G_BAND);
- when(resource.getInteger(
- R.integer.config_wifi_framework_current_network_boost))
- .thenReturn(WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD);
- when(resource.getInteger(
- R.integer.config_wifi_framework_wifi_score_good_rssi_threshold_24GHz))
- .thenReturn(WifiQualifiedNetworkSelector.RSSI_SATURATION_2G_BAND);
- when(resource.getInteger(
- R.integer.config_wifi_framework_5GHz_preference_boost_factor))
- .thenReturn(WifiQualifiedNetworkSelector.BAND_AWARD_5GHz);
- when(resource.getInteger(
- R.integer.config_wifi_framework_wifi_score_low_rssi_threshold_5GHz))
- .thenReturn(WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND);
- when(resource.getInteger(
- R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_5GHz))
- .thenReturn(WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI);
- when(resource.getInteger(
- R.integer.config_wifi_framework_wifi_score_bad_rssi_threshold_24GHz))
- .thenReturn(WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI);
- return resource;
- }
-
- NetworkScoreManager getNetworkScoreManager() {
- NetworkScoreManager networkScoreManager = mock(NetworkScoreManager.class);
-
- return networkScoreManager;
- }
-
- WifiNetworkScoreCache getScoreCache() {
- return mock(WifiNetworkScoreCache.class);
- }
-
- LocalLog getLocalLog() {
- return new LocalLog(0);
- }
-
- WifiInfo getWifiInfo() {
- WifiInfo wifiInfo = mock(WifiInfo.class);
-
- //simulate a disconnected state
- when(wifiInfo.is24GHz()).thenReturn(true);
- when(wifiInfo.is5GHz()).thenReturn(false);
- when(wifiInfo.getRssi()).thenReturn(-70);
- when(wifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
- when(wifiInfo.getBSSID()).thenReturn(null);
- when(wifiInfo.getNetworkId()).thenReturn(-1);
- return wifiInfo;
- }
-
- WifiConfigManager getWifiConfigManager() {
- WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class);
- when(wifiConfigManager.getLastSelectedNetwork())
- .thenReturn(WifiConfiguration.INVALID_NETWORK_ID);
- return wifiConfigManager;
- }
-
- /**
- * This API is used to generate multiple simulated saved configurations used for test
- *
- * @param ssid array of SSID of saved configuration
- * @param security array of securities of saved configuration
- * @return generated new array of configurations based on input
- */
- private WifiConfiguration[] generateWifiConfigurations(String[] ssid, int[] security) {
- if (ssid == null || security == null || ssid.length != security.length
- || ssid.length == 0) {
- return null;
- }
-
- WifiConfiguration[] configs = new WifiConfiguration[ssid.length];
- for (int index = 0; index < ssid.length; index++) {
- configs[index] = generateWifiConfig(index, 0, ssid[index], false, true, null, null,
- security[index]);
- }
-
- return configs;
- }
-
- /**
- * set configuration to a passpoint configuration
- *
- * @param config The configuration need to be set as a passipoint configuration
- */
- private void setConfigPasspoint(WifiConfiguration config) {
- config.FQDN = "android.qns.unitTest";
- config.providerFriendlyName = "android.qns.unitTest";
- WifiEnterpriseConfig enterpriseConfig = mock(WifiEnterpriseConfig.class);
- when(enterpriseConfig.getEapMethod()).thenReturn(WifiEnterpriseConfig.Eap.PEAP);
-
- }
-
- /**
- * Add the Configurations to WifiConfigManager (WifiConfigureStore can take them out according
- * to the networkd ID) and setup the WifiConfigManager mocks for these networks.
- * This simulates the WifiConfigManager class behaviour.
- *
- * @param configs input configuration need to be added to WifiConfigureStore
- */
- private void prepareConfigStore(final WifiConfiguration[] configs) {
- when(mWifiConfigManager.getConfiguredNetwork(anyInt()))
- .then(new AnswerWithArguments() {
- public WifiConfiguration answer(int netId) {
- if (netId >= 0 && netId < configs.length) {
- return new WifiConfiguration(configs[netId]);
- } else {
- return null;
- }
- }
- });
- when(mWifiConfigManager.getConfiguredNetwork(anyString()))
- .then(new AnswerWithArguments() {
- public WifiConfiguration answer(String configKey) {
- for (int netId = 0; netId < configs.length; netId++) {
- if (TextUtils.equals(configs[netId].configKey(), configKey)) {
- return new WifiConfiguration(configs[netId]);
- }
- }
- return null;
- }
- });
- when(mWifiConfigManager.getSavedNetworks())
- .then(new AnswerWithArguments() {
- public List<WifiConfiguration> answer() {
- List<WifiConfiguration> savedNetworks = new ArrayList<>();
- for (int netId = 0; netId < configs.length; netId++) {
- savedNetworks.add(new WifiConfiguration(configs[netId]));
- }
- return savedNetworks;
- }
- });
- when(mWifiConfigManager.clearNetworkCandidateScanResult(anyInt()))
- .then(new AnswerWithArguments() {
- public boolean answer(int netId) {
- if (netId >= 0 && netId < configs.length) {
- configs[netId].getNetworkSelectionStatus().setCandidate(null);
- configs[netId].getNetworkSelectionStatus()
- .setCandidateScore(Integer.MIN_VALUE);
- configs[netId].getNetworkSelectionStatus()
- .setSeenInLastQualifiedNetworkSelection(false);
- return true;
- } else {
- return false;
- }
- }
- });
- when(mWifiConfigManager.setNetworkCandidateScanResult(
- anyInt(), any(ScanResult.class), anyInt()))
- .then(new AnswerWithArguments() {
- public boolean answer(int netId, ScanResult scanResult, int score) {
- if (netId >= 0 && netId < configs.length) {
- configs[netId].getNetworkSelectionStatus().setCandidate(scanResult);
- configs[netId].getNetworkSelectionStatus().setCandidateScore(score);
- configs[netId].getNetworkSelectionStatus()
- .setSeenInLastQualifiedNetworkSelection(true);
- return true;
- } else {
- return false;
- }
- }
- });
- when(mWifiConfigManager.clearNetworkConnectChoice(anyInt()))
- .then(new AnswerWithArguments() {
- public boolean answer(int netId) {
- if (netId >= 0 && netId < configs.length) {
- configs[netId].getNetworkSelectionStatus().setConnectChoice(null);
- configs[netId].getNetworkSelectionStatus()
- .setConnectChoiceTimestamp(
- NetworkSelectionStatus
- .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP);
- return true;
- } else {
- return false;
- }
- }
- });
- when(mWifiConfigManager.setNetworkConnectChoice(anyInt(), anyString(), anyLong()))
- .then(new AnswerWithArguments() {
- public boolean answer(int netId, String configKey, long timestamp) {
- if (netId >= 0 && netId < configs.length) {
- configs[netId].getNetworkSelectionStatus().setConnectChoice(configKey);
- configs[netId].getNetworkSelectionStatus().setConnectChoiceTimestamp(
- timestamp);
- return true;
- } else {
- return false;
- }
- }
- });
- }
-
- /**
- * Setup WifiConfigManager mock for the ephemeral network addition and getter/setter methods.
- */
- private WifiConfiguration setupEphemeralNetwork(
- int networkId, ScanResult scanResult, boolean meteredHint) {
- // Return the correct networkID for ephemeral network addition.
- when(mWifiConfigManager.addOrUpdateNetwork(any(WifiConfiguration.class), anyInt()))
- .thenReturn(new NetworkUpdateResult(networkId));
- final WifiConfiguration config = ScanResultUtil.createNetworkFromScanResult(scanResult);
- config.networkId = networkId;
- config.meteredHint = meteredHint;
-
-// when(mWifiConfigManager.getConfiguredNetwork(networkId))
- // .thenReturn(new WifiConfiguration(config));
-
- when(mWifiConfigManager.getConfiguredNetwork(eq(networkId)))
- .then(new AnswerWithArguments() {
- public WifiConfiguration answer(int netId) {
- return new WifiConfiguration(config);
- }
- });
- when(mWifiConfigManager.setNetworkCandidateScanResult(
- eq(networkId), any(ScanResult.class), anyInt()))
- .then(new AnswerWithArguments() {
- public boolean answer(int netId, ScanResult scanResult, int score) {
- config.getNetworkSelectionStatus().setCandidate(scanResult);
- config.getNetworkSelectionStatus().setCandidateScore(score);
- config.getNetworkSelectionStatus()
- .setSeenInLastQualifiedNetworkSelection(true);
- return true;
- }
- });
- return config;
- }
-
- /**
- * Link scan results to the saved configurations.
- *
- * The shorter of the 2 input params will be used to loop over so the inputs don't
- * need to be of equal length. If there are more scan details then configs the remaining scan
- * details will be associated with a NULL config.
- *
- * @param configs saved configurations
- * @param scanDetails come in scan results
- */
- private void scanResultLinkConfiguration(WifiConfiguration[] configs,
- List<ScanDetail> scanDetails) {
- if (scanDetails.size() <= configs.length) {
- for (int i = 0; i < scanDetails.size(); i++) {
- ScanDetail scanDetail = scanDetails.get(i);
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetail)))
- .thenReturn(configs[i]);
- }
- } else {
- for (int i = 0; i < configs.length; i++) {
- ScanDetail scanDetail = scanDetails.get(i);
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetail)))
- .thenReturn(configs[i]);
- }
-
- // associated the remaining scan details with a NULL config.
- for (int i = configs.length; i < scanDetails.size(); i++) {
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
- eq(scanDetails.get(i)))).thenReturn(null);
- }
- }
- }
-
- private void configureScoreCache(List<ScanDetail> scanDetails, Integer[] scores,
- boolean[] meteredHints) {
- for (int i = 0; i < scanDetails.size(); i++) {
- ScanDetail scanDetail = scanDetails.get(i);
- Integer score = scores[i];
- ScanResult scanResult = scanDetail.getScanResult();
- if (score != null) {
- when(mScoreCache.isScoredNetwork(scanResult)).thenReturn(true);
- when(mScoreCache.hasScoreCurve(scanResult)).thenReturn(true);
- when(mScoreCache.getNetworkScore(eq(scanResult), anyBoolean())).thenReturn(score);
- when(mScoreCache.getNetworkScore(scanResult)).thenReturn(score);
- } else {
- when(mScoreCache.isScoredNetwork(scanResult)).thenReturn(false);
- when(mScoreCache.hasScoreCurve(scanResult)).thenReturn(false);
- when(mScoreCache.getNetworkScore(eq(scanResult), anyBoolean())).thenReturn(
- WifiNetworkScoreCache.INVALID_NETWORK_SCORE);
- when(mScoreCache.getNetworkScore(scanResult)).thenReturn(
- WifiNetworkScoreCache.INVALID_NETWORK_SCORE);
- }
- when(mScoreCache.getMeteredHint(scanResult)).thenReturn(meteredHints[i]);
- }
- }
-
- /**
- * Verify whether the chosen configuration matched with the expected chosen scan result
- *
- * @param chosenScanResult the expected chosen scan result
- * @param chosenCandidate the chosen configuration
- */
- private void verifySelectedResult(
- ScanResult chosenScanResult, WifiConfiguration chosenCandidate) {
- verify(mWifiConfigManager, atLeastOnce()).setNetworkCandidateScanResult(
- eq(chosenCandidate.networkId), eq(chosenScanResult), anyInt());
- }
-
- // QNS test under disconnected State
-
- /**
- * Case #1 choose 2GHz stronger RSSI test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled, encrypted and at 2.4 GHz
- * test1 is with RSSI -70 test2 is with RSSI -60
- *
- * Expected behavior: test2 is chosen
- */
- @Test
- public void chooseNetworkDisconnected2GHighestRssi() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2417};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-70, -60};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
-
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(
- savedConfigs[scanDetails.size() - 1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #2 choose 5GHz Stronger RSSI Test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled, encrypted and at 5 GHz
- * test1 is with RSSI -70 test2 is with RSSI -60
- *
- * Expected behavior: test2 is chosen
- */
- @Test
- public void chooseNetworkDisconnected5GHighestRssi() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5180, 5610};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-70, -60};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
-
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(
- savedConfigs[scanDetails.size() - 1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #3 5GHz over 2GHz bonus Test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -60
- * test2 is @ 5Ghz with RSSI -65
- *
- * Expected behavior: test2 is chosen due to 5GHz bonus
- */
- @Test
- public void chooseNetworkDisconnect5GOver2GTest() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-60, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(
- savedConfigs[scanDetails.size() - 1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #4 2GHz over 5GHz dur to 5GHz signal too weak test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -60
- * test2 is @ 5Ghz with RSSI -75
- *
- * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not
- * compensate)
- */
- @Test
- public void chooseNetworkDisconnect2GOver5GTest() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-60, -75};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #5 2GHz signal Saturation test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -50
- * test2 is @ 5Ghz with RSSI -65
- *
- * Expected behavior: test2 is chosen. Although the RSSI delta here is 15 too, because 2GHz RSSI
- * saturates at -60, the real RSSI delta is only 5, which is less than 5GHz bonus
- */
- @Test
- public void chooseNetworkDisconnect2GRssiSaturationTest() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(
- savedConfigs[scanDetails.size() - 1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #6 Minimum RSSI test
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -86
- * test2 is @ 5Ghz with RSSI -83
- *
- * Expected behavior: no QNS is made because both network are below the minimum threshold, null
- */
- @Test
- public void chooseNetworkMinimumRssiTest() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI - 1,
- WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI - 1};
- int[] security = {SECURITY_EAP, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- assertEquals("choose the wrong SSID", null, candidate);
- }
-
- /**
- * Case #7 encrypted network over passpoint network
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1 is secured network, test2 are passpoint network
- * Both network are enabled and at 2.4 GHz. Both have RSSI of -70
- *
- * Expected behavior: test1 is chosen since secured network has higher priority than passpoint
- * network
- */
- @Test
- public void chooseNetworkSecurityOverPassPoint() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] levels = {-70, -70};
- int[] security = {SECURITY_EAP, SECURITY_NONE};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- setConfigPasspoint(savedConfigs[1]);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #8 passpoint network over open network
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1 is passpoint network, test2 is open network
- * Both network are enabled and at 2.4 GHz. Both have RSSI of -70
- *
- * Expected behavior: test1 is chosen since passpoint network has higher priority than open
- * network
- */
- @Test
- public void chooseNetworkPasspointOverOpen() {
- String[] ssids = {"\"test1\"", "\"test2\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f8", "6c:f3:7f:ae:8c:f4"};
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-70, -70};
- int[] security = {SECURITY_NONE, SECURITY_NONE};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- setConfigPasspoint(savedConfigs[0]);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #9 secure network over open network
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * Two networks test1 is secure network, test2 is open network
- * Both network are enabled and at 2.4 GHz. Both have RSSI of -70
- *
- * Expected behavior: test1 is chosen since secured network has higher priority than open
- * network
- */
- @Test
- public void chooseNetworkSecureOverOpen() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-70, -70};
- int[] security = {SECURITY_PSK, SECURITY_NONE};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #10 first time user select a network
- *
- * In this test. we simulate following scenario
- * There are three saved networks: test1, test2 and test3. Now user select the network test3
- * check test3 has been saved in test1's and test2's ConnectChoice
- *
- * Expected behavior: test1's and test2's ConnectChoice should be test3, test3's ConnectChoice
- * should be null
- */
- @Test
- public void userSelectsNetworkForFirstTime() {
- String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""};
- int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_NONE};
-
- final WifiConfiguration[] configs = generateWifiConfigurations(ssids, security);
- for (WifiConfiguration network : configs) {
- NetworkSelectionStatus status = network.getNetworkSelectionStatus();
- status.setSeenInLastQualifiedNetworkSelection(true);
- }
- prepareConfigStore(configs);
-
- mWifiQualifiedNetworkSelector.setUserConnectChoice(configs.length - 1);
- String key = configs[configs.length - 1].configKey();
- for (int index = 0; index < configs.length; index++) {
- WifiConfiguration config = configs[index];
- NetworkSelectionStatus status = config.getNetworkSelectionStatus();
- if (index == configs.length - 1) {
- assertEquals("User selected network should not have prefernce over it", null,
- status.getConnectChoice());
- } else {
- assertEquals("Wrong user preference", key, status.getConnectChoice());
- }
- }
- }
-
- /**
- * Case #11 choose user selected network
- *
- * In this test, we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * There are three networks: test1, test2, test3 and test3 is the user preference
- * All three networks are enabled
- * test1 is @ 2.4GHz with RSSI -50 PSK
- * test2 is @ 5Ghz with RSSI -65 PSK
- * test3 is @ 2.4GHz with RSSI -55 open
- *
- * Expected behavior: test3 is chosen since it is user selected network. It overcome all other
- * priorities
- */
- @Test
- public void chooseUserPreferredNetwork() {
- String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""};
- int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_NONE};
-
- final WifiConfiguration[] configs = generateWifiConfigurations(ssids, security);
- for (WifiConfiguration network : configs) {
- NetworkSelectionStatus status = network.getNetworkSelectionStatus();
- status.setSeenInLastQualifiedNetworkSelection(true);
- }
- prepareConfigStore(configs);
-
- //set user preference
- mWifiQualifiedNetworkSelector.setUserConnectChoice(ssids.length - 1);
- //Generate mocked recent scan results
- String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:f3:7f:ae:8c:f5"};
- int[] frequencies = {2437, 5180, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]", "NONE"};
- int[] levels = {-50, -65, -55};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- scanResultLinkConfiguration(configs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(
- configs[scanDetails.size() - 1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #12 enable a blacklisted BSSID
- *
- * In this test, we simulate following scenario:
- * For two Aps, BSSIDA and BSSIDB. Disable BSSIDA, then check whether BSSIDA is disabled and
- * BSSIDB is enabled. Then enable BSSIDA, check whether both BSSIDs are enabled.
- */
- @Test
- public void enableBssidTest() {
- String bssidA = "6c:f3:7f:ae:8c:f3";
- String bssidB = "6c:f3:7f:ae:8c:f4";
- //check by default these two BSSIDs should be enabled
- assertEquals("bssidA should be enabled by default",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false);
- assertEquals("bssidB should be enabled by default",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false);
-
- //disable bssidA 3 times, check whether A is dsiabled and B is still enabled
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false);
- assertEquals("bssidA should be disabled",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false);
- assertEquals("bssidA should be disabled",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false);
- assertEquals("bssidA should be disabled",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), true);
- assertEquals("bssidB should still be enabled",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false);
-
- //re-enable bssidA, check whether A is dsiabled and B is still enabled
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, true);
- assertEquals("bssidA should be enabled by default",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false);
- assertEquals("bssidB should be enabled by default",
- mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false);
-
- //make sure illegal input will not cause crash
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(null, false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(null, true);
- }
-
- /**
- * Case #13 do not choose the BSSID has been disabled
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network and found in scan results
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -65
- * test2 is @ 5Ghz with RSSI -50
- * test2's BSSID is disabled
- *
- * expected return test1 since test2's BSSID has been disabled
- */
- @Test
- public void networkChooseWithOneBssidDisabled() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-65, -50};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #14 re-choose the disabled BSSID after it is re-enabled
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network and found in scan results
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -65
- * test2 is @ 5Ghz with RSSI -50
- * test2's BSSID is disabled
- *
- * expected return test2 since test2's BSSID has been enabled again
- */
- @Test
- public void networkChooseWithOneBssidReenaabled() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-65, -50};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- //re-enable it
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], true);
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #15 re-choose the disabled BSSID after its disability has expired
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network and found in scan results
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -65
- * test2 is @ 5Ghz with RSSI -50
- * test2's BSSID is disabled
- *
- * expected return test2 since test2's BSSID has been enabled again
- */
- @Test
- public void networkChooseWithOneBssidDisableExpire() {
- String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:f3:7f:ae:8c:f5"};
- int[] frequencies = {2437, 5180, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]",
- "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-65, -50, -60};
- int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- for (int index = 0; index < WifiQualifiedNetworkSelector.BSSID_BLACKLIST_THRESHOLD;
- index++) {
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false);
- mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[2], false);
- }
-
- //re-enable it
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()
- + WifiQualifiedNetworkSelector.BSSID_BLACKLIST_EXPIRE_TIME_MS);
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
- /**
- * Case #16 do not choose the SSID has been disabled
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * Two networks test1, test2 are secured network and found in scan results
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -65
- * test2 is @ 5Ghz with RSSI -50
- * test2's SSID is disabled
- *
- * expected return test1 since test2's SSID has been disabled
- */
- @Test
- public void networkChooseWithOneSsidDisabled() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-65, -50};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- when(mWifiConfigManager.tryEnableNetwork(anyInt())).thenReturn(true);
- savedConfigs[1].getNetworkSelectionStatus().setNetworkSelectionStatus(
- NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED);
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #17 do not make QNS is link is bouncing now
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state and currently is under link bouncing
- * Two networks test1, test2 are secured network and found in scan results
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -50
- * test2 is @ 5Ghz with RSSI -50
- *
- * expected return null
- */
- @Test
- public void noQNSWhenLinkBouncingDisconnected() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI - 1,
- WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI - 1};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, true, false, true, false, scanDetails);
-
- assertEquals("choose the wrong network", null, candidate);
- }
-
- /**
- * Case #18 QNS with very short gap
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under disconnected state
- * If last QNS is made in less than MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, we
- * still should make new QNS since it is disconnected now
- *
- * expect return test1 because of band bonus
- */
- @Test
- public void networkSelectionInShortGap() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- //first QNS
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- //immediately second QNS
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- //Unit test for Connected State
-
- /**
- * Case #19 no QNS with very short gap when connected
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and test2 is connected
- * When WifiStateMachine is already in connected state, if last QNS is made in less than
- * MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, no new QNS should be made
- *
- * expect return NULL
- */
- @Test
- public void noNetworkSelectionDueToShortGap() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- //first QNS
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- //immediately second QNS
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
- assertEquals("choose the wrong BSSID", null, candidate);
- }
-
- /**
- * Case #20 force QNS with very short gap under connection
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and test2 is connected
- * When WifiStateMachine is already in connected state, if last QNS is made in less than
- * MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, no new QNS should be made. However, if we force
- * to make new QNS, QNS still will be made
- *
- * expect return test2 since it is the current connected one (bonus)
- */
- @Test
- public void forceNetworkSelectionInShortGap() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- //first QNS
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- //immediately second QNS
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(true,
- false, false, true, false, false, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #21 no QNS when connected and user do not allow switch when connected
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and test2 is connected
- * if user does not allow switch network when connected, do not make new QNS when connected
- *
- * expect return NULL
- */
- @Test
- public void noNewNetworkSelectionDuetoUserDisableSwitchWhenConnected() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- assertEquals("choose the wrong BSSID", null, candidate);
- assertEquals("Should receive zero filteredScanDetails", 0,
- mWifiQualifiedNetworkSelector.getFilteredScanDetails().size());
- }
-
- /**
- * Case #22 no new QNS if current network is qualified already
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and test2 is connected
- * If current connected network is Qualified already, do not make new QNS
- * simulated current connected network as:
- * 5GHz, RSSI = WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND, secured
- *
- * expected return null
- */
- @Test
- public void noNewQNSCurrentNetworkQualified() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-65, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- //first time, connect to test2 due to 5GHz bonus
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
-
- levels[0] = -50; // if there is QNS, test1 will be chosen
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- assertEquals("choose the wrong BSSID", null, candidate);
- }
-
- /**
- * Case #23 No new QNS when link bouncing when connected
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and test2 is connected
- * no new QNS when link is bouncing
- *
- * expected return null
- */
- @Test
- public void noNewQNSLinkBouncing() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-70, -75};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- //first connect to test2 due to 5GHz bonus
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, true, true, false, false, scanDetails);
- assertEquals("choose the wrong BSSID", null, candidate);
- }
-
- /**
- * Case #24 Qualified network need to be on 5GHz
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and connected to test2
- * if current connected network is not 5GHz, then it is not qualified. We should make new QNS
- *
- * expected result: return test1
- */
- @Test
- public void currentNetworkNotQualifiedDueToBandMismatch() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-50, -65};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(0);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[0]);
- when(mWifiInfo.is24GHz()).thenReturn(true);
- //connect to config2 first
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
-
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #25 Qualified network need to be secured
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connects to test2. If current connected
- * network is open network, then it is not qualified. We should make new QNS selection and
- * ensure that we switch to the secure one if the RSSI is sufficiently high.
- *
- * expected result: return test1 since test1 has higher RSSI
- */
- @Test
- public void currentNetworkNotQualifiedDueToOpenNetwork() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5400, 5400};
- String[] caps = {"[WPA2-EAP-CCMP][ESS][ESS]", "[ESS]"};
- int[] levels = {-80, -45};
- int[] security = {SECURITY_PSK, SECURITY_NONE};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- //first connect to test2 because of RSSI
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
- when(mWifiInfo.is5GHz()).thenReturn(true);
- when(mClock.getElapsedSinceBootMillis())
- .thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
-
- // Now increase RSSI of test1
- levels[0] = -60;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #26 ephemeral network can not be qualified network
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * if current connected network is ephemeral network, then it is not qualified. We should make
- * new QNS
- *
- * expected result: return test1 (since test2 is ephemeral)
- */
- @Test
- public void currentNetworkNotQualifiedDueToEphemeral() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, -50};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- savedConfigs[1].ephemeral = true;
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- //first connect to test2 since test1's RSSI is negligible
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
-
- levels[0] = -70;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #27 low signal network can not be Qualified network (5GHz)
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * if current connected network's rssi is too low, then it is not qualified. We should
- * make new QNS
- *
- * expected result: return test1
- */
- @Test
- public void currentNetworkNotQualifiedDueToLow5GRssi() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-80, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND - 1};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.getRssi()).thenReturn(levels[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
- when(mWifiInfo.is5GHz()).thenReturn(true);
-
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- levels[0] = -60;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #28 low signal network can not be Qualified network (2.4GHz)
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * if current connected network's rssi is too low, then it is not qualified. We should
- * make new QNS
- *
- * expected result: return test1
- */
- @Test
- public void currentNetworkNotQualifiedDueToLow2GRssi() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_24G_BAND - 1};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
-
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.getRssi()).thenReturn(levels[1]);
- when(mWifiInfo.is24GHz()).thenReturn(false);
- when(mWifiInfo.is5GHz()).thenReturn(true);
-
- levels[0] = -60;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #29 Choose current network due to current network bonus
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * To connect to a network which is not linked to current connected network, unless this network
- * is more than 10 db higher than current network, we should not switch. So although test2 has a
- * lower signal, we still choose test2
- *
- * expected result: return test2
- */
- @Test
- public void currentNetworkStayDueToSameNetworkBonus() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, -80};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(true);
-
- levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4
- + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 - 1;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #30 choose another network due to current network's signal is too low
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * To connect to a network which is not linked to current connected network, if this network
- * is more than 10 db higher than current network, we should switch
- *
- * expected new result: return test1
- */
- @Test
- public void switchNetworkStayDueToCurrentNetworkRssiLow() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, -80};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
-
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(true);
-
- levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4
- + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 + 1;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #31 Choose current BSSID due to current BSSID bonus
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * Linked network will be treated as same network. To connect to a network which is linked to
- * current connected network, unless this network is more than 6 db higher than current network,
- * we should not switch AP and stick to current BSSID
- *
- * expected result: return test2
- */
- @Test
- public void currentBssidStayDueToSameBSSIDBonus() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, -80};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- //link two configuration
- savedConfigs[0].linkedConfigurations = new HashMap<String, Integer>();
- savedConfigs[1].linkedConfigurations = new HashMap<String, Integer>();
- savedConfigs[0].linkedConfigurations.put(savedConfigs[1].configKey(), 1);
- savedConfigs[1].linkedConfigurations.put(savedConfigs[0].configKey(), 1);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
-
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(true);
-
- levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 - 1;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #32 Choose another BSSID due to current BSSID's rssi is too low
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is under connected state and current connected to test2
- * Linked network will be treated as same network. To connect to a network which is linked to
- * current connected network, unless this network is more than 6 db higher than current network,
- * we should not switch AP and stick to current BSSID
- *
- * expected result: return test2
- */
- @Test
- public void swithBssidDueToLowRssi() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"};
- int[] levels = {-100, -80};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- //link two configuration
- savedConfigs[0].linkedConfigurations = new HashMap<String, Integer>();
- savedConfigs[1].linkedConfigurations = new HashMap<String, Integer>();
- savedConfigs[0].linkedConfigurations.put(savedConfigs[1].configKey(), 1);
- savedConfigs[1].linkedConfigurations.put(savedConfigs[0].configKey(), 1);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, false,
- false, true, false, scanDetails);
-
- when(mWifiInfo.getNetworkId()).thenReturn(1);
- when(mWifiInfo.getBSSID()).thenReturn(bssids[1]);
- when(mWifiInfo.is24GHz()).thenReturn(true);
-
- levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4 + 1;
- scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, true, false, false, scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #33 Choose an ephemeral network with a good score because no saved networks
- * are available.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is an enterprise network w/o a score.
- * test2 is an open network with a good score. Additionally it's a metered network.
- * isUntrustedConnectionsAllowed is set to true.
- *
- * expected result: return test2 with meteredHint set to True.
- */
- @Test
- public void selectQualifiedNetworkChoosesEphemeral() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] levels = {-70, -70};
- Integer[] scores = {null, 120};
- boolean[] meteredHints = {false, true};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- // No saved networks.
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
- .thenReturn(null);
-
- ScanResult untrustedScanResult = scanDetails.get(1).getScanResult();
- WifiConfiguration unTrustedNetworkCandidate =
- setupEphemeralNetwork(1, untrustedScanResult, meteredHints[1]);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- true /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(unTrustedNetworkCandidate, candidate);
- verifySelectedResult(untrustedScanResult, candidate);
- assertEquals(meteredHints[1], candidate.meteredHint);
- }
-
- /**
- * Case #34 Test Filtering of potential candidate scanDetails (Untrusted allowed)
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * test1 is @ 2GHz with RSSI -60
- * test2 is @ 5Ghz with RSSI -86, (below minimum threshold)
- * test3 is @ 5Ghz with RSSI -50, however it has no associated saved config
- * test4 is @ 2Ghz with RSSI -62, no associated config, but is Ephemeral
- *
- * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not
- * compensate).
- * test1 & test4's scanDetails are returned by 'getFilteredScanDetail()'
- */
- @Test
- public void testGetFilteredScanDetailsReturnsOnlyConsideredScanDetails_untrustedAllowed() {
- String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
- "c0:ff:ee:ee:e3:ee"};
- int[] frequencies = {2437, 5180, 5180, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
- "[WPA2-EAP-CCMP][ESS]"};
- int[] levels = {-60, -86, -50, -62};
- int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK};
- boolean[] meteredHints = {false, false, false, true};
- Integer[] scores = {null, null, null, 120};
-
- //Create all 4 scanDetails
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
-
- //Setup NetworkScoreCache for detecting ephemeral networks ("test4")
- configureScoreCache(scanDetails, scores, meteredHints);
- ScanResult untrustedScanResult = scanDetails.get(3).getScanResult();
-
- //Set up associated configs for test1 & test2
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(
- Arrays.copyOfRange(ssids, 0, 2), Arrays.copyOfRange(security, 0, 2));
- prepareConfigStore(savedConfigs);
- List<ScanDetail> savedScanDetails = new ArrayList<ScanDetail>(scanDetails.subList(0, 2));
- scanResultLinkConfiguration(savedConfigs, savedScanDetails);
-
- setupEphemeralNetwork(2, scanDetails.get(2).getScanResult(), meteredHints[2]);
- setupEphemeralNetwork(3, scanDetails.get(3).getScanResult(), meteredHints[3]);
-
- //Force mock ConfigManager to return null (and not an empty list) for "test3" & "test4"
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetails.get(2))))
- .thenReturn(null);
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetails.get(3))))
- .thenReturn(null);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- true /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
-
- verifySelectedResult(chosenScanResult, candidate);
- //Verify two scanDetails returned in the filteredScanDetails
- assertEquals(2, mWifiQualifiedNetworkSelector.getFilteredScanDetails().size());
- assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(0).first.toString(),
- scanDetails.get(0).toString());
- assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(1).first.toString(),
- scanDetails.get(3).toString());
- }
-
-
- /**
- * Case #35 Test Filtering of potential candidate scanDetails (Untrusted disallowed)
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * test1 is @ 2GHz with RSSI -60
- * test2 is @ 5Ghz with RSSI -86, (below minimum threshold)
- * test3 is @ 5Ghz with RSSI -50, however it has no associated saved config
- * test4 is @ 2Ghz with RSSI -62, no associated config, but is Ephemeral
- *
- * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not
- * compensate).
- * test1 & test4's scanDetails are returned by 'getFilteredScanDetail()'
- */
- @Test
- public void testGetFilteredScanDetailsReturnsOnlyConsideredScanDetails_untrustedDisallowed() {
- String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55",
- "c0:ff:ee:ee:e3:ee"};
- int[] frequencies = {2437, 5180, 5180, 2437};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]",
- "[WPA2-EAP-CCMP][ESS]"};
- int[] levels = {-60, -86, -50, -62};
- int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK};
- boolean[] meteredHints = {false, false, false, true};
- Integer[] scores = {null, null, null, 120};
-
- //Create all 4 scanDetails
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
-
- //Setup NetworkScoreCache for detecting ephemeral networks ("test4")
- configureScoreCache(scanDetails, scores, meteredHints);
- ScanResult untrustedScanResult = scanDetails.get(3).getScanResult();
- WifiConfiguration unTrustedNetworkCandidate =
- ScanResultUtil.createNetworkFromScanResult(untrustedScanResult);
-
- //Set up associated configs for test1 & test2
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(
- Arrays.copyOfRange(ssids, 0, 2), Arrays.copyOfRange(security, 0, 2));
- prepareConfigStore(savedConfigs);
- List<ScanDetail> savedScanDetails = new ArrayList<ScanDetail>(scanDetails.subList(0, 2));
- scanResultLinkConfiguration(savedConfigs, savedScanDetails);
-
- setupEphemeralNetwork(2, scanDetails.get(2).getScanResult(), meteredHints[2]);
- setupEphemeralNetwork(3, scanDetails.get(3).getScanResult(), meteredHints[3]);
-
- //Force mock ConfigManager to return null (and not an empty list) for "test3" & "test4"
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetails.get(2))))
- .thenReturn(null);
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetails.get(3))))
- .thenReturn(null);
-
- ScanResult chosenScanResult = scanDetails.get(0).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- false /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
-
- verifySelectedResult(chosenScanResult, candidate);
- //Verify two scanDetails returned in the filteredScanDetails
- assertEquals(1, mWifiQualifiedNetworkSelector.getFilteredScanDetails().size());
- assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(0).first.toString(),
- scanDetails.get(0).toString());
- }
-
- /**
- * Case #36 Ignore an ephemeral network if it was previously deleted.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is an open network with a low score. Additionally it's a metered network.
- * test2 is an open network with a good score but was previously deleted.
- * isUntrustedConnectionsAllowed is set to true.
- *
- * expected result: return test1 with meteredHint set to True.
- */
- @Test
- public void selectQualifiedNetworkDoesNotChooseDeletedEphemeral() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] levels = {-70, -70};
- Integer[] scores = {20, 120};
- boolean[] meteredHints = {true, false};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- // No saved networks.
- when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(any(ScanDetail.class)))
- .thenReturn(null);
-
- ScanResult untrustedScanResult = scanDetails.get(0).getScanResult();
- WifiConfiguration unTrustedNetworkCandidate =
- setupEphemeralNetwork(0, untrustedScanResult, meteredHints[0]);
-
- // The second scan result is for an ephemeral network which was previously deleted
- when(mWifiConfigManager
- .wasEphemeralNetworkDeleted(scanDetails.get(0).getScanResult().SSID))
- .thenReturn(false);
- when(mWifiConfigManager
- .wasEphemeralNetworkDeleted(scanDetails.get(1).getScanResult().SSID))
- .thenReturn(true);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- true /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(unTrustedNetworkCandidate, candidate);
- verifySelectedResult(untrustedScanResult, candidate);
- assertEquals(meteredHints[0], candidate.meteredHint);
- }
-
- /**
- * Case #37 Choose the saved config that doesn't qualify for external scoring.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is a saved network.
- * test2 is a saved network with useExternalScores set to true and a very high score.
- *
- * expected result: return test1 because saved networks that don't request external scoring
- * have a higher priority.
- */
- @Test
- public void selectQualifiedNetworkPrefersSavedWithoutExternalScores() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
- int[] levels = {-70, -70};
- Integer[] scores = {null, 120};
- boolean[] meteredHints = {false, true};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(DEFAULT_SSIDS, security);
- savedConfigs[1].useExternalScores = true; // test2 is set to use external scores.
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- false /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(scanDetails.get(0).getScanResult(), candidate);
- }
-
- /**
- * Case #38 Choose the saved config that does qualify for external scoring when other saved
- * networks are not available.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is a saved network with useExternalScores set to true and a very high score.
- * test2 is a saved network but not in range (not included in the scan results).
- *
- * expected result: return test1 because there are no better saved networks within range.
- */
- @Test
- public void selectQualifiedNetworkSelectsSavedWithExternalScores() {
- String[] ssids = {"\"test1\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f3"};
- int[] frequencies = {5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
- int[] levels = {-70};
- Integer[] scores = {120};
- boolean[] meteredHints = {false};
-
- // Scan details only contains 1 ssid, test1.
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- // The saved config contains 2 ssids, test1 & test2.
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(DEFAULT_SSIDS, security);
- savedConfigs[0].useExternalScores = true; // test1 is set to use external scores.
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- false /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(scanDetails.get(0).getScanResult(), candidate);
- }
-
- /**
- * Case #39 Choose the saved config that does qualify for external scoring over the
- * untrusted network with the same score.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is a saved network with useExternalScores set to true and the same score as test2.
- * test2 is NOT saved network but in range with a good external score.
- *
- * expected result: return test1 because the tie goes to the saved network.
- */
- @Test
- public void selectQualifiedNetworkPrefersSavedWithExternalScoresOverUntrusted() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
- int[] levels = {-70, -70};
- Integer[] scores = {120, 120};
- boolean[] meteredHints = {false, true};
-
- // Both networks are in the scan results.
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- // Set up the associated configs only for test1
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(
- Arrays.copyOfRange(ssids, 0, 1), Arrays.copyOfRange(security, 0, 1));
- savedConfigs[0].useExternalScores = true; // test1 is set to use external scores.
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- setupEphemeralNetwork(1, scanDetails.get(1).getScanResult(), meteredHints[1]);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- true /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
- verifySelectedResult(scanDetails.get(0).getScanResult(), candidate);
- }
-
- /**
- * Case #40 Choose the ephemeral config over the saved config that does qualify for external
- * scoring because the untrusted network has a higher score.
- *
- * In this test. we simulate following scenario:
- * WifiStateMachine is not connected to any network.
- * selectQualifiedNetwork() is called with 2 scan results, test1 and test2.
- * test1 is a saved network with useExternalScores set to true and a low score.
- * test2 is NOT saved network but in range with a good external score.
- *
- * expected result: return test2 because it has a better score.
- */
- @Test
- public void selectQualifiedNetworkPrefersUntrustedOverScoredSaved() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {5200, 5200};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
- int[] levels = {-70, -70};
- Integer[] scores = {10, 120};
- boolean[] meteredHints = {false, true};
-
- // Both networks are in the scan results.
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- configureScoreCache(scanDetails, scores, meteredHints);
-
- // Set up the associated configs only for test1
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(
- Arrays.copyOfRange(ssids, 0, 1), Arrays.copyOfRange(security, 0, 1));
- savedConfigs[0].useExternalScores = true; // test1 is set to use external scores.
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult untrustedScanResult = scanDetails.get(1).getScanResult();
- WifiConfiguration unTrustedNetworkCandidate =
- setupEphemeralNetwork(1, untrustedScanResult, meteredHints[1]);
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(
- false /* forceSelectNetwork */,
- true /* isUntrustedConnectionsAllowed */,
- false, /* isLinkDebouncing */
- false, /* isConnected */
- true, /* isDisconnected */
- false, /* isSupplicantTransient */
- scanDetails);
- WifiConfigurationTestUtil.assertConfigurationEqual(unTrustedNetworkCandidate, candidate);
- verifySelectedResult(untrustedScanResult, candidate);
- }
-
-
- /**
- * Case #41 Ensure the ExternalScoreEvaluator correctly selects the untrusted network.
- *
- * In this test. we simulate following scenario:
- * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network.
- * The untrusted network has the higher score.
- *
- * expected result: The untrusted network is determined to be the best network.
- */
- @Test
- public void externalScoreEvaluator_untrustedIsBest() {
- WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator =
- new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true);
- ScanResult untrustedScanResult = new ScanResult();
- int untrustedScore = 100;
- evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult);
-
- ScanResult savedScanResult = new ScanResult();
- int savedScore = 50;
- WifiConfiguration savedConfig = new WifiConfiguration();
- evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult);
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.UNTRUSTED_NETWORK, evaluator.getBestCandidateType());
- assertEquals(untrustedScore, evaluator.getHighScore());
- assertSame(untrustedScanResult, evaluator.getScanResultCandidate());
- }
-
- /**
- * Case #42 Ensure the ExternalScoreEvaluator correctly selects the saved network.
- *
- * In this test. we simulate following scenario:
- * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network.
- * The saved network has the higher score.
- *
- * expected result: The saved network is determined to be the best network.
- */
- @Test
- public void externalScoreEvaluator_savedIsBest() {
- WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator =
- new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true);
- ScanResult untrustedScanResult = new ScanResult();
- int untrustedScore = 50;
- evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult);
-
- ScanResult savedScanResult = new ScanResult();
- int savedScore = 100;
- WifiConfiguration savedConfig = new WifiConfiguration();
- evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult);
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType());
- assertEquals(savedScore, evaluator.getHighScore());
- assertSame(savedScanResult, evaluator.getScanResultCandidate());
- }
-
- /**
- * Case #43 Ensure the ExternalScoreEvaluator correctly selects the saved network if a
- * tie occurs.
- *
- * In this test. we simulate following scenario:
- * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network.
- * Both networks have the same score.
- *
- * expected result: The saved network is determined to be the best network.
- */
- @Test
- public void externalScoreEvaluator_tieScores() {
- WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator =
- new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true);
- ScanResult untrustedScanResult = new ScanResult();
- int untrustedScore = 100;
- evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult);
-
- ScanResult savedScanResult = new ScanResult();
- int savedScore = 100;
- WifiConfiguration savedConfig = new WifiConfiguration();
- evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult);
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType());
- assertEquals(savedScore, evaluator.getHighScore());
- assertSame(savedScanResult, evaluator.getScanResultCandidate());
- }
-
- /**
- * Case #44 Ensure the ExternalScoreEvaluator correctly selects the saved network out of
- * multiple options.
- *
- * In this test. we simulate following scenario:
- * The ExternalScoreEvaluator is asked to evaluate 2 untrusted networks and 2 saved networks.
- * The high scores are equal and the low scores differ.
- *
- * expected result: The saved network is determined to be the best network.
- */
- @Test
- public void externalScoreEvaluator_multipleScores() {
- WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator =
- new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true);
- ScanResult untrustedScanResult = new ScanResult();
- int untrustedScore = 100;
- evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult);
- evaluator.evalUntrustedCandidate(80, new ScanResult());
-
- ScanResult savedScanResult = new ScanResult();
- int savedScore = 100;
- WifiConfiguration savedConfig = new WifiConfiguration();
- evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult);
- evaluator.evalSavedCandidate(90, new WifiConfiguration(), new ScanResult());
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType());
- assertEquals(savedScore, evaluator.getHighScore());
- assertSame(savedScanResult, evaluator.getScanResultCandidate());
- }
-
- /**
- * Case #45 Ensure the ExternalScoreEvaluator correctly handles NULL score inputs.
- *
- * In this test we simulate following scenario:
- * The ExternalScoreEvaluator is asked to evaluate both types of candidates with NULL scores.
- *
- * expected result: No crashes. The best candidate type is returned as NONE.
- */
- @Test
- public void externalScoreEvaluator_nullScores() {
- WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator =
- new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true);
- evaluator.evalUntrustedCandidate(null, new ScanResult());
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.NONE, evaluator.getBestCandidateType());
- evaluator.evalSavedCandidate(null, new WifiConfiguration(), new ScanResult());
- assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator
- .BestCandidateType.NONE, evaluator.getBestCandidateType());
- }
-
- /**
- * Case #48 5GHz due to user band preference is set to AUTO
- *
- * In this test. we simulate following scenario
- * WifiStateMachine is under disconnected state
- * User band preference is set to AUTO
- * Two networks test1, test2 are secured network
- * Both network are enabled
- * test1 is @ 2GHz with RSSI -50
- * test2 is @ 5Ghz with RSSI -50
- *
- * Expected behavior: test2 is chosen due to 5G bonus and user band preference
- * is set to AUTO.
- */
- @Test
- public void chooseNetworkDisconnectUserPreferAutoBandTest() {
- String[] ssids = DEFAULT_SSIDS;
- String[] bssids = DEFAULT_BSSIDS;
- int[] frequencies = {2437, 5180};
- String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
- int[] levels = {-50, -50};
- int[] security = {SECURITY_PSK, SECURITY_PSK};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
-
- scanResultLinkConfiguration(savedConfigs, scanDetails);
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- verifySelectedResult(chosenScanResult, candidate);
- }
-
- /**
- * Case #49 Choose 2.4GHz BSSID with stronger RSSI value over
- * 5GHz BSSID with weaker RSSI value
- *
- * In this test. we simulate following scenario:
- * Two APs are found in scan results
- * BSSID1 is @ 5GHz with RSSI -82
- * BSSID2 is @ 2Ghz with RSSI -72
- * These two BSSIDs get exactly the same QNS score
- *
- * expect BSSID2 to be chosen as it has stronger RSSI value
- */
- @Test
- public void chooseStrongerRssiOver5GHz() {
- String[] ssids = {"\"test1\"", "\"test1\""};
- String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
- int[] frequencies = {5220, 2437};
- String[] caps = {"[ESS]", "[ESS]"};
- int[] levels = {-82, -72};
- int[] security = {SECURITY_NONE, SECURITY_NONE};
-
- List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels);
- WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security);
- prepareConfigStore(savedConfigs);
- scanResultLinkConfiguration(savedConfigs, scanDetails);
-
- ScanResult chosenScanResult = scanDetails.get(1).getScanResult();
-
- WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false,
- false, false, false, true, false, scanDetails);
-
- verifySelectedResult(chosenScanResult, candidate);
- }
-}