From f14e4b8fdd949b4ba0feb63dded4d9b233859300 Mon Sep 17 00:00:00 2001 From: Amin Shaikh Date: Fri, 14 Apr 2017 15:02:09 -0700 Subject: Create ScoredNetworkEvaluator. - Bring back WifiNetworkScoreCache into the wifi framework - Replace RecommendedNetworkEvaluator with ScoredNetworkEvalutor, which is the same as the previous ExternalScoreEvaluator (ag/1865733) with some changes: * Check whether a ScanResult matches the current network by comparing the matching WifiConfiguration instead of the current bssid * Only create untrusted WifiConfigurations for open networks * Set candidate ScanResults for all WifiConfigurations - not only the final chosen WifiConfiguration * Mark newly created ephemeral WifiConfiguration as enabled for network selection * Log a maximum of one LocalLog line per round of network selection Bug: 37357981 Test: ./test/wifitests/runtests.sh Change-Id: I99da4edb371928efb7ca7a9dcd28ddaca9209da8 --- .../wifi/RecommendedNetworkEvaluatorTest.java | 551 -------------------- .../server/wifi/ScoredNetworkEvaluatorTest.java | 577 +++++++++++++++++++++ .../server/wifi/WifiNetworkSelectorTestUtil.java | 21 +- 3 files changed, 594 insertions(+), 555 deletions(-) delete mode 100644 tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java create mode 100644 tests/wifitests/src/com/android/server/wifi/ScoredNetworkEvaluatorTest.java (limited to 'tests') diff --git a/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java b/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java deleted file mode 100644 index ef4f0a3fe..000000000 --- a/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java +++ /dev/null @@ -1,551 +0,0 @@ -/* - * 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 junit.framework.Assert.assertNull; -import static junit.framework.Assert.assertTrue; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertSame; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyString; -import static org.mockito.Mockito.*; - -import android.content.ContentResolver; -import android.content.Context; -import android.database.ContentObserver; -import android.net.NetworkKey; -import android.net.NetworkScoreManager; -import android.net.RecommendationRequest; -import android.net.RecommendationResult; -import android.net.Uri; -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.os.Looper; -import android.os.Process; -import android.provider.Settings; -import android.test.suitebuilder.annotation.SmallTest; -import android.util.ArraySet; -import android.util.LocalLog; -import android.util.Pair; - -import com.android.server.wifi.util.ScanResultUtil; - -import com.google.android.collect.Lists; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; - -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -/** - * Unit tests for {@link RecommendedNetworkEvaluator}. - */ -@SmallTest -public class RecommendedNetworkEvaluatorTest { - private ScanDetail mTrustedScanDetail; - private ScanDetail mUntrustedScanDetail; - private ScanDetail mEphemeralScanDetail; - private WifiConfiguration mTrustedWifiConfiguration; - private WifiConfiguration mUntrustedWifiConfiguration; - private WifiConfiguration mEphemeralWifiConfiguration; - private ContentObserver mContentObserver; - - @Mock private Context mContext; - @Mock private ContentResolver mContentResolver; - @Mock private FrameworkFacade mFrameworkFacade; - @Mock private NetworkScoreManager mNetworkScoreManager; - @Mock private WifiConfigManager mWifiConfigManager; - - @Captor private ArgumentCaptor mNetworkKeyArrayCaptor; - @Captor private ArgumentCaptor mRecommendationRequestCaptor; - - private RecommendedNetworkEvaluator mRecommendedNetworkEvaluator; - - @Before - public void setUp() throws Exception { - mTrustedScanDetail = buildScanDetail("ssid"); - mUntrustedScanDetail = buildScanDetail("ssid1"); - mEphemeralScanDetail = buildScanDetail("ssid2"); - - mTrustedWifiConfiguration = new WifiConfiguration(); - mTrustedWifiConfiguration.networkId = 5; - mTrustedWifiConfiguration.SSID = mTrustedScanDetail.getSSID(); - mTrustedWifiConfiguration.BSSID = mTrustedScanDetail.getBSSIDString(); - mTrustedWifiConfiguration.getNetworkSelectionStatus().setCandidate( - mTrustedScanDetail.getScanResult()); - - mUntrustedWifiConfiguration = new WifiConfiguration(); - mUntrustedWifiConfiguration.networkId = 6; - mUntrustedWifiConfiguration.SSID = mUntrustedScanDetail.getSSID(); - mUntrustedWifiConfiguration.BSSID = mUntrustedScanDetail.getBSSIDString(); - - mEphemeralWifiConfiguration = new WifiConfiguration(); - mEphemeralWifiConfiguration.SSID = mEphemeralScanDetail.getSSID(); - mEphemeralWifiConfiguration.BSSID = mEphemeralScanDetail.getBSSIDString(); - mEphemeralWifiConfiguration.ephemeral = true; - - MockitoAnnotations.initMocks(this); - - when(mFrameworkFacade.getIntegerSetting(mContext, - Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) - .thenReturn(1); - long dayMillis = TimeUnit.DAYS.toMillis(1); - when(mFrameworkFacade.getLongSetting(mContext, - Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS, dayMillis)) - .thenReturn(dayMillis); - - ArgumentCaptor observerCaptor = - ArgumentCaptor.forClass(ContentObserver.class); - mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(mContext, mContentResolver, - Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager, - mWifiConfigManager, new LocalLog(0)); - verify(mFrameworkFacade).registerContentObserver(eq(mContext), any(Uri.class), eq(false), - observerCaptor.capture()); - mContentObserver = observerCaptor.getValue(); - - reset(mNetworkScoreManager); - - when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail)) - .thenReturn(mTrustedWifiConfiguration); - when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mUntrustedScanDetail)) - .thenReturn(null); - when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mEphemeralScanDetail)) - .thenReturn(mEphemeralWifiConfiguration); - when(mWifiConfigManager.getConfiguredNetwork(mTrustedWifiConfiguration.networkId)) - .thenReturn(mTrustedWifiConfiguration); - when(mWifiConfigManager.getSavedNetworks()) - .thenReturn(Lists.newArrayList(mTrustedWifiConfiguration)); - } - - @Test - public void testUpdate_recommendationsDisabled() { - ArrayList scanDetails = new ArrayList<>(); - when(mFrameworkFacade.getIntegerSetting(mContext, - Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) - .thenReturn(0); - - mContentObserver.onChange(false /* unused */); - - mRecommendedNetworkEvaluator.update(scanDetails); - - verifyZeroInteractions(mNetworkScoreManager); - verify(mWifiConfigManager).updateNetworkNotRecommended( - mTrustedWifiConfiguration.networkId, false /* notRecommended */); - } - - @Test - public void testUpdate_emptyScanList() { - mRecommendedNetworkEvaluator.update(new ArrayList()); - - verifyZeroInteractions(mNetworkScoreManager); - verify(mWifiConfigManager).updateNetworkNotRecommended( - mTrustedWifiConfiguration.networkId, false /* notRecommended */); - } - - @Test - public void testUpdate_allNetworksUnscored() { - mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail, - mUntrustedScanDetail)); - - verify(mWifiConfigManager).updateNetworkNotRecommended( - mTrustedWifiConfiguration.networkId, false /* notRecommended */); - verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture()); - assertEquals(2, mNetworkKeyArrayCaptor.getValue().length); - NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID( - mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString())); - assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]); - expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID( - mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString())); - assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[1]); - } - - @Test - public void testUpdate_oneScored_twoScored() { - mRecommendedNetworkEvaluator.update(Lists.newArrayList(mUntrustedScanDetail)); - - // Next scan should only trigger a request for the trusted network. - mRecommendedNetworkEvaluator.update( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail)); - - verify(mWifiConfigManager, times(2)).updateNetworkNotRecommended( - mTrustedWifiConfiguration.networkId, false /* notRecommended */); - verify(mNetworkScoreManager, times(2)).requestScores(mNetworkKeyArrayCaptor.capture()); - - NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(0); - assertEquals(1, requestedScores.length); - NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID( - mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString())); - assertEquals(expectedNetworkKey, requestedScores[0]); - - requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(1); - assertEquals(1, requestedScores.length); - expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID( - mTrustedScanDetail.getSSID()), mTrustedScanDetail.getBSSIDString())); - assertEquals(expectedNetworkKey, requestedScores[0]); - } - - @Test - public void testEvaluateNetworks_recommendationsDisabled() { - when(mFrameworkFacade.getIntegerSetting(mContext, - Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) - .thenReturn(0); - - mContentObserver.onChange(false /* unused */); - - mRecommendedNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null); - - verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager); - } - - @Test - public void testEvaluateNetworks_emptyScanList() { - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - new ArrayList(), null, null, false, - false /* untrustedNetworkAllowed */, null); - - assertNull(result); - verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager); - } - - @Test - public void testEvaluateNetworks_onlyTrustedNetworksAllowed_noTrustedInScanList() { - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mUntrustedScanDetail), null, null, false, - false /* untrustedNetworkAllowed */, null); - - assertNull(result); - verifyZeroInteractions(mNetworkScoreManager); - } - - @Test - public void testEvaluateNetworks_untrustedNetworksAllowed_onlyDeletedEphemeral() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(ScanResultUtil - .createQuotedSSID(mUntrustedScanDetail.getScanResult().SSID))) - .thenReturn(true); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mUntrustedScanDetail), null, null, false, - true /* untrustedNetworkAllowed */, null); - - assertNull(result); - verifyZeroInteractions(mNetworkScoreManager); - } - - @Test - public void testEvaluateNetworks_recommendation_onlyTrustedNetworkAllowed() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult - .createConnectRecommendation(mTrustedWifiConfiguration)); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, false /* untrustedNetworkAllowed */, null); - - assertEquals(mTrustedWifiConfiguration, result); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(1, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - verify(mWifiConfigManager).setNetworkCandidateScanResult( - mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0); - } - - @Test - public void testEvaluateNetworks_trustedRecommendation_untrustedNetworksAllowed() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult - .createConnectRecommendation(mTrustedWifiConfiguration)); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - assertEquals(mTrustedWifiConfiguration, result); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - assertEquals(mUntrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[1]); - verify(mWifiConfigManager).setNetworkCandidateScanResult( - mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0); - } - - @Test - public void testEvaluateNetworks_trustedRecommendation_anyBssidSpecified() { - WifiConfiguration recommendedNetwork = new WifiConfiguration(); - recommendedNetwork.SSID = mTrustedWifiConfiguration.SSID; - recommendedNetwork.BSSID = "any"; - - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createConnectRecommendation(recommendedNetwork)); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail), - null, null, false, false /* untrustedNetworkAllowed */, null); - - assertEquals(mTrustedWifiConfiguration, result); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(1, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - verify(mWifiConfigManager).setNetworkCandidateScanResult( - mTrustedWifiConfiguration.networkId, mTrustedScanDetail.getScanResult(), 0); - } - - @Test - public void testEvaluateNetworks_untrustedRecommendation_untrustedNetworksAllowed() { - NetworkUpdateResult networkUpdateResult = new NetworkUpdateResult(10); - when(mWifiConfigManager.addOrUpdateNetwork(mUntrustedWifiConfiguration, Process.WIFI_UID)) - .thenReturn(networkUpdateResult); - when(mWifiConfigManager.getConfiguredNetwork(networkUpdateResult.getNetworkId())) - .thenReturn(mUntrustedWifiConfiguration); - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult - .createConnectRecommendation(mUntrustedWifiConfiguration)); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - assertEquals(mUntrustedWifiConfiguration, result); - assertNull(result.BSSID); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - assertEquals(mUntrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[1]); - verify(mWifiConfigManager).setNetworkCandidateScanResult( - networkUpdateResult.getNetworkId(), mUntrustedScanDetail.getScanResult(), 0); - verify(mWifiConfigManager, never()).updateNetworkSelectionStatus(anyInt(), anyInt()); - } - - @Test - public void testEvaluateNetworks_untrustedRecommendation_updateFailed() { - NetworkUpdateResult networkUpdateResult = new NetworkUpdateResult( - WifiConfiguration.INVALID_NETWORK_ID); - when(mWifiConfigManager.addOrUpdateNetwork(mUntrustedWifiConfiguration, Process.WIFI_UID)) - .thenReturn(networkUpdateResult); - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult - .createConnectRecommendation(mUntrustedWifiConfiguration)); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - assertNull(result); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - assertEquals(mUntrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[1]); - verify(mWifiConfigManager, never()) - .setNetworkCandidateScanResult(anyInt(), any(ScanResult.class), anyInt()); - } - - @Test - public void testEvaluateNetworks_doNotConnectRecommendation_untrustedNetworksAllowed() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - assertNull(result); - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertEquals(2, mRecommendationRequestCaptor.getValue().getScanResults().length); - assertEquals(mTrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[0]); - assertEquals(mUntrustedScanDetail.getScanResult(), - mRecommendationRequestCaptor.getValue().getScanResults()[1]); - verify(mWifiConfigManager) - .updateNetworkNotRecommended(mTrustedWifiConfiguration.networkId, true); - } - - @Test - public void testEvaluateNetworks_nullRecommendation() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(null); - - WifiConfiguration result = mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - null, null, false, false /* untrustedNetworkAllowed */, null); - - assertNull(result); - verify(mNetworkScoreManager).requestRecommendation(any(RecommendationRequest.class)); - verify(mWifiConfigManager, never()).updateNetworkSelectionStatus(anyInt(), anyInt()); - } - - @Test - public void testEvaluateNetworks_requestContainsCurrentNetwork() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail), - mTrustedWifiConfiguration, null, false, true /* untrustedNetworkAllowed */, null); - - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - assertSame(mTrustedWifiConfiguration, - mRecommendationRequestCaptor.getValue().getConnectedConfig()); - verify(mWifiConfigManager) - .updateNetworkNotRecommended(mTrustedWifiConfiguration.networkId, true); - } - - @Test - public void testEvaluateNetworks_requestConnectableNetworks() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail, - mEphemeralScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - RecommendationRequest request = mRecommendationRequestCaptor.getValue(); - assertEquals(2, request.getConnectableConfigs().length); - Set ssids = new ArraySet<>(); - for (WifiConfiguration config : request.getConnectableConfigs()) { - ssids.add(config.SSID); - } - Set expectedSsids = new ArraySet<>(); - expectedSsids.add(mTrustedWifiConfiguration.SSID); - expectedSsids.add(mEphemeralWifiConfiguration.SSID); - assertEquals(expectedSsids, ssids); - } - - @Test - public void testEvaluateNetworks_requestConnectableNetworks_filterDisabledNetworks() { - WifiConfiguration disabledWifiConfiguration = mTrustedWifiConfiguration; - disabledWifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus( - NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED); - when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail)) - .thenReturn(disabledWifiConfiguration); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - RecommendationRequest request = mRecommendationRequestCaptor.getValue(); - assertEquals(1, request.getConnectableConfigs().length); - assertEquals(mEphemeralWifiConfiguration, request.getConnectableConfigs()[0]); - } - - @Test - public void testEvaluateNetworks_scanResultMarkedAsUntrusted_configIsEphemeral() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - mRecommendedNetworkEvaluator.evaluateNetworks(Lists.newArrayList(mEphemeralScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - RecommendationRequest request = mRecommendationRequestCaptor.getValue(); - assertEquals(1, request.getScanResults().length); - assertTrue(request.getScanResults()[0].untrusted); - } - - @Test - public void testEvaluateNetworks_potentialConnectableNetworksPopulated() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - List> potentialConnectableNetworks = new ArrayList<>(); - mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail, - mUntrustedScanDetail), null, null, false, - true /* untrustedNetworkAllowed */, potentialConnectableNetworks); - - assertEquals(3, potentialConnectableNetworks.size()); - Pair expectedTrustedPair = - Pair.create(mTrustedScanDetail, mTrustedWifiConfiguration); - Pair expectedUntrustedPair = - Pair.create(mUntrustedScanDetail, null); - Pair expectedEphemPair = - Pair.create(mEphemeralScanDetail, mEphemeralWifiConfiguration); - assertTrue(potentialConnectableNetworks.contains(expectedTrustedPair)); - assertTrue(potentialConnectableNetworks.contains(expectedUntrustedPair)); - assertTrue(potentialConnectableNetworks.contains(expectedEphemPair)); - } - - @Test - public void testEvaluateNetworks_potentialConnectableNetworksIsNull() { - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mNetworkScoreManager.requestRecommendation(any(RecommendationRequest.class))) - .thenReturn(RecommendationResult.createDoNotConnectRecommendation()); - - mRecommendedNetworkEvaluator.evaluateNetworks( - Lists.newArrayList(mTrustedScanDetail, mEphemeralScanDetail, - mUntrustedScanDetail), - null, null, false, true /* untrustedNetworkAllowed */, null); - - // should not throw a NPE. - } - - @Test - public void testEvaluateNetworks_requestContainsLastSelectedNetwork() { - int lastSelectedNetworkId = 5; - long lastSelectedTimestamp = 1000; - when(mWifiConfigManager.wasEphemeralNetworkDeleted(anyString())).thenReturn(false); - when(mWifiConfigManager.getLastSelectedNetwork()).thenReturn(lastSelectedNetworkId); - when(mWifiConfigManager.getLastSelectedTimeStamp()).thenReturn(lastSelectedTimestamp); - - mRecommendedNetworkEvaluator.evaluateNetworks(Lists.newArrayList(mTrustedScanDetail), - null, null, false, false /* untrustedNetworkAllowed */, null); - - verify(mNetworkScoreManager).requestRecommendation(mRecommendationRequestCaptor.capture()); - RecommendationRequest request = mRecommendationRequestCaptor.getValue(); - assertEquals(lastSelectedNetworkId, request.getLastSelectedNetworkId()); - assertEquals(lastSelectedTimestamp, request.getLastSelectedNetworkTimestamp()); - } - - private static ScanDetail buildScanDetail(String ssid) { - return new ScanDetail(WifiSsid.createFromAsciiEncoded(ssid), - "00:00:00:00:00:00", "", 0, 0, 0, 0); - } -} diff --git a/tests/wifitests/src/com/android/server/wifi/ScoredNetworkEvaluatorTest.java b/tests/wifitests/src/com/android/server/wifi/ScoredNetworkEvaluatorTest.java new file mode 100644 index 000000000..55b00c9b5 --- /dev/null +++ b/tests/wifitests/src/com/android/server/wifi/ScoredNetworkEvaluatorTest.java @@ -0,0 +1,577 @@ +/* + * 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.database.ContentObserver; +import android.net.NetworkKey; +import android.net.NetworkScoreManager; +import android.net.Uri; +import android.net.wifi.ScanResult; +import android.net.wifi.WifiConfiguration; +import android.net.wifi.WifiNetworkScoreCache; +import android.os.Looper; +import android.os.SystemClock; +import android.provider.Settings; +import android.test.suitebuilder.annotation.SmallTest; +import android.util.LocalLog; + +import com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.ArrayList; +import java.util.List; + +/** + * Unit tests for {@link ScoredNetworkEvaluator}. + */ +@SmallTest +public class ScoredNetworkEvaluatorTest { + private ContentObserver mContentObserver; + private int mThresholdQualifiedRssi2G; + private int mThresholdQualifiedRssi5G; + + @Mock private Context mContext; + @Mock private Clock mClock; + @Mock private FrameworkFacade mFrameworkFacade; + @Mock private NetworkScoreManager mNetworkScoreManager; + @Mock private WifiConfigManager mWifiConfigManager; + + @Captor private ArgumentCaptor mNetworkKeyArrayCaptor; + + private WifiNetworkScoreCache mScoreCache; + private ScoredNetworkEvaluator mScoredNetworkEvaluator; + + @Before + public void setUp() throws Exception { + mThresholdQualifiedRssi2G = -73; + mThresholdQualifiedRssi5G = -70; + + MockitoAnnotations.initMocks(this); + + when(mFrameworkFacade.getIntegerSetting(mContext, + Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) + .thenReturn(1); + + ArgumentCaptor observerCaptor = + ArgumentCaptor.forClass(ContentObserver.class); + mScoreCache = new WifiNetworkScoreCache(mContext); + mScoredNetworkEvaluator = new ScoredNetworkEvaluator(mContext, + Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager, + mWifiConfigManager, new LocalLog(0), mScoreCache); + verify(mFrameworkFacade).registerContentObserver(eq(mContext), any(Uri.class), eq(false), + observerCaptor.capture()); + mContentObserver = observerCaptor.getValue(); + + reset(mNetworkScoreManager); + + when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime()); + } + + @After + public void tearDown() { + validateMockitoUsage(); + } + + @Test + public void testUpdate_recommendationsDisabled() { + 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); + + when(mFrameworkFacade.getIntegerSetting(mContext, + Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) + .thenReturn(0); + + mContentObserver.onChange(false /* unused */); + + mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails()); + + verifyZeroInteractions(mNetworkScoreManager); + } + + @Test + public void testUpdate_emptyScanList() { + 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); + + mScoredNetworkEvaluator.update(new ArrayList()); + + verifyZeroInteractions(mNetworkScoreManager); + } + + @Test + public void testUpdate_allNetworksUnscored() { + 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 + 10}; + + ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil + .setupScanDetailsAndConfigStore( + ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock); + + mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails()); + + verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture()); + assertEquals(2, mNetworkKeyArrayCaptor.getValue().length); + NetworkKey expectedNetworkKey = NetworkKey.createFromScanResult( + scanDetailsAndConfigs.getScanDetails().get(0).getScanResult()); + assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]); + expectedNetworkKey = NetworkKey.createFromScanResult( + scanDetailsAndConfigs.getScanDetails().get(1).getScanResult()); + assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[1]); + } + + @Test + public void testUpdate_oneScored_oneUnscored() { + 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 + 10}; + + ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil + .setupScanDetailsAndConfigStore( + ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock); + + List scoredScanDetails = scanDetailsAndConfigs.getScanDetails().subList(0, 1); + Integer[] scores = {120}; + boolean[] meteredHints = {true}; + WifiNetworkSelectorTestUtil.configureScoreCache( + mScoreCache, scoredScanDetails, scores, meteredHints); + + mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails()); + + verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture()); + + NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getValue(); + assertEquals(1, requestedScores.length); + NetworkKey expectedNetworkKey = NetworkKey.createFromScanResult( + scanDetailsAndConfigs.getScanDetails().get(1).getScanResult()); + assertEquals(expectedNetworkKey, requestedScores[0]); + } + + @Test + public void testEvaluateNetworks_recommendationsDisabled() { + when(mFrameworkFacade.getIntegerSetting(mContext, + Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0)) + .thenReturn(0); + + mContentObserver.onChange(false /* unused */); + + mScoredNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null); + + verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager); + } + + /** + * When no saved networks available, choose the available ephemeral networks + * if untrusted networks are allowed. + */ + @Test + public void testEvaluateNetworks_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 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, scanDetails.get(1), meteredHints[1]); + + // Untrusted networks allowed. + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_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 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, scanDetails.get(i), meteredHints[i]); + } + + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_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 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); + + WifiNetworkSelectorTestUtil.setupEphemeralNetwork( + mWifiConfigManager, 1, scanDetails.get(1), meteredHints[1]); + + // Untrusted networks not allowed. + WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails, + null, null, false, false, null); + + assertEquals("Expect null configuration", null, candidate); + } + + /** + * Choose externally scored saved network. + */ + @Test + public void testEvaluateNetworks_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}; + + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock); + List scanDetails = scanDetailsAndConfigs.getScanDetails(); + WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs(); + savedConfigs[0].useExternalScores = true; + + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, scores, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_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}; + + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock); + List scanDetails = scanDetailsAndConfigs.getScanDetails(); + WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs(); + savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true; + + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, scores, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_chooseExternallyScoredOverUntrustedNetworksWithSameScore() { + 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}; + + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock); + List scanDetails = scanDetailsAndConfigs.getScanDetails(); + WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs(); + savedConfigs[0].useExternalScores = true; + + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, scores, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_chooseUntrustedWithHigherScoreThanExternallyScoredNetwork() { + // 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. + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(savedSsids, + savedBssids, savedFreqs, savedCaps, savedLevels, savedSecurities, + mWifiConfigManager, mClock); + List 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, scanDetails.get(1), + meteredHints[1]); + + // Set up score cache for both the saved network and the ephemeral network. + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, scores, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.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 testEvaluateNetworks_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}; + + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock); + List scanDetails = scanDetailsAndConfigs.getScanDetails(); + WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs(); + savedConfigs[0].useExternalScores = true; + + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, scores, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails, + null, null, false, true, null); + + assertEquals("Expect null configuration", null, candidate); + } + + /** + * Between two ephemeral networks with the same RSSI, choose + * the currently connected one. + */ + @Test + public void testEvaluateNetworks_chooseActiveEphemeralNetwork() { + 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 + 28, mThresholdQualifiedRssi2G + 28}; + boolean[] meteredHints = {true, true}; + ScanResult[] scanResults = new ScanResult[2]; + WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2]; + + List scanDetails = WifiNetworkSelectorTestUtil + .buildScanDetails(ssids, bssids, freqs, caps, levels, mClock); + + WifiNetworkSelectorTestUtil.configureScoreCache( + mScoreCache, scanDetails, null, 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, scanDetails.get(i), meteredHints[i]); + } + + WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks( + scanDetails, ephemeralNetworkConfigs[1], + bssids[1], true, true, null); + + WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate); + WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager, + scanResults[1], candidate); + assertEquals(meteredHints[1], candidate.meteredHint); + } + + /** + * Between two externally scored saved networks with the same RSSI, choose + * the currently connected one. + */ + @Test + public void testEvaluateNetworks_chooseActiveSavedNetwork() { + 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 + 28, mThresholdQualifiedRssi2G + 28}; + boolean[] meteredHints = {false, false}; + + WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock); + List scanDetails = scanDetailsAndConfigs.getScanDetails(); + WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs(); + savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true; + + WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache, + scanDetails, null, meteredHints); + + WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails, + savedConfigs[1], bssids[1], true, true, null); + + WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate); + WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager, + scanDetails.get(1).getScanResult(), candidate); + } +} diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java index 1e255c86c..9c78c9b12 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTestUtil.java @@ -177,7 +177,7 @@ public class WifiNetworkSelectorTestUtil { * @param wifiConfigManager the mocked WifiConfigManager * @param configs input configuration need to be added to WifiConfigureStore */ - private static void prepareConfigStore(WifiConfigManager wifiConfigManager, + private static void prepareConfigStore(final WifiConfigManager wifiConfigManager, final WifiConfiguration[] configs) { when(wifiConfigManager.getConfiguredNetwork(anyInt())) .then(new AnswerWithArguments() { @@ -356,18 +356,22 @@ public class WifiNetworkSelectorTestUtil { * * @param wifiConfigManager WifiConfigManager mock * @param networkId ID of the ephemeral network - * @param scanResult scanResult of the ephemeral network + * @param scanDetail scanDetail 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) { + int networkId, ScanDetail scanDetail, 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); + final WifiConfiguration config = + ScanResultUtil.createNetworkFromScanResult(scanDetail.getScanResult()); + config.ephemeral = true; config.networkId = networkId; config.meteredHint = meteredHint; + when(wifiConfigManager.getSavedNetworkForScanDetailAndCache(eq(scanDetail))) + .thenReturn(new WifiConfiguration(config)); when(wifiConfigManager.getConfiguredNetwork(eq(networkId))) .then(new AnswerWithArguments() { public WifiConfiguration answer(int netId) { @@ -385,6 +389,15 @@ public class WifiNetworkSelectorTestUtil { return true; } }); + when(wifiConfigManager.updateNetworkSelectionStatus(eq(networkId), + eq(WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE))) + .then(new AnswerWithArguments() { + public boolean answer(int netId, int status) { + config.getNetworkSelectionStatus().setNetworkSelectionStatus( + WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLE); + return true; + } + }); return config; } } -- cgit v1.2.3