Remove ExternalScoreEvaluator.
Also remove WifiNetworkScoreCache usage from the wifi framework and
instead maintain a cache of requested WifiKeys.
Bug: 33694078, 19948759
Test: ./runtests.sh
Change-Id: Ib4ba372f0fd4802d111a4f1ab609a26a4f34c399
diff --git a/service/java/com/android/server/wifi/ExternalScoreEvaluator.java b/service/java/com/android/server/wifi/ExternalScoreEvaluator.java
deleted file mode 100644
index 0e12289..0000000
--- a/service/java/com/android/server/wifi/ExternalScoreEvaluator.java
+++ /dev/null
@@ -1,381 +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 android.annotation.Nullable;
-import android.content.Context;
-import android.net.NetworkKey;
-import android.net.NetworkScoreManager;
-import android.net.WifiKey;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiNetworkScoreCache;
-import android.os.Process;
-import android.text.TextUtils;
-import android.util.LocalLog;
-import android.util.Pair;
-
-import com.android.server.wifi.util.ScanResultUtil;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * This class is the WifiNetworkSelector.NetworkEvaluator implementation for
- * externally scored networks.
- * @deprecated TODO(b/33694078): remove this evaluator in favor of RecommendedNetworkEvaluator
- */
-@Deprecated
-public class ExternalScoreEvaluator implements WifiNetworkSelector.NetworkEvaluator {
- private static final String NAME = "WifiExternalScoreEvaluator";
- private final WifiConfigManager mWifiConfigManager;
- private final Clock mClock;
- private final LocalLog mLocalLog;
- private final NetworkScoreManager mScoreManager;
- private final WifiNetworkScoreCache mScoreCache;
-
- ExternalScoreEvaluator(Context context, WifiConfigManager configManager,
- WifiNetworkScoreCache scoreCache, Clock clock, LocalLog localLog) {
- mWifiConfigManager = configManager;
- mClock = clock;
- mLocalLog = localLog;
- mScoreCache = scoreCache;
- mScoreManager =
- (NetworkScoreManager) context.getSystemService(Context.NETWORK_SCORE_SERVICE);
- if (mScoreManager != null) {
- mScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mScoreCache);
- } else {
- localLog("Couldn't get NETWORK_SCORE_SERVICE.");
- }
- }
-
- private void localLog(String log) {
- if (mLocalLog != null) {
- mLocalLog.log(log);
- }
- }
-
- /**
- * Get the evaluator name.
- */
- public String getName() {
- return NAME;
- }
-
- private void updateNetworkScoreCache(List<ScanDetail> scanDetails) {
- ArrayList<NetworkKey> unscoredNetworks = new ArrayList<NetworkKey>();
-
- for (ScanDetail scanDetail : scanDetails) {
- ScanResult scanResult = scanDetail.getScanResult();
-
- // Is there a score for this network? If not, request a score.
- if (mScoreCache != null && !mScoreCache.isScoredNetwork(scanResult)) {
- WifiKey wifiKey;
-
- try {
- wifiKey = new WifiKey("\"" + scanResult.SSID + "\"", scanResult.BSSID);
- NetworkKey ntwkKey = new NetworkKey(wifiKey);
- unscoredNetworks.add(ntwkKey);
- } catch (IllegalArgumentException e) {
- localLog("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
- + " for network score. Skip.");
- }
- }
- }
-
- // Kick the score manager if there is any unscored network.
- if (mScoreManager != null && unscoredNetworks.size() != 0) {
- NetworkKey[] unscoredNetworkKeys =
- unscoredNetworks.toArray(new NetworkKey[unscoredNetworks.size()]);
- mScoreManager.requestScores(unscoredNetworkKeys);
- }
- }
-
- /**
- * Update the evaluator.
- */
- public void update(List<ScanDetail> scanDetails) {
- updateNetworkScoreCache(scanDetails);
- }
-
- private boolean isPotentialEphemeralNetwork(List<WifiConfiguration> associatedConfigurations) {
- if (associatedConfigurations == null) {
- return true;
- } else if (associatedConfigurations.size() == 1) {
- // If there is more than one associated networks, it must be a passpoint network.
- // Hence it is not a ephemeral network.
- WifiConfiguration network = associatedConfigurations.get(0);
- if (network.ephemeral) {
- return true;
- }
- }
- return false;
- }
-
- private WifiConfiguration getPotentialEphemeralNetworkConfiguration(
- List<WifiConfiguration> associatedConfigurations) {
- if (associatedConfigurations == null) {
- return null;
- } else {
- WifiConfiguration network = associatedConfigurations.get(0);
- return network;
- }
- }
-
- /**
- * Returns the available external network score or null if no score is available.
- *
- * @param scanResult The scan result of the network to score.
- * @param scoreCache Wifi network score cache.
- * @param active Flag which indicates whether this is the currently connected network.
- * @return A valid external score if one is available or NULL.
- */
- @Nullable
- Integer getNetworkScore(ScanResult scanResult, WifiNetworkScoreCache scoreCache,
- boolean active) {
- if (scoreCache != null && scoreCache.isScoredNetwork(scanResult)) {
- int score = scoreCache.getNetworkScore(scanResult, active);
- localLog(WifiNetworkSelector.toScanId(scanResult) + " has score: " + score
- + " active network: " + active);
- return score;
- }
- return null;
- }
-
- /**
- * Returns the best candidate network according to the given ExternalScoreEvaluator.
- */
- @Nullable
- WifiConfiguration getExternalScoreCandidate(ExternalScoreTracker scoreTracker,
- WifiNetworkScoreCache scoreCache) {
- int candidateNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
- switch (scoreTracker.getBestCandidateType()) {
- case ExternalScoreTracker.EXTERNAL_SCORED_UNTRUSTED_NETWORK:
- ScanResult untrustedScanResultCandidate =
- scoreTracker.getScanResultCandidate();
- WifiConfiguration unTrustedNetworkCandidate =
- ScanResultUtil.createNetworkFromScanResult(untrustedScanResultCandidate);
-
- // Mark this config as ephemeral so it isn't persisted.
- unTrustedNetworkCandidate.ephemeral = true;
- if (scoreCache != null) {
- unTrustedNetworkCandidate.meteredHint =
- scoreCache.getMeteredHint(untrustedScanResultCandidate);
- }
- NetworkUpdateResult result =
- mWifiConfigManager.addOrUpdateNetwork(unTrustedNetworkCandidate,
- Process.WIFI_UID);
- if (!result.isSuccess()) {
- localLog("Failed to add ephemeral network");
- break;
- }
- candidateNetworkId = result.getNetworkId();
- mWifiConfigManager.setNetworkCandidateScanResult(candidateNetworkId,
- untrustedScanResultCandidate, 0);
- localLog(String.format("new ephemeral candidate %s network ID:%d, "
- + "meteredHint=%b",
- WifiNetworkSelector.toScanId(untrustedScanResultCandidate),
- candidateNetworkId,
- unTrustedNetworkCandidate.meteredHint));
- break;
-
- case ExternalScoreTracker.EXTERNAL_SCORED_SAVED_NETWORK:
- ScanResult scanResultCandidate = scoreTracker.getScanResultCandidate();
- candidateNetworkId = scoreTracker.getSavedConfig().networkId;
- mWifiConfigManager.setNetworkCandidateScanResult(candidateNetworkId,
- scanResultCandidate, 0);
- localLog(String.format("new saved network candidate %s network ID:%d",
- WifiNetworkSelector.toScanId(scanResultCandidate),
- candidateNetworkId));
- break;
-
- case ExternalScoreTracker.EXTERNAL_SCORED_NONE:
- localLog("did not see any good candidates.");
- break;
-
- default:
- localLog("Unhandled case. No candidate selected.");
- break;
- }
- return mWifiConfigManager.getConfiguredNetwork(candidateNetworkId);
- }
-
- /**
- * Evaluate all the networks from the scan results and return
- * the WifiConfiguration of the network chosen for connection.
- *
- * @return configuration of the chosen network;
- * null if no network in this category is available.
- */
- public WifiConfiguration evaluateNetworks(List<ScanDetail> scanDetails,
- WifiConfiguration currentNetwork, String currentBssid, boolean connected,
- boolean untrustedNetworkAllowed,
- List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks) {
- if (mScoreCache == null) {
- localLog("has no network score cache.");
- return null;
- }
-
- final ExternalScoreTracker externalScoreTracker = new ExternalScoreTracker(mLocalLog);
- ArrayList<NetworkKey> unscoredNetworks = new ArrayList<>();
-
- for (ScanDetail scanDetail : scanDetails) {
- ScanResult scanResult = scanDetail.getScanResult();
-
- // One ScanResult can be associated with more than one networks, hence we calculate all
- // the scores and use the highest one as the ScanResult's score.
- // TODO(b/31065385): WifiConfigManager does not support passpoint networks currently.
- // So this list has just one entry always.
- List<WifiConfiguration> associatedConfigs = null;
- WifiConfiguration associatedConfig =
- mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
- if (associatedConfig != null) {
- associatedConfigs =
- new ArrayList<>(Arrays.asList(associatedConfig));
- }
-
- if (isPotentialEphemeralNetwork(associatedConfigs)) {
- if (untrustedNetworkAllowed) {
- if (!mWifiConfigManager.wasEphemeralNetworkDeleted(
- ScanResultUtil.createQuotedSSID(scanResult.SSID))) {
- // Ephemeral network has either one WifiConfiguration or none yet.
- // Checking BSSID is sufficient to determine whether this is the
- // currently connected network.
- boolean active = TextUtils.equals(currentBssid, scanResult.BSSID);
- Integer score = getNetworkScore(scanResult, mScoreCache, active);
- externalScoreTracker.trackUntrustedCandidate(score, scanResult);
- if (connectableNetworks != null) {
- connectableNetworks.add(Pair.create(scanDetail,
- getPotentialEphemeralNetworkConfiguration(associatedConfigs)));
- }
- }
- }
- continue;
- }
-
- for (WifiConfiguration network : associatedConfigs) {
- WifiConfiguration.NetworkSelectionStatus status =
- network.getNetworkSelectionStatus();
- status.setSeenInLastQualifiedNetworkSelection(true);
- if (!status.isNetworkEnabled()) {
- continue;
- } else if (network.BSSID != null && !network.BSSID.equals("any")
- && !network.BSSID.equals(scanResult.BSSID)) {
- // App has specified the only BSSID to connect for this
- // configuration. So only the matching ScanResult can be a candidate.
- localLog("Network " + WifiNetworkSelector.toNetworkString(network)
- + " has specified BSSID " + network.BSSID + ". Skip "
- + scanResult.BSSID);
- continue;
- }
-
- // Saved network wth an external score.
- if (network.useExternalScores) {
- localLog("Network " + WifiNetworkSelector.toNetworkString(network)
- + " uses external score");
- boolean active = currentNetwork != null && currentNetwork == network
- && TextUtils.equals(currentBssid, scanResult.BSSID);
- Integer score = getNetworkScore(scanResult, mScoreCache, active);
- externalScoreTracker.trackSavedCandidate(score, network, scanResult);
- if (connectableNetworks != null) {
- connectableNetworks.add(Pair.create(scanDetail, network));
- }
- }
- }
- }
-
- WifiConfiguration candidate = getExternalScoreCandidate(externalScoreTracker, mScoreCache);
-
- if (candidate != null
- && candidate.getNetworkSelectionStatus().getCandidate() != null) {
- return candidate;
- } else {
- return null;
- }
- }
-
- /**
- * Used to track the network with the highest score.
- */
- static class ExternalScoreTracker {
- public static final int EXTERNAL_SCORED_NONE = 0;
- public static final int EXTERNAL_SCORED_SAVED_NETWORK = 1;
- public static final int EXTERNAL_SCORED_UNTRUSTED_NETWORK = 2;
-
- private int mBestCandidateType = EXTERNAL_SCORED_NONE;
- private int mHighScore = WifiNetworkScoreCache.INVALID_NETWORK_SCORE;
- private WifiConfiguration mSavedConfig;
- private ScanResult mScanResultCandidate;
- private final LocalLog mLocalLog;
-
- ExternalScoreTracker(LocalLog localLog) {
- mLocalLog = localLog;
- }
-
- // Determines whether or not the given scan result is the best one its seen so far.
- void trackUntrustedCandidate(@Nullable Integer score, ScanResult scanResult) {
- if (score != null && score > mHighScore) {
- mHighScore = score;
- mScanResultCandidate = scanResult;
- mBestCandidateType = EXTERNAL_SCORED_UNTRUSTED_NETWORK;
- localLog(WifiNetworkSelector.toScanId(scanResult)
- + " becomes the new untrusted candidate.");
- }
- }
-
- // Determines whether or not the given saved network is the best one its seen so far.
- void trackSavedCandidate(@Nullable Integer score, WifiConfiguration config,
- ScanResult scanResult) {
- // Always take the highest score. If there's a tie and an untrusted network is currently
- // the best then pick the saved network.
- if (score != null
- && (score > mHighScore
- || (mBestCandidateType == EXTERNAL_SCORED_UNTRUSTED_NETWORK
- && score == mHighScore))) {
- mHighScore = score;
- mSavedConfig = config;
- mScanResultCandidate = scanResult;
- mBestCandidateType = EXTERNAL_SCORED_SAVED_NETWORK;
- localLog(WifiNetworkSelector.toScanId(scanResult)
- + " becomes the new externally scored saved network candidate.");
- }
- }
-
- int getBestCandidateType() {
- return mBestCandidateType;
- }
-
- int getHighScore() {
- return mHighScore;
- }
-
- public ScanResult getScanResultCandidate() {
- return mScanResultCandidate;
- }
-
- WifiConfiguration getSavedConfig() {
- return mSavedConfig;
- }
-
- private void localLog(String log) {
- if (mLocalLog != null) {
- mLocalLog.log(log);
- }
- }
- }
-}
diff --git a/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java b/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
index bc019eb..8b332f8 100644
--- a/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
+++ b/service/java/com/android/server/wifi/RecommendedNetworkEvaluator.java
@@ -19,31 +19,40 @@
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
+import android.net.INetworkScoreCache;
import android.net.NetworkKey;
import android.net.NetworkScoreManager;
import android.net.RecommendationRequest;
import android.net.RecommendationResult;
+import android.net.ScoredNetwork;
import android.net.WifiKey;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiNetworkScoreCache;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
+import android.os.RemoteException;
+import android.os.SystemClock;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.LocalLog;
+import android.util.LruCache;
import android.util.Pair;
import android.util.Slog;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.wifi.util.ScanResultUtil;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.concurrent.GuardedBy;
/**
* {@link WifiNetworkSelector.NetworkEvaluator} implementation that uses
@@ -52,23 +61,22 @@
public class RecommendedNetworkEvaluator implements WifiNetworkSelector.NetworkEvaluator {
private static final String TAG = "RecNetEvaluator";
private final NetworkScoreManager mNetworkScoreManager;
- private final WifiNetworkScoreCache mNetworkScoreCache;
private final WifiConfigManager mWifiConfigManager;
private final LocalLog mLocalLog;
- private final ExternalScoreEvaluator mExternalScoreEvaluator;
@VisibleForTesting final ContentObserver mContentObserver;
+ private final RequestedScoreCache mRequestedScoreCache;
private boolean mNetworkRecommendationsEnabled;
RecommendedNetworkEvaluator(final Context context, ContentResolver contentResolver,
Looper looper, final FrameworkFacade frameworkFacade,
- WifiNetworkScoreCache networkScoreCache,
NetworkScoreManager networkScoreManager, WifiConfigManager wifiConfigManager,
- LocalLog localLog, ExternalScoreEvaluator externalScoreEvaluator) {
- mNetworkScoreCache = networkScoreCache;
+ LocalLog localLog) {
+ mRequestedScoreCache = new RequestedScoreCache(frameworkFacade.getLongSetting(
+ context, Settings.Global.RECOMMENDED_NETWORK_EVALUATOR_CACHE_EXPIRY_MS,
+ TimeUnit.DAYS.toMillis(1)));
mNetworkScoreManager = networkScoreManager;
mWifiConfigManager = wifiConfigManager;
mLocalLog = localLog;
- mExternalScoreEvaluator = externalScoreEvaluator; // TODO(b/33694202): Remove
mContentObserver = new ContentObserver(new Handler(looper)) {
@Override
public void onChange(boolean selfChange) {
@@ -80,6 +88,8 @@
Settings.Global.getUriFor(Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED),
false /* notifyForDescendents */, mContentObserver);
mContentObserver.onChange(false /* unused */);
+ mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mRequestedScoreCache,
+ NetworkScoreManager.CACHE_FILTER_NONE);
mLocalLog.log("RecommendedNetworkEvaluator constructed. mNetworkRecommendationsEnabled: "
+ mNetworkRecommendationsEnabled);
}
@@ -88,8 +98,6 @@
public void update(List<ScanDetail> scanDetails) {
if (mNetworkRecommendationsEnabled) {
updateNetworkScoreCache(scanDetails);
- } else {
- mExternalScoreEvaluator.update(scanDetails);
}
clearNotRecommendedFlag();
}
@@ -99,16 +107,16 @@
for (int i = 0; i < scanDetails.size(); i++) {
ScanResult scanResult = scanDetails.get(i).getScanResult();
-
- // Is there a score for this network? If not, request a score.
- if (!mNetworkScoreCache.isScoredNetwork(scanResult)) {
- try {
- WifiKey wifiKey = new WifiKey("\"" + scanResult.SSID + "\"", scanResult.BSSID);
+ try {
+ WifiKey wifiKey = new WifiKey(
+ ScanResultUtil.createQuotedSSID(scanResult.SSID), scanResult.BSSID);
+ // Have we requested a score for this network? If not, request a score.
+ if (mRequestedScoreCache.shouldRequestScore(wifiKey)) {
unscoredNetworks.add(new NetworkKey(wifiKey));
- } catch (IllegalArgumentException e) {
- mLocalLog.log("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
- + " for network score. Skip.");
}
+ } catch (IllegalArgumentException e) {
+ mLocalLog.log("Invalid SSID=" + scanResult.SSID + " BSSID=" + scanResult.BSSID
+ + " for network score. Skip.");
}
}
@@ -134,8 +142,8 @@
boolean untrustedNetworkAllowed,
List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks) {
if (!mNetworkRecommendationsEnabled) {
- return mExternalScoreEvaluator.evaluateNetworks(scanDetails, currentNetwork,
- currentBssid, connected, untrustedNetworkAllowed, connectableNetworks);
+ mLocalLog.log("Skipping evaluateNetworks; Network recommendations disabled.");
+ return null;
}
Set<WifiConfiguration> availableConfiguredNetworks = new ArraySet<>();
List<ScanResult> scanResults = new ArrayList<>();
@@ -229,7 +237,7 @@
return mWifiConfigManager.getConfiguredNetwork(networkId);
}
- private ScanDetail findMatchingScanDetail(List<ScanDetail> scanDetails,
+ private static ScanDetail findMatchingScanDetail(List<ScanDetail> scanDetails,
WifiConfiguration wifiConfiguration) {
String ssid = WifiInfo.removeDoubleQuotes(wifiConfiguration.SSID);
String bssid = wifiConfiguration.BSSID;
@@ -264,9 +272,58 @@
@Override
public String getName() {
- if (mNetworkRecommendationsEnabled) {
- return TAG;
+ return TAG;
+ }
+
+ /** Cache for scores that have already been requested. */
+ static class RequestedScoreCache extends INetworkScoreCache.Stub {
+ /** Number entries to be stored in the {@link LruCache} of requested {@link WifiKey}s. */
+ private static final int MAX_CACHE_SIZE = 1000;
+
+ private final long mCacheExpiryMillis;
+ @GuardedBy("mCache")
+ private final LruCache<WifiKey, Object> mCache = new LruCache<>(MAX_CACHE_SIZE);
+ @GuardedBy("mCache")
+ private long mCacheCreationTime;
+
+ RequestedScoreCache(long cacheExpiryMillis) {
+ mCacheExpiryMillis = cacheExpiryMillis;
}
- return TAG + "-" + mExternalScoreEvaluator.getName();
+
+ /** Returns whether a score should be requested for a given {@code wifiKey}. */
+ public boolean shouldRequestScore(WifiKey wifiKey) {
+ long nowMillis = SystemClock.elapsedRealtime();
+ long oldestUsableCacheTimeMillis = nowMillis - mCacheExpiryMillis;
+ synchronized (mCache) {
+ if (mCacheCreationTime < oldestUsableCacheTimeMillis) {
+ mCache.evictAll();
+ mCacheCreationTime = nowMillis;
+ }
+ boolean shouldRequest = mCache.get(wifiKey) == null;
+ mCache.put(wifiKey, this); // Update access time for wifiKey.
+ return shouldRequest;
+ }
+ }
+
+ @Override
+ public void updateScores(List<ScoredNetwork> networks) throws RemoteException {}
+
+ @Override
+ public void clearScores() throws RemoteException {
+ synchronized (mCache) {
+ mCache.evictAll();
+ mCacheCreationTime = 0;
+ }
+ }
+
+ @Override
+ protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ writer.println("RequestedScoreCache:");
+ writer.println("mCacheExpiryMillis: " + mCacheExpiryMillis);
+ synchronized (mCache) {
+ writer.println("mCacheCreationTime: " + mCacheCreationTime);
+ writer.println("mCache size: " + mCache.size());
+ }
+ }
}
}
diff --git a/service/java/com/android/server/wifi/WifiInjector.java b/service/java/com/android/server/wifi/WifiInjector.java
index 20a0609..2c7ab58 100644
--- a/service/java/com/android/server/wifi/WifiInjector.java
+++ b/service/java/com/android/server/wifi/WifiInjector.java
@@ -23,7 +23,6 @@
import android.net.wifi.IWificond;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiScanner;
import android.os.BatteryStats;
import android.os.HandlerThread;
@@ -102,7 +101,6 @@
private final SavedNetworkEvaluator mSavedNetworkEvaluator;
private final PasspointNetworkEvaluator mPasspointNetworkEvaluator;
private final RecommendedNetworkEvaluator mRecommendedNetworkEvaluator;
- private final WifiNetworkScoreCache mWifiNetworkScoreCache;
private final NetworkScoreManager mNetworkScoreManager;
private WifiScanner mWifiScanner;
private final WifiPermissionsWrapper mWifiPermissionsWrapper;
@@ -195,17 +193,13 @@
UserManager.get(mContext), TelephonyManager.from(mContext),
mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy, mWifiPermissionsWrapper,
new NetworkListStoreData(), new DeletedEphemeralSsidsStoreData());
- mWifiNetworkScoreCache = new WifiNetworkScoreCache(mContext);
mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiConfigManager, mClock);
LocalLog localLog = mWifiNetworkSelector.getLocalLog();
mSavedNetworkEvaluator = new SavedNetworkEvaluator(mContext,
mWifiConfigManager, mClock, localLog, wifiStateMachineLooper, mFrameworkFacade);
- ExternalScoreEvaluator externalScoreEvaluator = new ExternalScoreEvaluator(
- mContext, mWifiConfigManager, mWifiNetworkScoreCache, mClock, localLog);
mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(context,
- context.getContentResolver(), wifiStateMachineLooper,
- mFrameworkFacade, mWifiNetworkScoreCache, mNetworkScoreManager, mWifiConfigManager,
- localLog, externalScoreEvaluator);
+ context.getContentResolver(), wifiStateMachineLooper, mFrameworkFacade,
+ mNetworkScoreManager, mWifiConfigManager, localLog);
mSimAccessor = new SIMAccessor(mContext);
mPasspointManager = new PasspointManager(mContext, mWifiNative, mWifiKeyStore, mClock,
mSimAccessor, new PasspointObjectFactory(), mWifiConfigManager, mWifiConfigStore);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
deleted file mode 100644
index 2829f01..0000000
--- a/service/tests/wifitests/src/com/android/server/wifi/ExternalScoreEvaluatorTest.java
+++ /dev/null
@@ -1,479 +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 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.WifiNetworkScoreCache;
-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 = mock(NetworkScoreManager.class);
- mContext = getContext();
- mScoreCache = new WifiNetworkScoreCache(mContext);
- 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,
- mScoreCache, 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";
-
- 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);
- }
-
- /**
- * Between two ephemeral networks with the same RSSI, choose
- * the currently connected one.
- */
- @Test
- public void 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<ScanDetail> 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, scanResults[i], meteredHints[i]);
- }
-
- WifiConfiguration candidate = mExternalScoreEvaluator.evaluateNetworks(scanDetails,
- null, 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 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};
-
- 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, null, meteredHints);
-
- WifiConfiguration candidate = mExternalScoreEvaluator.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/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java b/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
index 689f267..f537117 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/RecommendedNetworkEvaluatorTest.java
@@ -16,6 +16,7 @@
package com.android.server.wifi;
+
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
@@ -25,6 +26,8 @@
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
@@ -39,7 +42,6 @@
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
-import android.net.wifi.WifiNetworkScoreCache;
import android.net.wifi.WifiSsid;
import android.os.Looper;
import android.os.Process;
@@ -63,6 +65,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeUnit;
/**
* Unit tests for {@link RecommendedNetworkEvaluator}.
@@ -81,8 +84,6 @@
@Mock private FrameworkFacade mFrameworkFacade;
@Mock private NetworkScoreManager mNetworkScoreManager;
@Mock private WifiConfigManager mWifiConfigManager;
- @Mock private WifiNetworkScoreCache mNetworkScoreCache;
- @Mock private ExternalScoreEvaluator mExternalScoreEvaluator;
@Captor private ArgumentCaptor<NetworkKey[]> mNetworkKeyArrayCaptor;
@Captor private ArgumentCaptor<RecommendationRequest> mRecommendationRequestCaptor;
@@ -117,9 +118,14 @@
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);
mRecommendedNetworkEvaluator = new RecommendedNetworkEvaluator(mContext, mContentResolver,
- Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreCache, mNetworkScoreManager,
- mWifiConfigManager, new LocalLog(0), mExternalScoreEvaluator);
+ Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager,
+ mWifiConfigManager, new LocalLog(0));
+ reset(mNetworkScoreManager);
when(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(mTrustedScanDetail))
.thenReturn(mTrustedWifiConfiguration);
@@ -144,8 +150,7 @@
mRecommendedNetworkEvaluator.update(scanDetails);
- verify(mExternalScoreEvaluator).update(scanDetails);
- verifyZeroInteractions(mNetworkScoreManager, mNetworkScoreManager);
+ verifyZeroInteractions(mNetworkScoreManager);
verify(mWifiConfigManager).updateNetworkNotRecommended(
mTrustedWifiConfiguration.networkId, false /* notRecommended */);
}
@@ -160,38 +165,45 @@
}
@Test
- public void testUpdate_allNetworksScored() {
- when(mNetworkScoreCache.isScoredNetwork(mTrustedScanDetail.getScanResult()))
- .thenReturn(true);
- when(mNetworkScoreCache.isScoredNetwork(mUntrustedScanDetail.getScanResult()))
- .thenReturn(true);
-
+ public void testUpdate_allNetworksUnscored() {
mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail,
mUntrustedScanDetail));
- verifyZeroInteractions(mNetworkScoreManager);
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_oneUnscored() {
- when(mNetworkScoreCache.isScoredNetwork(mTrustedScanDetail.getScanResult()))
- .thenReturn(true);
- when(mNetworkScoreCache.isScoredNetwork(mUntrustedScanDetail.getScanResult()))
- .thenReturn(false);
+ public void testUpdate_oneScored_twoScored() {
+ mRecommendedNetworkEvaluator.update(Lists.newArrayList(mUntrustedScanDetail));
- mRecommendedNetworkEvaluator.update(Lists.newArrayList(mTrustedScanDetail,
- mUntrustedScanDetail));
+ // Next scan should only trigger a request for the trusted network.
+ mRecommendedNetworkEvaluator.update(
+ Lists.newArrayList(mTrustedScanDetail, mUntrustedScanDetail));
- verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
+ verify(mWifiConfigManager, times(2)).updateNetworkNotRecommended(
+ mTrustedWifiConfiguration.networkId, false /* notRecommended */);
+ verify(mNetworkScoreManager, times(2)).requestScores(mNetworkKeyArrayCaptor.capture());
- assertEquals(1, mNetworkKeyArrayCaptor.getValue().length);
+ NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getAllValues().get(0);
+ assertEquals(1, requestedScores.length);
NetworkKey expectedNetworkKey = new NetworkKey(new WifiKey(ScanResultUtil.createQuotedSSID(
mUntrustedScanDetail.getSSID()), mUntrustedScanDetail.getBSSIDString()));
- assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]);
- verify(mWifiConfigManager).updateNetworkNotRecommended(
- mTrustedWifiConfiguration.networkId, false /* notRecommended */);
+ 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
@@ -204,8 +216,6 @@
mRecommendedNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null);
- verify(mExternalScoreEvaluator).evaluateNetworks(null, null, null, false, false, null);
-
verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager);
}