diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-09-10 23:17:49 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-09-10 23:17:49 +0000 |
commit | 23a730cfd4de3002f667b311961c1dd8e24b666c (patch) | |
tree | 7ac520d95fc1125933bb26c890cbbf5eb2759952 | |
parent | c006242c5f4156f479f395339012586d46288775 (diff) | |
parent | b2e7091ff04668b7dc0946c50d6043cf52dfcf6a (diff) |
Snap for 6826141 from b2e7091ff04668b7dc0946c50d6043cf52dfcf6a to rvc-qpr1-release
Change-Id: Iec725bd9793f78bb72c0879fb3f45695faf79f59
13 files changed, 212 insertions, 22 deletions
diff --git a/service/java/com/android/server/wifi/DeviceConfigFacade.java b/service/java/com/android/server/wifi/DeviceConfigFacade.java index 3856ff1fd..a7bcfc764 100644 --- a/service/java/com/android/server/wifi/DeviceConfigFacade.java +++ b/service/java/com/android/server/wifi/DeviceConfigFacade.java @@ -139,6 +139,9 @@ public class DeviceConfigFacade { // depends on the score evaluation period normally controlled by // 'com.android.wifi.resources.R' config_wifiPollRssiIntervalMilliseconds. static final int DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS = 0; + // Default RSSI threshold in dBm above which low score is not sent to connectivity service + // when external scorer takes action. + static final int DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM = -67; // Cached values of fields updated via updateDeviceConfigFlags() private boolean mIsAbnormalConnectionBugreportEnabled; private int mAbnormalConnectionDurationMs; @@ -189,6 +192,7 @@ public class DeviceConfigFacade { private int mHealthMonitorFwAlertValidTimeMs; private int mMinConfirmationDurationSendLowScoreMs; private int mMinConfirmationDurationSendHighScoreMs; + private int mRssiThresholdNotSendLowScoreToCsDbm; public DeviceConfigFacade(Context context, Handler handler, WifiMetrics wifiMetrics) { mContext = context; @@ -342,6 +346,9 @@ public class DeviceConfigFacade { mMinConfirmationDurationSendHighScoreMs = DeviceConfig.getInt(NAMESPACE, "min_confirmation_duration_send_high_score_ms", DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS); + mRssiThresholdNotSendLowScoreToCsDbm = DeviceConfig.getInt(NAMESPACE, + "rssi_threshold_not_send_low_score_to_cs_dbm", + DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM); } private Set<String> getUnmodifiableSetQuoted(String key) { @@ -706,4 +713,12 @@ public class DeviceConfigFacade { public int getMinConfirmationDurationSendHighScoreMs() { return mMinConfirmationDurationSendHighScoreMs; } + + /** + * Gets the RSSI threshold above which low score is not sent to connectivity service when + * external scorer takes action. + */ + public int getRssiThresholdNotSendLowScoreToCsDbm() { + return mRssiThresholdNotSendLowScoreToCsDbm; + } } diff --git a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java index 98664d0fc..a9c99ae54 100644 --- a/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java +++ b/service/java/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreData.java @@ -28,6 +28,7 @@ import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -92,6 +93,7 @@ public class ImsiPrivacyProtectionExemptionStoreData implements WifiConfigStore. throws XmlPullParserException, IOException { // Ignore empty reads. if (in == null) { + mDataSource.fromDeserialized(Collections.emptyMap()); return; } diff --git a/service/java/com/android/server/wifi/WifiHealthMonitor.java b/service/java/com/android/server/wifi/WifiHealthMonitor.java index bc1f9af01..b21ea516d 100644 --- a/service/java/com/android/server/wifi/WifiHealthMonitor.java +++ b/service/java/com/android/server/wifi/WifiHealthMonitor.java @@ -24,6 +24,7 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.app.AlarmManager; import android.content.Context; +import android.content.pm.ModuleInfo; import android.content.pm.PackageManager; import android.net.MacAddress; import android.net.wifi.ScanResult; @@ -76,7 +77,7 @@ public class WifiHealthMonitor { "WifiHealthMonitor Schedule Post-Boot Detection Timer"; // Package name of WiFi mainline module found from the following adb command // adb shell pm list packages --apex-only| grep wifi - private static final String WIFI_APK_PACKAGE_NAME = "com.google.android.wifi"; + private static final String WIFI_APEX_NAME = "com.android.wifi"; private static final String SYSTEM_INFO_DATA_NAME = "systemInfoData"; // The time that device waits after device boot before triggering post-boot detection. // This needs be long enough so that memory read can complete before post-boot detection. @@ -329,8 +330,20 @@ public class WifiHealthMonitor { * @Return a non-zero value if version code is available, 0 otherwise. */ public long getWifiStackVersion() { - WifiSoftwareBuildInfo currentBuild = getWifiSystemInfoStats().getCurrSoftwareBuildInfo(); - return (currentBuild == null) ? 0 : currentBuild.getWifiStackVersion(); + PackageManager packageManager = mContext.getPackageManager(); + long wifiStackVersion = 0; + try { + ModuleInfo wifiModule = packageManager.getModuleInfo( + WIFI_APEX_NAME, PackageManager.MODULE_APEX_NAME); + String wifiPackageName = wifiModule.getPackageName(); + if (wifiPackageName != null) { + wifiStackVersion = packageManager.getPackageInfo( + wifiPackageName, PackageManager.MATCH_APEX).getLongVersionCode(); + } + } catch (PackageManager.NameNotFoundException e) { + Log.e(TAG, " Hit PackageManager exception", e); + } + return wifiStackVersion; } private synchronized void dailyDetectionHandler() { @@ -539,14 +552,7 @@ public class WifiHealthMonitor { if (!mWifiEnabled) { return null; } - PackageManager packageManager = mContext.getPackageManager(); - long wifiStackVersion = 0; - try { - wifiStackVersion = packageManager.getPackageInfo( - WIFI_APK_PACKAGE_NAME, PackageManager.MATCH_APEX).getLongVersionCode(); - } catch (PackageManager.NameNotFoundException e) { - Log.e(TAG, " Hit PackageManager exception", e); - } + long wifiStackVersion = getWifiStackVersion(); String osBuildVersion = replaceNullByEmptyString(Build.DISPLAY); if (mWifiNative == null) { return null; diff --git a/service/java/com/android/server/wifi/WifiMetrics.java b/service/java/com/android/server/wifi/WifiMetrics.java index 1ac361ef3..75d53fc95 100644 --- a/service/java/com/android/server/wifi/WifiMetrics.java +++ b/service/java/com/android/server/wifi/WifiMetrics.java @@ -242,6 +242,7 @@ public class WifiMetrics { private int mLastPollRxLinkSpeed = -1; private int mLastPollFreq = -1; private int mLastScore = -1; + private boolean mAdaptiveConnectivityEnabled = true; /** * Metrics are stored within an instance of the WifiLog proto during runtime, @@ -4908,6 +4909,7 @@ public class WifiMetrics { if (mWifiDataStall != null) { staEvent.isCellularDataAvailable = mWifiDataStall.isCellularDataAvailable(); } + staEvent.isAdaptiveConnectivityEnabled = mAdaptiveConnectivityEnabled; mSupplicantStateChangeBitmask = 0; mLastPollRssi = -127; mLastPollFreq = -1; @@ -5124,6 +5126,7 @@ public class WifiMetrics { if (event.totalRxBytes > 0) sb.append(" totalRxBytes=").append(event.totalRxBytes); sb.append(" screenOn=").append(event.screenOn); sb.append(" cellularData=").append(event.isCellularDataAvailable); + sb.append(" adaptiveConnectivity=").append(event.isAdaptiveConnectivityEnabled); if (event.supplicantStateChangesBitmask != 0) { sb.append(", ").append(supplicantStateChangesBitmaskToString( event.supplicantStateChangesBitmask)); @@ -5343,6 +5346,15 @@ public class WifiMetrics { return result; } + /** + * Converts Adaptive Connectivity state to UserActionEvent type. + * @param value + */ + public static int convertAdaptiveConnectivityStateToUserActionEventType(boolean value) { + return value ? UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON + : UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF; + } + static class MeteredNetworkStatsBuilder { // A map from network identifier to MeteredDetail Map<String, MeteredDetail> mNetworkMap = new ArrayMap<>(); @@ -6713,4 +6725,13 @@ public class WifiMetrics { mCarrierWifiMetrics.numConnectionNonAuthFailure++; } } + + /** + * Set Adaptive Connectivity state (On/Off) + */ + public void setAdaptiveConnectivityState(boolean adaptiveConnectivityEnabled) { + synchronized (mLock) { + mAdaptiveConnectivityEnabled = adaptiveConnectivityEnabled; + } + } } diff --git a/service/java/com/android/server/wifi/WifiNetworkSelector.java b/service/java/com/android/server/wifi/WifiNetworkSelector.java index 50078b628..fbbcb3174 100644 --- a/service/java/com/android/server/wifi/WifiNetworkSelector.java +++ b/service/java/com/android/server/wifi/WifiNetworkSelector.java @@ -462,6 +462,17 @@ public class WifiNetworkSelector { return validScanDetails; } + private ScanDetail findScanDetailForBssid(List<ScanDetail> scanDetails, + String currentBssid) { + for (ScanDetail scanDetail : scanDetails) { + ScanResult scanResult = scanDetail.getScanResult(); + if (scanResult.BSSID.equals(currentBssid)) { + return scanDetail; + } + } + return null; + } + private boolean isEnhancedOpenSupported() { if (mIsEnhancedOpenSupportedInitialized) { return mIsEnhancedOpenSupported; @@ -790,6 +801,8 @@ public class WifiNetworkSelector { WifiCandidates.Key key = new WifiCandidates.Key( ScanResultMatchInfo.fromWifiConfiguration(currentNetwork), bssid, currentNetwork.networkId); + ScanDetail scanDetail = findScanDetailForBssid(mFilteredNetworks, currentBssid); + int predictedTputMbps = (scanDetail == null) ? 0 : predictThroughput(scanDetail); wifiCandidates.add(key, currentNetwork, NetworkNominator.NOMINATOR_ID_CURRENT, wifiInfo.getRssi(), @@ -797,7 +810,7 @@ public class WifiNetworkSelector { calculateLastSelectionWeight(currentNetwork.networkId), WifiConfiguration.isMetered(currentNetwork, wifiInfo), isFromCarrierOrPrivilegedApp(currentNetwork), - 0 /* Mbps */); + predictedTputMbps); } for (NetworkNominator registeredNominator : mNominators) { localLog("About to run " + registeredNominator.getName() + " :"); diff --git a/service/java/com/android/server/wifi/WifiScoreReport.java b/service/java/com/android/server/wifi/WifiScoreReport.java index 381be7f2b..80a561d05 100644 --- a/service/java/com/android/server/wifi/WifiScoreReport.java +++ b/service/java/com/android/server/wifi/WifiScoreReport.java @@ -206,14 +206,25 @@ public class WifiScoreReport { && mContext.getResources().getBoolean( R.bool.config_wifiMinConfirmationDurationSendNetworkScoreEnabled)) { long millis = mClock.getWallClockMillis(); - if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS - && (millis - mLastScoreBreachLowTimeMillis) - < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) { - return; + if (mLastScoreBreachLowTimeMillis != INVALID_WALL_CLOCK_MILLIS) { + if (mWifiInfo.getRssi() + >= mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()) { + Log.d(TAG, "Not reporting low score because RSSI is high " + + mWifiInfo.getRssi()); + return; + } + if ((millis - mLastScoreBreachLowTimeMillis) + < mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()) { + Log.d(TAG, "Not reporting low score because elapsed time is shorter than " + + "the minimum confirmation duration"); + return; + } } if (mLastScoreBreachHighTimeMillis != INVALID_WALL_CLOCK_MILLIS && (millis - mLastScoreBreachHighTimeMillis) < mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()) { + Log.d(TAG, "Not reporting high score because elapsed time is shorter than " + + "the minimum confirmation duration"); return; } } @@ -322,6 +333,10 @@ public class WifiScoreReport { super.onChange(selfChange); mAdaptiveConnectivityEnabled = getValue(); Log.d(TAG, "Adaptive connectivity status changed: " + mAdaptiveConnectivityEnabled); + mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled); + mWifiMetrics.logUserActionEvent( + mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType( + mAdaptiveConnectivityEnabled)); } /** @@ -335,6 +350,7 @@ public class WifiScoreReport { } mFrameworkFacade.registerContentObserver(mContext, uri, true, this); mAdaptiveConnectivityEnabled = mAdaptiveConnectivityEnabledSettingObserver.getValue(); + mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled); } public boolean getValue() { diff --git a/service/proto/src/metrics.proto b/service/proto/src/metrics.proto index a7f706fb8..1c3b27872 100644 --- a/service/proto/src/metrics.proto +++ b/service/proto/src/metrics.proto @@ -1471,6 +1471,9 @@ message StaEvent { // Whether cellular data network is available optional bool is_cellular_data_available = 25; + + //Whether Adaptive Connectivity is enabled + optional bool is_adaptive_connectivity_enabled = 26; } // Wi-Fi Aware metrics @@ -3158,6 +3161,10 @@ message UserActionEvent { EVENT_CONFIGURE_METERED_STATUS_AUTO = 12; // User adds a new network or updates configurations for an existing network. EVENT_ADD_OR_UPDATE_NETWORK = 13; + // User sets the adaptive connectivity to on + EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON = 14; + // User sets the adaptive connectivity to off + EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF = 15; } // The type of user action diff --git a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java index 43a16fe4c..a570d2948 100644 --- a/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java +++ b/tests/wifitests/src/com/android/server/wifi/DeviceConfigFacadeTest.java @@ -209,6 +209,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest { mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()); assertEquals(DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS, mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()); + assertEquals(DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM, + mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()); } /** @@ -315,6 +317,8 @@ public class DeviceConfigFacadeTest extends WifiBaseTest { anyInt())).thenReturn(4000); when(DeviceConfig.getInt(anyString(), eq("min_confirmation_duration_send_high_score_ms"), anyInt())).thenReturn(1000); + when(DeviceConfig.getInt(anyString(), eq("rssi_threshold_not_send_low_score_to_cs_dbm"), + anyInt())).thenReturn(-70); mOnPropertiesChangedListenerCaptor.getValue().onPropertiesChanged(null); // Verifying fields are updated to the new values @@ -373,5 +377,6 @@ public class DeviceConfigFacadeTest extends WifiBaseTest { assertEquals(1000, mDeviceConfigFacade.getHealthMonitorFwAlertValidTimeMs()); assertEquals(4000, mDeviceConfigFacade.getMinConfirmationDurationSendLowScoreMs()); assertEquals(1000, mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()); + assertEquals(-70, mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()); } } diff --git a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java index ec2142dbf..77d5c1933 100644 --- a/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java +++ b/tests/wifitests/src/com/android/server/wifi/ImsiPrivacyProtectionExemptionStoreDataTest.java @@ -17,6 +17,7 @@ package com.android.server.wifi; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -102,6 +103,17 @@ public class ImsiPrivacyProtectionExemptionStoreDataTest { assertSerializeDeserialize(imsiPrivacyProtectionExemptionMap); } + @Test + public void testDeserializeOnNewDeviceOrNewUser() throws Exception { + ArgumentCaptor<Map> deserializedNetworkSuggestionsMap = + ArgumentCaptor.forClass(Map.class); + mImsiPrivacyProtectionExemptionStoreData.deserializeData(null, 0, + WifiConfigStore.ENCRYPT_CREDENTIALS_CONFIG_STORE_DATA_VERSION, null); + verify(mDataSource).fromDeserialized(deserializedNetworkSuggestionsMap.capture()); + assertTrue(deserializedNetworkSuggestionsMap.getValue().isEmpty()); + } + + private Map<Integer, Boolean> assertSerializeDeserialize( Map<Integer, Boolean> mImsiPrivacyProtectionExemptionMap) throws Exception { // Setup the data to serialize. diff --git a/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java index 21a00f9a1..c679954b1 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiHealthMonitorTest.java @@ -28,6 +28,7 @@ import static org.mockito.Mockito.when; import android.app.test.MockAnswerUtil.AnswerWithArguments; import android.app.test.TestAlarmManager; import android.content.Context; +import android.content.pm.ModuleInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.MacAddress; @@ -98,6 +99,8 @@ public class WifiHealthMonitorTest extends WifiBaseTest { PackageManager mPackageManager; @Mock PackageInfo mPackageInfo; + @Mock + ModuleInfo mModuleInfo; private final ArrayList<String> mKeys = new ArrayList<>(); private final ArrayList<WifiScoreCard.BlobListener> mBlobListeners = new ArrayList<>(); @@ -154,8 +157,9 @@ public class WifiHealthMonitorTest extends WifiBaseTest { mDriverVersion = "build 1.1"; mFirmwareVersion = "HW 1.1"; when(mPackageInfo.getLongVersionCode()).thenReturn(MODULE_VERSION); - when(mContext.getPackageName()).thenReturn("WifiAPK"); when(mPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(mPackageInfo); + when(mPackageManager.getModuleInfo(anyString(), anyInt())).thenReturn(mModuleInfo); + when(mModuleInfo.getPackageName()).thenReturn("WifiAPK"); when(mContext.getPackageManager()).thenReturn(mPackageManager); mWifiConfigManager = mockConfigManager(); @@ -323,7 +327,7 @@ public class WifiHealthMonitorTest extends WifiBaseTest { // trigger extractCurrentSoftwareBuildInfo() call to update currSoftwareBuildInfo mWifiHealthMonitor.installMemoryStoreSetUpDetectionAlarm(mMemoryStore); mWifiHealthMonitor.setWifiEnabled(true); - assertEquals(0, mWifiHealthMonitor.getWifiStackVersion()); + assertEquals(MODULE_VERSION, mWifiHealthMonitor.getWifiStackVersion()); millisecondsPass(5000); mWifiScanner.startScan(mScanSettings, mScanListener); mAlarmManager.dispatch(WifiHealthMonitor.POST_BOOT_DETECTION_TIMER_TAG); diff --git a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java index b4cd7592c..b69b30208 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiMetricsTest.java @@ -2302,6 +2302,7 @@ public class WifiMetricsTest extends WifiBaseTest { mTestLooper.dispatchAll(); wifiMetrics.setScreenState(true); when(mWifiDataStall.isCellularDataAvailable()).thenReturn(true); + wifiMetrics.setAdaptiveConnectivityState(true); for (int i = 0; i < mTestStaLogInts.length; i++) { int[] lia = mTestStaLogInts[i]; wifiMetrics.logStaEvent(lia[0], lia[1], lia[2] == 1 ? mTestWifiConfig : null); @@ -2342,6 +2343,7 @@ public class WifiMetricsTest extends WifiBaseTest { evs[7] == 1 ? mTestWifiConfig : null, event.configInfo); assertEquals(true, event.screenOn); assertEquals(true, event.isCellularDataAvailable); + assertEquals(true, event.isAdaptiveConnectivityEnabled); j++; } assertEquals(mExpectedValues.length, j); @@ -2554,6 +2556,35 @@ public class WifiMetricsTest extends WifiBaseTest { } /** + * Test the logging of UserActionEvent for Adaptive Connectivity toggle + */ + @Test + public void testLogUserActionEventForAdaptiveConnectivity() throws Exception { + long testStartTimeMillis = 123123L; + boolean adaptiveConnectivityEnabled = true; + when(mClock.getElapsedSinceBootMillis()).thenReturn(testStartTimeMillis); + mWifiMetrics.logUserActionEvent( + mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType( + adaptiveConnectivityEnabled)); + long testStartTimeMillis2 = 200000L; + boolean adaptiveConnectivityEnabled2 = false; + when(mClock.getElapsedSinceBootMillis()).thenReturn(testStartTimeMillis2); + mWifiMetrics.logUserActionEvent( + mWifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType( + adaptiveConnectivityEnabled2)); + dumpProtoAndDeserialize(); + + WifiMetricsProto.UserActionEvent[] userActionEvents = mDecodedProto.userActionEvents; + assertEquals(2, userActionEvents.length); + assertEquals(WifiMetricsProto.UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_ON, + userActionEvents[0].eventType); + assertEquals(testStartTimeMillis, userActionEvents[0].startTimeMillis); + assertEquals(WifiMetricsProto.UserActionEvent.EVENT_CONFIGURE_ADAPTIVE_CONNECTIVITY_OFF, + userActionEvents[1].eventType); + assertEquals(testStartTimeMillis2, userActionEvents[1].startTimeMillis); + } + + /** * Verify that the max length of the UserActionEvent list is limited to MAX_USER_ACTION_EVENTS. */ @Test diff --git a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java index 0bd14a470..1507e9c55 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiNetworkSelectorTest.java @@ -741,6 +741,56 @@ public class WifiNetworkSelectorTest extends WifiBaseTest { } /** + * Wifi network selector stays with current network if current network is not nominated + * but has the higher score + */ + @Test + public void includeCurrentNetworkWhenCurrentNetworkNotNominated() { + String[] ssids = {"\"test1\"", "\"test2\""}; + String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; + int[] freqs = {2437, 5120}; + String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-PSK][ESS]"}; + int[] levels = {mThresholdMinimumRssi2G + 10, mThresholdMinimumRssi2G + 20}; + int[] securities = {SECURITY_EAP, SECURITY_PSK}; + // VHT cap IE + byte[] iesBytes = {(byte) 0x92, (byte) 0x01, (byte) 0x80, (byte) 0x33, (byte) 0xaa, + (byte) 0xff, (byte) 0x00, (byte) 0x00, (byte) 0xaa, (byte) 0xff, (byte) 0x00, + (byte) 0x00}; + byte[][] iesByteStream = {iesBytes, iesBytes}; + // Make a network selection to connect to test1. + ScanDetailsAndWifiConfigs scanDetailsAndConfigs = + WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids, + freqs, caps, levels, securities, mWifiConfigManager, mClock, iesByteStream); + List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails(); + assertEquals(2, scanDetails.size()); + HashSet<String> blocklist = new HashSet<String>(); + List<WifiCandidates.Candidate> candidates = mWifiNetworkSelector.getCandidatesFromScan( + scanDetails, blocklist, mWifiInfo, false, true, false); + WifiConfiguration candidate = mWifiNetworkSelector.selectNetwork(candidates); + + when(mWifiInfo.getSupplicantState()).thenReturn(SupplicantState.COMPLETED); + when(mWifiInfo.getNetworkId()).thenReturn(0); // 0 is current network + when(mWifiInfo.getBSSID()).thenReturn(bssids[0]); + when(mWifiInfo.is24GHz()).thenReturn(true); + when(mWifiInfo.getScore()).thenReturn(ConnectedScore.WIFI_TRANSITION_SCORE); + when(mWifiInfo.is5GHz()).thenReturn(false); + when(mWifiInfo.getFrequency()).thenReturn(2400); + when(mWifiInfo.getRssi()).thenReturn(levels[0]); + when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime() + + WifiNetworkSelector.MINIMUM_NETWORK_SELECTION_INTERVAL_MS + 2000); + + when(mThroughputPredictor.predictThroughput(any(), anyInt(), anyInt(), anyInt(), + anyInt(), anyInt(), anyInt(), anyInt(), anyBoolean())).thenReturn(100); + // Force to return 2nd network in the network nominator + mDummyNominator.setNetworkIndexToReturn(1); + + candidates = mWifiNetworkSelector.getCandidatesFromScan( + scanDetails, blocklist, mWifiInfo, true, false, false); + assertEquals(2, candidates.size()); + assertEquals(100, candidates.get(0).getPredictedThroughputMbps()); + } + + /** * If two qualified networks, test1 and test2, are in range when the user selects test2 over * test1, WifiNetworkSelector will override the NetworkSelector's choice to connect to test1 * with test2. diff --git a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java index cf83fbee3..954d4fe82 100644 --- a/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java +++ b/tests/wifitests/src/com/android/server/wifi/WifiScoreReportTest.java @@ -218,6 +218,8 @@ public class WifiScoreReportTest extends WifiBaseTest { DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS); when(mDeviceConfigFacade.getMinConfirmationDurationSendHighScoreMs()).thenReturn( DeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_HIGH_SCORE_MS); + when(mDeviceConfigFacade.getRssiThresholdNotSendLowScoreToCsDbm()).thenReturn( + DeviceConfigFacade.DEFAULT_RSSI_THRESHOLD_NOT_SEND_LOW_SCORE_TO_CS_DBM); } /** @@ -880,6 +882,7 @@ public class WifiScoreReportTest extends WifiBaseTest { mClock.mStepMillis = 0; mClock.mWallClockMillis = 10; + mWifiInfo.setRssi(-65); scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 49); mLooper.dispatchAll(); verify(mNetworkAgent).sendNetworkScore(anyInt()); @@ -901,9 +904,11 @@ public class WifiScoreReportTest extends WifiBaseTest { mClock.mWallClockMillis = 10; scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 60); + mWifiInfo.setRssi(-70); mLooper.dispatchAll(); verify(mNetworkAgent).sendNetworkScore(60); mClock.mWallClockMillis = 3010; + mWifiInfo.setRssi(-65); scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 59); mLooper.dispatchAll(); verify(mNetworkAgent).sendNetworkScore(59); @@ -914,11 +919,11 @@ public class WifiScoreReportTest extends WifiBaseTest { } /** - * Verify confirmation duration is added for reporting low score when it is enabled in - * config overlay + * Verify confirmation duration and RSSI check is added for reporting low score when it is + * enabled in config overlay */ @Test - public void confirmationDurationIsAddedForSendingLowScore() throws Exception { + public void confirmationDurationAndRssiCheckIsAddedForSendingLowScore() throws Exception { WifiConnectedNetworkScorerImpl scorerImpl = new WifiConnectedNetworkScorerImpl(); // Register Client for verification. mWifiScoreReport.setWifiConnectedNetworkScorer(mAppBinder, scorerImpl); @@ -939,11 +944,13 @@ public class WifiScoreReportTest extends WifiBaseTest { verify(mNetworkAgent, never()).sendNetworkScore(anyInt()); mClock.mWallClockMillis = 10 + mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS; + mWifiInfo.setRssi(-65); scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 47); mLooper.dispatchAll(); - verify(mNetworkAgent).sendNetworkScore(47); + verify(mNetworkAgent, never()).sendNetworkScore(47); mClock.mWallClockMillis = 10 + mDeviceConfigFacade.DEFAULT_MIN_CONFIRMATION_DURATION_SEND_LOW_SCORE_MS + 3000; + mWifiInfo.setRssi(-68); scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 46); mLooper.dispatchAll(); verify(mNetworkAgent).sendNetworkScore(46); @@ -968,6 +975,7 @@ public class WifiScoreReportTest extends WifiBaseTest { mLooper.dispatchAll(); verify(mNetworkAgent, never()).sendNetworkScore(anyInt()); mClock.mWallClockMillis = 3000; + mWifiInfo.setRssi(-70); scorerImpl.mScoreUpdateObserver.notifyScoreUpdate(scorerImpl.mSessionId, 51); mLooper.dispatchAll(); verify(mNetworkAgent).sendNetworkScore(51); |