18f0f666c8bdaf508f191f8590755140b92d970eaxinhe/* 28f0f666c8bdaf508f191f8590755140b92d970eaxinhe * Copyright (C) 2015 The Android Open Source Project 38f0f666c8bdaf508f191f8590755140b92d970eaxinhe * 48f0f666c8bdaf508f191f8590755140b92d970eaxinhe * Licensed under the Apache License, Version 2.0 (the "License"); 58f0f666c8bdaf508f191f8590755140b92d970eaxinhe * you may not use this file except in compliance with the License. 68f0f666c8bdaf508f191f8590755140b92d970eaxinhe * You may obtain a copy of the License at 78f0f666c8bdaf508f191f8590755140b92d970eaxinhe * 88f0f666c8bdaf508f191f8590755140b92d970eaxinhe * http://www.apache.org/licenses/LICENSE-2.0 98f0f666c8bdaf508f191f8590755140b92d970eaxinhe * 108f0f666c8bdaf508f191f8590755140b92d970eaxinhe * Unless required by applicable law or agreed to in writing, software 118f0f666c8bdaf508f191f8590755140b92d970eaxinhe * distributed under the License is distributed on an "AS IS" BASIS, 128f0f666c8bdaf508f191f8590755140b92d970eaxinhe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f0f666c8bdaf508f191f8590755140b92d970eaxinhe * See the License for the specific language governing permissions and 148f0f666c8bdaf508f191f8590755140b92d970eaxinhe * limitations under the License 158f0f666c8bdaf508f191f8590755140b92d970eaxinhe */ 168f0f666c8bdaf508f191f8590755140b92d970eaxinhe 178f0f666c8bdaf508f191f8590755140b92d970eaxinhepackage com.android.server.wifi; 188f0f666c8bdaf508f191f8590755140b92d970eaxinhe 190fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_EAP; 200fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE; 210fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK; 220fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig; 23b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 2494bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Willsimport static org.junit.Assert.assertEquals; 253ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslinimport static org.junit.Assert.assertSame; 2614145984773a3ffb992723045dd6d829c6328b83pkanwarimport static org.junit.Assert.assertTrue; 2714145984773a3ffb992723045dd6d829c6328b83pkanwarimport org.mockito.AdditionalAnswers; 283ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslinimport static org.mockito.Matchers.any; 293ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslinimport static org.mockito.Matchers.anyBoolean; 30b50356194ccfdaf5e127d9f705f99713d6f1e98cxinheimport static org.mockito.Matchers.anyInt; 3114145984773a3ffb992723045dd6d829c6328b83pkanwarimport static org.mockito.Matchers.anyObject; 323ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslinimport static org.mockito.Matchers.eq; 3394bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Willsimport static org.mockito.Mockito.mock; 3494bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Willsimport static org.mockito.Mockito.validateMockitoUsage; 353ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslinimport static org.mockito.Mockito.verify; 3694bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Willsimport static org.mockito.Mockito.when; 3794bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills 388f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.content.Context; 398f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.content.res.Resources; 408f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.net.NetworkScoreManager; 418f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.net.wifi.ScanResult; 428f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.net.wifi.WifiConfiguration; 43c83c0526b1c209ca9d831154a13c4ef9131b17f8xinheimport android.net.wifi.WifiEnterpriseConfig; 448f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.net.wifi.WifiInfo; 458f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.net.wifi.WifiSsid; 46ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Piusimport android.os.SystemClock; 4714145984773a3ffb992723045dd6d829c6328b83pkanwarimport android.os.UserManager; 488f0f666c8bdaf508f191f8590755140b92d970eaxinheimport android.test.suitebuilder.annotation.SmallTest; 49ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslinimport android.util.LocalLog; 5014145984773a3ffb992723045dd6d829c6328b83pkanwarimport com.android.server.wifi.NetworkUpdateResult; 518f0f666c8bdaf508f191f8590755140b92d970eaxinhe 528f0f666c8bdaf508f191f8590755140b92d970eaxinheimport com.android.internal.R; 53b50356194ccfdaf5e127d9f705f99713d6f1e98cxinheimport com.android.server.wifi.MockAnswerUtil.AnswerWithArguments; 5470570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Panimport com.android.server.wifi.util.ScanDetailUtil; 558f0f666c8bdaf508f191f8590755140b92d970eaxinhe 56c84802f3c6026f42cd39575d7cf23972ad9fe375xinheimport org.junit.After; 578f0f666c8bdaf508f191f8590755140b92d970eaxinheimport org.junit.Before; 588f0f666c8bdaf508f191f8590755140b92d970eaxinheimport org.junit.Test; 598f0f666c8bdaf508f191f8590755140b92d970eaxinhe 608f0f666c8bdaf508f191f8590755140b92d970eaxinheimport java.util.ArrayList; 61b50356194ccfdaf5e127d9f705f99713d6f1e98cxinheimport java.util.Arrays; 62167250a118f9fb93f88a867cc7679414da4dc8b4xinheimport java.util.HashMap; 638f0f666c8bdaf508f191f8590755140b92d970eaxinheimport java.util.List; 648f3ec73d1ce52b3f23e4cccd6a202b5707874f46xinheimport java.util.concurrent.atomic.AtomicInteger; 6594bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills 668f0f666c8bdaf508f191f8590755140b92d970eaxinhe/** 6794bd575cb4766ed0dfbaad0fc7719a9e9e85a260Mitchell Wills * Unit tests for {@link com.android.server.wifi.WifiQualifiedNetworkSelector}. 688f0f666c8bdaf508f191f8590755140b92d970eaxinhe */ 698f0f666c8bdaf508f191f8590755140b92d970eaxinhe@SmallTest 702177731ae0a49be7dd66fd05dfb0ca73831b062cRandy Panpublic class WifiQualifiedNetworkSelectorTest { 71b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 728f0f666c8bdaf508f191f8590755140b92d970eaxinhe @Before 738f0f666c8bdaf508f191f8590755140b92d970eaxinhe public void setUp() throws Exception { 748f0f666c8bdaf508f191f8590755140b92d970eaxinhe mResource = getResource(); 758f0f666c8bdaf508f191f8590755140b92d970eaxinhe mScoreManager = getNetworkScoreManager(); 763ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin mScoreCache = getScoreCache(); 778f0f666c8bdaf508f191f8590755140b92d970eaxinhe mContext = getContext(); 78c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius mWifiConfigManager = getWifiConfigManager(); 798f0f666c8bdaf508f191f8590755140b92d970eaxinhe mWifiInfo = getWifiInfo(); 80ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin mLocalLog = getLocalLog(); 81ed514c84aae008d245679f05c9dbcd7e71f126f8xinhe 82c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius mWifiQualifiedNetworkSelector = new WifiQualifiedNetworkSelector(mWifiConfigManager, 83c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius mContext, mWifiInfo, mClock); 848f0f666c8bdaf508f191f8590755140b92d970eaxinhe mWifiQualifiedNetworkSelector.enableVerboseLogging(1); 85167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.setUserPreferredBand(1); 863ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin mWifiQualifiedNetworkSelector.setWifiNetworkScoreCache(mScoreCache); 87ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime()); 88e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 89e22b68960966645a77cb71042879a4ab0d9bd638pkanwar //setup Carrier Networks 9014145984773a3ffb992723045dd6d829c6328b83pkanwar int eapType = 4; 9114145984773a3ffb992723045dd6d829c6328b83pkanwar 92e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration wifiConfig = new WifiConfiguration(); 93e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig.SSID = "\"TEST1\""; 94e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 9514145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig.enterpriseConfig = new WifiEnterpriseConfig(); 9614145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig.enterpriseConfig.setEapMethod(eapType); 97e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mCarrierConfiguredNetworks.add(wifiConfig); 98e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 99e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration wifiConfig1 = new WifiConfiguration(); 100e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig1.SSID = "\"TEST2\""; 101e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 10214145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig1.enterpriseConfig = new WifiEnterpriseConfig(); 10314145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig1.enterpriseConfig.setEapMethod(eapType); 104e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mCarrierConfiguredNetworks.add(wifiConfig1); 105e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 106e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration wifiConfig2 = new WifiConfiguration(); 107e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig2.SSID = "\"TEST3\""; 108e22b68960966645a77cb71042879a4ab0d9bd638pkanwar wifiConfig2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP); 10914145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig2.enterpriseConfig = new WifiEnterpriseConfig(); 11014145984773a3ffb992723045dd6d829c6328b83pkanwar wifiConfig2.enterpriseConfig.setEapMethod(eapType); 111e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mCarrierConfiguredNetworks.add(wifiConfig2); 112e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mWifiQualifiedNetworkSelector.setCarrierConfiguredNetworks(mCarrierConfiguredNetworks); 1138f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1148f0f666c8bdaf508f191f8590755140b92d970eaxinhe 115c84802f3c6026f42cd39575d7cf23972ad9fe375xinhe @After 116c84802f3c6026f42cd39575d7cf23972ad9fe375xinhe public void cleanup() { 117c84802f3c6026f42cd39575d7cf23972ad9fe375xinhe validateMockitoUsage(); 118c84802f3c6026f42cd39575d7cf23972ad9fe375xinhe } 119c84802f3c6026f42cd39575d7cf23972ad9fe375xinhe 1208f0f666c8bdaf508f191f8590755140b92d970eaxinhe private WifiQualifiedNetworkSelector mWifiQualifiedNetworkSelector = null; 121c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius private WifiConfigManager mWifiConfigManager = null; 1228f0f666c8bdaf508f191f8590755140b92d970eaxinhe private Context mContext; 1238f0f666c8bdaf508f191f8590755140b92d970eaxinhe private Resources mResource; 1248f0f666c8bdaf508f191f8590755140b92d970eaxinhe private NetworkScoreManager mScoreManager; 1253ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin private WifiNetworkScoreCache mScoreCache; 1268f0f666c8bdaf508f191f8590755140b92d970eaxinhe private WifiInfo mWifiInfo; 127ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin private LocalLog mLocalLog; 128ed514c84aae008d245679f05c9dbcd7e71f126f8xinhe private Clock mClock = mock(Clock.class); 129c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private static final String[] DEFAULT_SSIDS = {"\"test1\"", "\"test2\""}; 130c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private static final String[] DEFAULT_BSSIDS = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 131c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private static final String TAG = "QNS Unit Test"; 132e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<WifiConfiguration> mCarrierConfiguredNetworks = new ArrayList<WifiConfiguration>(); 1338f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1348f0f666c8bdaf508f191f8590755140b92d970eaxinhe private List<ScanDetail> getScanDetails(String[] ssids, String[] bssids, int[] frequencies, 135167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps, int[] levels) { 136167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetailList = new ArrayList<ScanDetail>(); 137ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius long timeStamp = mClock.elapsedRealtime(); 1388f0f666c8bdaf508f191f8590755140b92d970eaxinhe for (int index = 0; index < ssids.length; index++) { 1398f0f666c8bdaf508f191f8590755140b92d970eaxinhe ScanDetail scanDetail = new ScanDetail(WifiSsid.createFromAsciiEncoded(ssids[index]), 1408f0f666c8bdaf508f191f8590755140b92d970eaxinhe bssids[index], caps[index], levels[index], frequencies[index], timeStamp, 0); 1418f0f666c8bdaf508f191f8590755140b92d970eaxinhe scanDetailList.add(scanDetail); 1428f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1438f0f666c8bdaf508f191f8590755140b92d970eaxinhe return scanDetailList; 1448f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1458f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1468f0f666c8bdaf508f191f8590755140b92d970eaxinhe Context getContext() { 1478f0f666c8bdaf508f191f8590755140b92d970eaxinhe Context context = mock(Context.class); 1488f0f666c8bdaf508f191f8590755140b92d970eaxinhe Resources resource = mock(Resources.class); 1498f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1508f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(context.getResources()).thenReturn(mResource); 1518f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(context.getSystemService(Context.NETWORK_SCORE_SERVICE)).thenReturn(mScoreManager); 1528f0f666c8bdaf508f191f8590755140b92d970eaxinhe return context; 1538f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1548f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1558f0f666c8bdaf508f191f8590755140b92d970eaxinhe Resources getResource() { 1568f0f666c8bdaf508f191f8590755140b92d970eaxinhe Resources resource = mock(Resources.class); 1578f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1588f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_SECURITY_AWARD)).thenReturn(80); 1598f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_RSSI_SCORE_OFFSET)).thenReturn(85); 1608f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_SAME_BSSID_AWARD)).thenReturn(24); 1618f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_LAST_SELECTION_AWARD)) 1628f0f666c8bdaf508f191f8590755140b92d970eaxinhe .thenReturn(480); 1638f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_PASSPOINT_SECURITY_AWARD)) 1648f0f666c8bdaf508f191f8590755140b92d970eaxinhe .thenReturn(40); 1658f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(resource.getInteger(R.integer.config_wifi_framework_SECURITY_AWARD)).thenReturn(80); 166c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe when(resource.getInteger(R.integer.config_wifi_framework_RSSI_SCORE_SLOPE)).thenReturn(4); 1678f0f666c8bdaf508f191f8590755140b92d970eaxinhe return resource; 1688f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1698f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1708f0f666c8bdaf508f191f8590755140b92d970eaxinhe NetworkScoreManager getNetworkScoreManager() { 1718f0f666c8bdaf508f191f8590755140b92d970eaxinhe NetworkScoreManager networkScoreManager = mock(NetworkScoreManager.class); 1728f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1738f0f666c8bdaf508f191f8590755140b92d970eaxinhe return networkScoreManager; 1748f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1758f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1763ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin WifiNetworkScoreCache getScoreCache() { 1773ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin return mock(WifiNetworkScoreCache.class); 1783ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin } 1793ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 180ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin LocalLog getLocalLog() { 181ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin return new LocalLog(0); 182ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 183ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1848f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiInfo getWifiInfo() { 1858f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiInfo wifiInfo = mock(WifiInfo.class); 1868f0f666c8bdaf508f191f8590755140b92d970eaxinhe 1878f0f666c8bdaf508f191f8590755140b92d970eaxinhe //simulate a disconnected state 1888f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.is24GHz()).thenReturn(true); 1898f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.is5GHz()).thenReturn(false); 1908f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.getRssi()).thenReturn(-70); 1918f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.getNetworkId()).thenReturn(WifiConfiguration.INVALID_NETWORK_ID); 1928f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.getBSSID()).thenReturn(null); 1938f0f666c8bdaf508f191f8590755140b92d970eaxinhe when(wifiInfo.getNetworkId()).thenReturn(-1); 1948f0f666c8bdaf508f191f8590755140b92d970eaxinhe return wifiInfo; 1958f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 1968f0f666c8bdaf508f191f8590755140b92d970eaxinhe 197c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius WifiConfigManager getWifiConfigManager() { 198c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius WifiConfigManager wifiConfigManager = mock(WifiConfigManager.class); 19973a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mThresholdSaturatedRssi24 = new AtomicInteger( 2008f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiQualifiedNetworkSelector.RSSI_SATURATION_2G_BAND); 20173a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mBandAward5Ghz = new AtomicInteger( 2028f3ec73d1ce52b3f23e4cccd6a202b5707874f46xinhe WifiQualifiedNetworkSelector.BAND_AWARD_5GHz); 20373a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mCurrentNetworkBoost = new AtomicInteger( 2048f3ec73d1ce52b3f23e4cccd6a202b5707874f46xinhe WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD); 20573a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mThresholdQualifiedRssi5 = new AtomicInteger( 2068f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND); 20773a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mThresholdMinimumRssi24 = new AtomicInteger( 2088f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI); 20973a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan wifiConfigManager.mThresholdMinimumRssi5 = new AtomicInteger( 2108f0f666c8bdaf508f191f8590755140b92d970eaxinhe WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI); 2118f0f666c8bdaf508f191f8590755140b92d970eaxinhe 21273a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(wifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 213c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius return wifiConfigManager; 2148f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 2158f0f666c8bdaf508f191f8590755140b92d970eaxinhe 2168f0f666c8bdaf508f191f8590755140b92d970eaxinhe /** 217b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * This API is used to generate multiple simulated saved configurations used for test 218167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 219167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * @param ssid array of SSID of saved configuration 220b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * @param security array of securities of saved configuration 221b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * @return generated new array of configurations based on input 222b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe */ 223b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe private WifiConfiguration[] generateWifiConfigurations(String[] ssid, int[] security) { 224b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe if (ssid == null || security == null || ssid.length != security.length 225b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe || ssid.length == 0) { 226b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe return null; 227b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 228b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 229b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe WifiConfiguration[] configs = new WifiConfiguration[ssid.length]; 230b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe for (int index = 0; index < ssid.length; index++) { 231167250a118f9fb93f88a867cc7679414da4dc8b4xinhe configs[index] = generateWifiConfig(index, 0, ssid[index], false, true, null, null, 232b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe security[index]); 233b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 234b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 235b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe return configs; 236b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 237b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 238b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe /** 239c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * set configuration to a passpoint configuration 240167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 241167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * @param config The configuration need to be set as a passipoint configuration 242c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 243c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private void setConfigPasspoint(WifiConfiguration config) { 244c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe config.FQDN = "android.qns.unitTest"; 245c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe config.providerFriendlyName = "android.qns.unitTest"; 246167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiEnterpriseConfig enterpriseConfig = mock(WifiEnterpriseConfig.class); 247c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe when(enterpriseConfig.getEapMethod()).thenReturn(WifiEnterpriseConfig.Eap.PEAP); 248c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 249c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 250c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 251c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 252c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius * add the Configurations to WifiConfigManager (WifiConfigureStore can take them out according 253c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius * to the networkd ID) 254167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 255167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * @param configs input configuration need to be added to WifiConfigureStore 256c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 257c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private void prepareConfigStore(final WifiConfiguration[] configs) { 258c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius when(mWifiConfigManager.getWifiConfiguration(anyInt())) 25979d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills .then(new AnswerWithArguments() { 260c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public WifiConfiguration answer(int netId) { 261c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe if (netId >= 0 && netId < configs.length) { 262c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe return configs[netId]; 263c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } else { 264c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe return null; 265c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 266c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 267c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe }); 268c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 269c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 270c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 271ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Link scan results to the saved configurations. 272ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 273ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The shorter of the 2 input params will be used to loop over so the inputs don't 274ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * need to be of equal length. If there are more scan details then configs the remaining scan 275ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * details will be associated with a NULL config. 276167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 277167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * @param configs saved configurations 278c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * @param scanDetails come in scan results 279c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 280c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private void scanResultLinkConfiguration(WifiConfiguration[] configs, 281167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails) { 282ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin if (scanDetails.size() <= configs.length) { 283ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin for (int i = 0; i < scanDetails.size(); i++) { 284ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanDetail scanDetail = scanDetails.get(i); 285ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<WifiConfiguration> associateWithScanResult = new ArrayList<>(); 286ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin associateWithScanResult.add(configs[i]); 2871e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetail), 2881e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(associateWithScanResult); 289ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 290ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } else { 291ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin for (int i = 0; i < configs.length; i++) { 292ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanDetail scanDetail = scanDetails.get(i); 293ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<WifiConfiguration> associateWithScanResult = new ArrayList<>(); 294ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin associateWithScanResult.add(configs[i]); 2951e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetail), 2961e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(associateWithScanResult); 297ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 298c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 299ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // associated the remaining scan details with a NULL config. 300ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin for (int i = configs.length; i < scanDetails.size(); i++) { 3011e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetails.get(i)), 3021e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 303ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 304c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 305c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 306c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 3073ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin private void configureScoreCache(List<ScanDetail> scanDetails, Integer[] scores, 3083ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin boolean[] meteredHints) { 3093ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin for (int i = 0; i < scanDetails.size(); i++) { 3103ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin ScanDetail scanDetail = scanDetails.get(i); 3113ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin Integer score = scores[i]; 3123ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin ScanResult scanResult = scanDetail.getScanResult(); 3133ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin if (score != null) { 3143ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mScoreCache.isScoredNetwork(scanResult)).thenReturn(true); 3153ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mScoreCache.hasScoreCurve(scanResult)).thenReturn(true); 3163ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mScoreCache.getNetworkScore(eq(scanResult), anyBoolean())).thenReturn(score); 3173ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mScoreCache.getNetworkScore(scanResult)).thenReturn(score); 3180efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne } else { 3190efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mScoreCache.isScoredNetwork(scanResult)).thenReturn(false); 3200efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mScoreCache.hasScoreCurve(scanResult)).thenReturn(false); 3210efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mScoreCache.getNetworkScore(eq(scanResult), anyBoolean())).thenReturn( 3220efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiNetworkScoreCache.INVALID_NETWORK_SCORE); 3230efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mScoreCache.getNetworkScore(scanResult)).thenReturn( 3240efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiNetworkScoreCache.INVALID_NETWORK_SCORE); 3253ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin } 3263ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mScoreCache.getMeteredHint(scanResult)).thenReturn(meteredHints[i]); 3273ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin } 3283ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin } 3293ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 330c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 331c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * verify whether the chosen configuration matched with the expected chosen scan result 332167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 333c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * @param chosenScanResult the expected chosen scan result 334167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * @param candidate the chosen configuration 335c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 336c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe private void verifySelectedResult(ScanResult chosenScanResult, WifiConfiguration candidate) { 337c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult candidateScan = candidate.getNetworkSelectionStatus().getCandidate(); 338c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe assertEquals("choose the wrong SSID", chosenScanResult.SSID, candidate.SSID); 339c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe assertEquals("choose the wrong BSSID", chosenScanResult.BSSID, candidateScan.BSSID); 340c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 341c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 342c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe // QNS test under disconnected State 343167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 344c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 345c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #1 choose 2GHz stronger RSSI test 346167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 347c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 348c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 349c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1, test2 are secured network 350c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled, encrypted and at 2.4 GHz 351c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test1 is with RSSI -70 test2 is with RSSI -60 352167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 353c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Expected behavior: test2 is chosen 354c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 355c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 356c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkDisconnected2GHighestRssi() { 357c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 358c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 359c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 2417}; 360c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 361c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-70, -60}; 362c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 363c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 364c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 365c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 366c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 367c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 368c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 369c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 37060969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 371c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 372c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 373c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 374c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult(); 375c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 376c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 377c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 378c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 379c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 380c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 381c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 382c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 383c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #2 choose 5GHz Stronger RSSI Test 384167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 385c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 386c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 387c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1, test2 are secured network 388c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled, encrypted and at 5 GHz 389c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test1 is with RSSI -70 test2 is with RSSI -60 390167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 391c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Expected behavior: test2 is chosen 392c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 393c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 394c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkDisconnected5GHighestRssi() { 395c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 396c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 397c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {5180, 5610}; 398c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 399c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-70, -60}; 400c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 401c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 402c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 403c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 404c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 405c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 406c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 407c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 40860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 409c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 410c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 411c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult(); 412c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 413c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 414c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 415c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 416c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 417c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 418c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 419c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 420c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #3 5GHz over 2GHz bonus Test 421167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 4228f0f666c8bdaf508f191f8590755140b92d970eaxinhe * In this test. we simulate following scenario 4238f0f666c8bdaf508f191f8590755140b92d970eaxinhe * WifiStateMachine is under disconnected state 4248f0f666c8bdaf508f191f8590755140b92d970eaxinhe * Two networks test1, test2 are secured network 4258f0f666c8bdaf508f191f8590755140b92d970eaxinhe * Both network are enabled 426c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test1 is @ 2GHz with RSSI -60 427b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * test2 is @ 5Ghz with RSSI -65 428167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 429c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Expected behavior: test2 is chosen due to 5GHz bonus 4308f0f666c8bdaf508f191f8590755140b92d970eaxinhe */ 431b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe @Test 432b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe public void chooseNetworkDisconnect5GOver2GTest() { 433c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 434c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 4358f0f666c8bdaf508f191f8590755140b92d970eaxinhe int[] frequencies = {2437, 5180}; 4368f0f666c8bdaf508f191f8590755140b92d970eaxinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 437c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-60, -65}; 438b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 4398f0f666c8bdaf508f191f8590755140b92d970eaxinhe 4408f0f666c8bdaf508f191f8590755140b92d970eaxinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 441c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 442c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 443c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 444c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 44560969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 446c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 447c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult(); 448c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 449c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 450c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 4518f0f666c8bdaf508f191f8590755140b92d970eaxinhe 452c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 453c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 454b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 455c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 456c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #4 2GHz over 5GHz dur to 5GHz signal too weak test 457167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 458c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 459c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 460c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1, test2 are secured network 461c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled 462c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test1 is @ 2GHz with RSSI -60 463c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test2 is @ 5Ghz with RSSI -75 464167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 465c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not 466c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * compensate) 467c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 468c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 469c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkDisconnect2GOver5GTest() { 470c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 471c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 472c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 5180}; 473c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 474c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-60, -75}; 475c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 476b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 477c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 478c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 479c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 480b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 481c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 48260969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 483c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 484c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 4858f0f666c8bdaf508f191f8590755140b92d970eaxinhe 486c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 487c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 4888f0f666c8bdaf508f191f8590755140b92d970eaxinhe 489c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 490c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 4918f0f666c8bdaf508f191f8590755140b92d970eaxinhe 492c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 493c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #5 2GHz signal Saturation test 494167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 495c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 496c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 497c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1, test2 are secured network 498c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled 499c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test1 is @ 2GHz with RSSI -50 500c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test2 is @ 5Ghz with RSSI -65 501167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 502c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Expected behavior: test2 is chosen. Although the RSSI delta here is 15 too, because 2GHz RSSI 503167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * saturates at -60, the real RSSI delta is only 5, which is less than 5GHz bonus 504c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 505c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 506c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkDisconnect2GRssiSaturationTest() { 507c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 508c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 509c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 5180}; 510c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 511c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-50, -65}; 512c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 513c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 514c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 515c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 516c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 517c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 518c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 51960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 520c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 521b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult(); 522b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 523b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 524b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe false, scanDetails, false, false, true, false); 525b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe 526c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 527c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 528c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 529c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 530c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #6 Minimum RSSI test 531167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 532c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 533c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 534c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1, test2 are secured network 535c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled 536167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test1 is @ 2GHz with RSSI -86 537167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test2 is @ 5Ghz with RSSI -83 538167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 539167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: no QNS is made because both network are below the minimum threshold, null 540c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 541c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 542c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkMinimumRssiTest() { 543c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 544c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 545c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 5180}; 546c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 547167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI - 1, 548167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI - 1}; 549c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_EAP, SECURITY_PSK}; 550c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 551c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 552c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 553c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 554c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 555c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 55660969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 557c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 558c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 559c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 560c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 561c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 562c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe assertEquals("choose the wrong SSID", null, candidate); 563c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 564167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 565c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 566c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #7 encrypted network over passpoint network 567167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 568c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 569c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 570c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1 is secured network, test2 are passpoint network 571c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled and at 2.4 GHz. Both have RSSI of -70 572167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 573167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: test1 is chosen since secured network has higher priority than passpoint 574167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * network 575c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 576c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 577c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkSecurityOverPassPoint() { 578c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 579c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 580c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 2437}; 5813ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 582c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-70, -70}; 583c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_EAP, SECURITY_NONE}; 584c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 585c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 586c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 587c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe setConfigPasspoint(savedConfigs[1]); 588c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 589c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 590c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 59160969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 592c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 593c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 594c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 595c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 596c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 597c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 598c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 599c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 600c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 601c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 602c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #8 passpoint network over open network 603167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 604c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 605c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 606c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1 is passpoint network, test2 is open network 607c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled and at 2.4 GHz. Both have RSSI of -70 608167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 609167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: test1 is chosen since passpoint network has higher priority than open 610167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * network 611c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 612c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 613c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkPasspointOverOpen() { 614c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = {"\"test1\"", "\"test2\""}; 615c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = {"6c:f3:7f:ae:8c:f8", "6c:f3:7f:ae:8c:f4"}; 616c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 2437}; 617c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 618c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-70, -70}; 619c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_NONE, SECURITY_NONE}; 620c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 621c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 622c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 623c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe setConfigPasspoint(savedConfigs[0]); 624c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 625c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 626c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 62760969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 628c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 629c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 630c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 631c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 632c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 633c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 634c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 635b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 636b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 637c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe /** 638c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Case #9 secure network over open network 639167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 640c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * In this test. we simulate following scenario 641c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * WifiStateMachine is under disconnected state 642c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Two networks test1 is secure network, test2 is open network 643c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * Both network are enabled and at 2.4 GHz. Both have RSSI of -70 644167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 645167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: test1 is chosen since secured network has higher priority than open 646167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * network 647c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe */ 648c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe @Test 649c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe public void chooseNetworkSecureOverOpen() { 650c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 651c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 652c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] frequencies = {2437, 2437}; 653c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 654c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] levels = {-70, -70}; 655c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe int[] security = {SECURITY_PSK, SECURITY_NONE}; 656c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 657c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 658c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 659c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 660c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 661c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 66260969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 663c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 664c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 665c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 666c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 667c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe false, scanDetails, false, false, true, false); 668c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 669c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe } 6708f3ec73d1ce52b3f23e4cccd6a202b5707874f46xinhe 671b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe /** 672167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Case #10 first time user select a network 673167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 674b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * In this test. we simulate following scenario 675b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * There are three saved networks: test1, test2 and test3. Now user select the network test3 676c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * check test3 has been saved in test1's and test2's ConnectChoice 677167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 678167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: test1's and test2's ConnectChoice should be test3, test3's ConnectChoice 679167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * should be null 680b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe */ 681b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe @Test 682b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe public void userSelectsNetworkForFirstTime() { 683b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""}; 684b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_NONE}; 685b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 686b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe final WifiConfiguration[] configs = generateWifiConfigurations(ssids, security); 687c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(configs); 68860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(configs)); 689b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe for (WifiConfiguration network : configs) { 690b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe WifiConfiguration.NetworkSelectionStatus status = network.getNetworkSelectionStatus(); 691b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe status.setSeenInLastQualifiedNetworkSelection(true); 692b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 693b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 694b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe mWifiQualifiedNetworkSelector.userSelectNetwork(configs.length - 1, true); 695b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe String key = configs[configs.length - 1].configKey(); 696b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe for (int index = 0; index < configs.length; index++) { 697b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe WifiConfiguration config = configs[index]; 698b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe WifiConfiguration.NetworkSelectionStatus status = config.getNetworkSelectionStatus(); 699b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe if (index == configs.length - 1) { 700b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe assertEquals("User selected network should not have prefernce over it", null, 701b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe status.getConnectChoice()); 702b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } else { 703b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe assertEquals("Wrong user preference", key, status.getConnectChoice()); 704b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 705b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 706b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 707b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 708b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe /** 709167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Case #11 choose user selected network 710167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 711b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * In this test, we simulate following scenario: 712167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under disconnected state 713b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * There are three networks: test1, test2, test3 and test3 is the user preference 714b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * All three networks are enabled 715b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * test1 is @ 2.4GHz with RSSI -50 PSK 716b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe * test2 is @ 5Ghz with RSSI -65 PSK 717c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * test3 is @ 2.4GHz with RSSI -55 open 718167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 719167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Expected behavior: test3 is chosen since it is user selected network. It overcome all other 720167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * priorities 721b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe */ 722b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe @Test 723b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe public void chooseUserPreferredNetwork() { 724b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""}; 725b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_NONE}; 726c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 727b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe final WifiConfiguration[] configs = generateWifiConfigurations(ssids, security); 728c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(configs); 729b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe for (WifiConfiguration network : configs) { 730b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe WifiConfiguration.NetworkSelectionStatus status = network.getNetworkSelectionStatus(); 731b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe status.setSeenInLastQualifiedNetworkSelection(true); 732b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe } 733b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 73460969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(configs)); 735b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 736b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe //set user preference 737b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe mWifiQualifiedNetworkSelector.userSelectNetwork(ssids.length - 1, true); 738b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe //Generate mocked recent scan results 739b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:f3:7f:ae:8c:f5"}; 740b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe int[] frequencies = {2437, 5180, 2437}; 741b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]", "NONE"}; 742b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe int[] levels = {-50, -65, -55}; 743b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 744b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 745c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(configs, scanDetails); 746b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe 747b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe ScanResult chosenScanResult = scanDetails.get(scanDetails.size() - 1).getScanResult(); 748c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius when(mWifiConfigManager.getWifiConfiguration(configs[2].configKey())) 749b50356194ccfdaf5e127d9f705f99713d6f1e98cxinhe .thenReturn(configs[2]); 750b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe 751b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 752b96deebb3e7ce2587fef3cab0049c703d0623c24xinhe false, scanDetails, false, false, true, false); 753c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 7548f0f666c8bdaf508f191f8590755140b92d970eaxinhe } 7557b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 7567b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe /** 757167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Case #12 enable a blacklisted BSSID 7587b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * 759167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test, we simulate following scenario: 760c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe * For two Aps, BSSIDA and BSSIDB. Disable BSSIDA, then check whether BSSIDA is disabled and 7617b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * BSSIDB is enabled. Then enable BSSIDA, check whether both BSSIDs are enabled. 7627b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe */ 7637b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe @Test 7647b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe public void enableBssidTest() { 7657b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe String bssidA = "6c:f3:7f:ae:8c:f3"; 7667b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe String bssidB = "6c:f3:7f:ae:8c:f4"; 7677b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe //check by default these two BSSIDs should be enabled 7687b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidA should be enabled by default", 7697b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false); 7707b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidB should be enabled by default", 7717b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false); 7727b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 7736ed97affc9bbce6497b6155285ba4a71196d69e1xinhe //disable bssidA 3 times, check whether A is dsiabled and B is still enabled 7746ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false); 7756ed97affc9bbce6497b6155285ba4a71196d69e1xinhe assertEquals("bssidA should be disabled", 7766ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false); 7776ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false); 7786ed97affc9bbce6497b6155285ba4a71196d69e1xinhe assertEquals("bssidA should be disabled", 7796ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false); 7806ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, false); 7817b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidA should be disabled", 7827b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), true); 7837b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidB should still be enabled", 7847b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false); 7857b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 7867b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe //re-enable bssidA, check whether A is dsiabled and B is still enabled 7876ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssidA, true); 7887b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidA should be enabled by default", 7897b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidA), false); 7907b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe assertEquals("bssidB should be enabled by default", 7917b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe mWifiQualifiedNetworkSelector.isBssidDisabled(bssidB), false); 7927b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 7937b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe //make sure illegal input will not cause crash 7946ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(null, false); 7956ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(null, true); 7967b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe } 7977b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 7987b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe /** 799167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Case #13 do not choose the BSSID has been disabled 800167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 8017b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * In this test. we simulate following scenario: 8027b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * WifiStateMachine is under disconnected state 8037b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * Two networks test1, test2 are secured network and found in scan results 8047b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * Both network are enabled 805167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test1 is @ 2GHz with RSSI -65 806167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test2 is @ 5Ghz with RSSI -50 8077b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe * test2's BSSID is disabled 808167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 809167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected return test1 since test2's BSSID has been disabled 8107b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe */ 8117b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe @Test 8127b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe public void networkChooseWithOneBssidDisabled() { 813c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] ssids = DEFAULT_SSIDS; 814c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe String[] bssids = DEFAULT_BSSIDS; 8157b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe int[] frequencies = {2437, 5180}; 8167b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 817167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-65, -50}; 8187b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 8197b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 8207b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 821c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 822c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe prepareConfigStore(savedConfigs); 8237b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 824c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 82560969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 826c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 8277b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 8287b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 8296ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8306ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8316ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8326ed97affc9bbce6497b6155285ba4a71196d69e1xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 8336ed97affc9bbce6497b6155285ba4a71196d69e1xinhe false, scanDetails, false, false, true, false); 8346ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 8356ed97affc9bbce6497b6155285ba4a71196d69e1xinhe verifySelectedResult(chosenScanResult, candidate); 8366ed97affc9bbce6497b6155285ba4a71196d69e1xinhe } 8376ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 8386ed97affc9bbce6497b6155285ba4a71196d69e1xinhe /** 8396ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #14 re-choose the disabled BSSID after it is re-enabled 8406ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * 8416ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * In this test. we simulate following scenario: 8426ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * WifiStateMachine is under disconnected state 8436ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Two networks test1, test2 are secured network and found in scan results 8446ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Both network are enabled 8456ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test1 is @ 2GHz with RSSI -65 8466ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test2 is @ 5Ghz with RSSI -50 8476ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test2's BSSID is disabled 8486ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * 8496ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * expected return test2 since test2's BSSID has been enabled again 8506ed97affc9bbce6497b6155285ba4a71196d69e1xinhe */ 8516ed97affc9bbce6497b6155285ba4a71196d69e1xinhe @Test 8526ed97affc9bbce6497b6155285ba4a71196d69e1xinhe public void networkChooseWithOneBssidReenaabled() { 8536ed97affc9bbce6497b6155285ba4a71196d69e1xinhe String[] ssids = DEFAULT_SSIDS; 8546ed97affc9bbce6497b6155285ba4a71196d69e1xinhe String[] bssids = DEFAULT_BSSIDS; 8556ed97affc9bbce6497b6155285ba4a71196d69e1xinhe int[] frequencies = {2437, 5180}; 8566ed97affc9bbce6497b6155285ba4a71196d69e1xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 8576ed97affc9bbce6497b6155285ba4a71196d69e1xinhe int[] levels = {-65, -50}; 8586ed97affc9bbce6497b6155285ba4a71196d69e1xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 8596ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 8606ed97affc9bbce6497b6155285ba4a71196d69e1xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 8616ed97affc9bbce6497b6155285ba4a71196d69e1xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 8626ed97affc9bbce6497b6155285ba4a71196d69e1xinhe prepareConfigStore(savedConfigs); 8636ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 8646ed97affc9bbce6497b6155285ba4a71196d69e1xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 86560969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 8666ed97affc9bbce6497b6155285ba4a71196d69e1xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 8676ed97affc9bbce6497b6155285ba4a71196d69e1xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 8686ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 8696ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8706ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8716ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 8726ed97affc9bbce6497b6155285ba4a71196d69e1xinhe //re-enable it 8736ed97affc9bbce6497b6155285ba4a71196d69e1xinhe mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], true); 8747b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 8757b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe false, scanDetails, false, false, true, false); 8767b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 877c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe verifySelectedResult(chosenScanResult, candidate); 878167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 879167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 880167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 8816ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #15 re-choose the disabled BSSID after its disability has expired 8826ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * 8836ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * In this test. we simulate following scenario: 8846ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * WifiStateMachine is under disconnected state 8856ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Two networks test1, test2 are secured network and found in scan results 8866ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Both network are enabled 8876ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test1 is @ 2GHz with RSSI -65 8886ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test2 is @ 5Ghz with RSSI -50 8896ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * test2's BSSID is disabled 8906ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * 8916ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * expected return test2 since test2's BSSID has been enabled again 8926ed97affc9bbce6497b6155285ba4a71196d69e1xinhe */ 8936ed97affc9bbce6497b6155285ba4a71196d69e1xinhe @Test 8946ed97affc9bbce6497b6155285ba4a71196d69e1xinhe public void networkChooseWithOneBssidDisableExpire() { 8954c618adccba43334df62ad7d2949138344c11f58xin He String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\""}; 8964c618adccba43334df62ad7d2949138344c11f58xin He String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:f3:7f:ae:8c:f5"}; 8974c618adccba43334df62ad7d2949138344c11f58xin He int[] frequencies = {2437, 5180, 5180}; 8984c618adccba43334df62ad7d2949138344c11f58xin He String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]", 8994c618adccba43334df62ad7d2949138344c11f58xin He "[WPA2-EAP-CCMP][ESS][ESS]"}; 9004c618adccba43334df62ad7d2949138344c11f58xin He int[] levels = {-65, -50, -60}; 9014c618adccba43334df62ad7d2949138344c11f58xin He int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 9026ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 9036ed97affc9bbce6497b6155285ba4a71196d69e1xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 9046ed97affc9bbce6497b6155285ba4a71196d69e1xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 9056ed97affc9bbce6497b6155285ba4a71196d69e1xinhe prepareConfigStore(savedConfigs); 9066ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 9076ed97affc9bbce6497b6155285ba4a71196d69e1xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 90860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 9096ed97affc9bbce6497b6155285ba4a71196d69e1xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 9106ed97affc9bbce6497b6155285ba4a71196d69e1xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 9116ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 9124c618adccba43334df62ad7d2949138344c11f58xin He for (int index = 0; index < WifiQualifiedNetworkSelector.BSSID_BLACKLIST_THRESHOLD; 9134c618adccba43334df62ad7d2949138344c11f58xin He index++) { 9144c618adccba43334df62ad7d2949138344c11f58xin He mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[1], false); 9154c618adccba43334df62ad7d2949138344c11f58xin He mWifiQualifiedNetworkSelector.enableBssidForQualityNetworkSelection(bssids[2], false); 9164c618adccba43334df62ad7d2949138344c11f58xin He } 9174c618adccba43334df62ad7d2949138344c11f58xin He 9186ed97affc9bbce6497b6155285ba4a71196d69e1xinhe //re-enable it 919ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() 9206ed97affc9bbce6497b6155285ba4a71196d69e1xinhe + WifiQualifiedNetworkSelector.BSSID_BLACKLIST_EXPIRE_TIME); 9216ed97affc9bbce6497b6155285ba4a71196d69e1xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 9226ed97affc9bbce6497b6155285ba4a71196d69e1xinhe false, scanDetails, false, false, true, false); 9236ed97affc9bbce6497b6155285ba4a71196d69e1xinhe 9246ed97affc9bbce6497b6155285ba4a71196d69e1xinhe verifySelectedResult(chosenScanResult, candidate); 9256ed97affc9bbce6497b6155285ba4a71196d69e1xinhe } 9266ed97affc9bbce6497b6155285ba4a71196d69e1xinhe /** 9276ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #16 do not choose the SSID has been disabled 928167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 929167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 930167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under disconnected state 931167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Two networks test1, test2 are secured network and found in scan results 932167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Both network are enabled 933167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test1 is @ 2GHz with RSSI -65 934167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test2 is @ 5Ghz with RSSI -50 935167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test2's SSID is disabled 936167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 9376ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * expected return test1 since test2's SSID has been disabled 938167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 939167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 940167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void networkChooseWithOneSsidDisabled() { 941167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 942167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 943167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 944167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 945167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-65, -50}; 946167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 947167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 948167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 949167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 950167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 951167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 952167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 95360969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 954167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 955167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 956167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 957ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mWifiConfigManager.tryEnableQualifiedNetwork(anyInt())).thenReturn(true); 958167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].getNetworkSelectionStatus().setNetworkSelectionStatus( 959167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED); 960167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 961167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, false, true, false); 962167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 963167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 964167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 965167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 966167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 9676ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #17 do not make QNS is link is bouncing now 968167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 969167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 970167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under disconnected state and currently is under link bouncing 971167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Two networks test1, test2 are secured network and found in scan results 972167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Both network are enabled 973167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test1 is @ 2GHz with RSSI -50 974167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * test2 is @ 5Ghz with RSSI -50 975167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 976167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected return null 977167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 978167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 979167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void noQNSWhenLinkBouncingDisconnected() { 980167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 981167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 982167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 983167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 984167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {WifiQualifiedNetworkSelector.MINIMUM_2G_ACCEPT_RSSI - 1, 985167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiQualifiedNetworkSelector.MINIMUM_5G_ACCEPT_RSSI - 1}; 986167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 987167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 988167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 989167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 990167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 991167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 992167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 99360969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 994167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 995167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 996167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 997167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, true, false, true, false); 998167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 999167250a118f9fb93f88a867cc7679414da4dc8b4xinhe assertEquals("choose the wrong network", null, candidate); 1000167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1001167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1002167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 10036ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #18 QNS with very short gap 1004167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1005167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1006167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under disconnected state 1007167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * If last QNS is made in less than MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, we 1008167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * still should make new QNS since it is disconnected now 1009167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1010167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expect return test1 because of band bonus 1011167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1012167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1013167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void networkSelectionInShortGap() { 1014167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1015167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1016167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1017167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1018167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-50, -65}; 1019167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1020167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1021167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1022167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1023167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1024167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1025167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 102660969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1027167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1028167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first QNS 1029167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1030167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1031167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //immediately second QNS 1032167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1033167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, false, true, false); 1034167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 1035167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1036167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1037167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1038167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1039167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //Unit test for Connected State 1040167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1041167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 10426ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #19 no QNS with very short gap when connected 1043167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1044167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and test2 is connected 1045167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * When WifiStateMachine is already in connected state, if last QNS is made in less than 1046167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, no new QNS should be made 1047167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1048167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expect return NULL 1049167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1050167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1051167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void noNetworkSelectionDueToShortGap() { 1052167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1053167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1054167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1055167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1056167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-50, -65}; 1057167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1058167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1059167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1060167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1061167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1062167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1063167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 106460969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1065167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1066167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first QNS 1067167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1068167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1069167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //immediately second QNS 1070167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1071167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1072167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 1073167250a118f9fb93f88a867cc7679414da4dc8b4xinhe assertEquals("choose the wrong BSSID", null, candidate); 1074167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1075167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1076167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 10776ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #20 force QNS with very short gap under connection 1078167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1079167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and test2 is connected 1080167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * When WifiStateMachine is already in connected state, if last QNS is made in less than 1081167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * MINIMUM_QUALIFIED_NETWORK_SELECTION_INTERVAL, no new QNS should be made. However, if we force 1082167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * to make new QNS, QNS still will be made 1083167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1084167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expect return test2 since it is the current connected one (bonus) 1085167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1086167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1087167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void forceNetworkSelectionInShortGap() { 1088167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1089167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1090167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1091167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1092167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-50, -65}; 1093167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1094167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1095167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1096167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1097167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1098167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1099167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 110060969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1101167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1102167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first QNS 1103167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1104167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 110570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.getNetworkId()).thenReturn(1); 110670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 110770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.is24GHz()).thenReturn(false); 110870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1109167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //immediately second QNS 1110167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(true, 1111167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1112167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 1113167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1114167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1115167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1116167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1117167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 11186ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #21 no QNS when connected and user do not allow switch when connected 1119167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1120167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1121167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and test2 is connected 1122167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if user does not allow switch network when connected, do not make new QNS when connected 1123167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1124167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expect return NULL 1125167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1126167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1127167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void noNewNetworkSelectionDuetoUserDisableSwitchWhenConnected() { 1128167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1129167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1130167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1131167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1132167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-50, -65}; 1133167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1134167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1135167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1136167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1137167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1138167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1139167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 114060969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1141167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1142167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1143167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1144167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1145167250a118f9fb93f88a867cc7679414da4dc8b4xinhe assertEquals("choose the wrong BSSID", null, candidate); 11460efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne assertEquals("Should receive zero filteredScanDetails", 0, 11470efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne mWifiQualifiedNetworkSelector.getFilteredScanDetails().size()); 1148167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1149167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1150167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 11516ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #22 no new QNS if current network is qualified already 1152167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1153167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1154167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and test2 is connected 1155167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * If current connected network is Qualified already, do not make new QNS 1156167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * simulated current connected network as: 1157167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 5GHz, RSSI = WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND, secured 1158167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1159167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected return null 1160167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1161167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1162167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void noNewQNSCurrentNetworkQualified() { 1163167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1164167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1165167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1166167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1167167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-65, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND}; 1168167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1169167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1170167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1171167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1172167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1173167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1174167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 117560969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1176167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1177167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1178167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first time, connect to test2 due to 5GHz bonus 1179167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1180167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1181167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1182167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1183167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 118473a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1185ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1186167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1187167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -50; // if there is QNS, test1 will be chosen 1188167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1189167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1190167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1191167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1192167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1193167250a118f9fb93f88a867cc7679414da4dc8b4xinhe assertEquals("choose the wrong BSSID", null, candidate); 1194167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1195167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1196167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 11976ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #23 No new QNS when link bouncing when connected 1198167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1199167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1200167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and test2 is connected 1201167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * no new QNS when link is bouncing 1202167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1203167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected return null 1204167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1205167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1206167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void noNewQNSLinkBouncing() { 1207167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1208167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1209167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 5180}; 1210167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1211167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-70, -75}; 1212167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1213c83c0526b1c209ca9d831154a13c4ef9131b17f8xinhe 1214167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1215167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1216167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1217167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1218167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 121960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1220167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1221167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1222167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first connect to test2 due to 5GHz bonus 1223167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1224167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1225167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1226167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1227167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 1228ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 122973a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1230167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1231167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1232167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, true, true, false, false); 1233167250a118f9fb93f88a867cc7679414da4dc8b4xinhe assertEquals("choose the wrong BSSID", null, candidate); 12347b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe } 12357b6cd1fce7850fc2aa0e510b170e6fd509308d21xinhe 1236167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 12376ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #24 Qualified network need to be on 5GHz 1238167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1239167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1240167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and connected to test2 1241167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if current connected network is not 5GHz, then it is not qualified. We should make new QNS 1242167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1243167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test1 1244167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1245167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1246167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkNotQualifiedDueToBandMismatch() { 1247167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1248167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1249167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1250167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1251167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-50, -65}; 1252167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1253167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1254167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1255167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1256167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1257167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1258167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 125960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1260167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1261167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(0); 1262167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[0]); 1263167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(true); 1264167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //connect to config2 first 1265167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1266167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1267167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1268ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 126973a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1270167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1271167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1272167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1273167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1274167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1275167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1276167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1277167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 12786ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #25 Qualified network need to be secured 1279167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1280167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1281167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connects to test2 1282167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if current connected network is open network, then it is not qualified. We should make new 1283167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * QNS 1284167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1285167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test1 since test1 has higher RSSI 1286167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1287167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1288167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkNotQualifiedDueToOpenNetwork() { 1289167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1290167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1291167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {5400, 5400}; 12923ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin String[] caps = {"[ESS]", "[ESS]"}; 1293167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-70, -65}; 1294167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_NONE, SECURITY_NONE}; 1295167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1296167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1297167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1298167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1299167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1300167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 130160969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1302167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1303167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1304167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first connect to test2 because of RSSI 1305167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1306167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1307167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1308167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1309167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 1310167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is5GHz()).thenReturn(true); 1311c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius when(mWifiConfigManager.isOpenNetwork(savedConfigs[1])).thenReturn(true); 1312ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 131373a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1314167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -60; 1315167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1316167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1317167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1318167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1319167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1320167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1321167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1322167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1323167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1324167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 13256ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #26 ephemeral network can not be qualified network 1326167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1327167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1328167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1329167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if current connected network is ephemeral network, then it is not qualified. We should make 1330167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * new QNS 1331167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1332167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test1 (since test2 is ephemeral) 1333167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1334167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1335167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkNotQualifiedDueToEphemeral() { 1336167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1337167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1338167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {5200, 5200}; 1339167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1340167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, -50}; 1341167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1342167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1343167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1344167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1345167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].ephemeral = true; 1346167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1347167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1348167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 134960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1350167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1351167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1352167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //first connect to test2 since test1's RSSI is negligible 1353167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1354167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1355167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1356167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1357167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 1358167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1359167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -70; 1360167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1361167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 136273a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1363ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1364167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1365167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1366167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1367167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1368167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1369167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1370167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1371167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 13726ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #27 low signal network can not be Qualified network (5GHz) 1373167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1374167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1375167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1376167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if current connected network's rssi is too low, then it is not qualified. We should 1377167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * make new QNS 1378167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1379167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test1 1380167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1381167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1382167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkNotQualifiedDueToLow5GRssi() { 1383167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1384167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1385167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {5200, 5200}; 1386167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1387167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-80, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND - 1}; 1388167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1389167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1390167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1391167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1392167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1393167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1394167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 139560969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1396167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1397167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1398167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1399167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1400167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1401167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1402167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getRssi()).thenReturn(levels[1]); 1403167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 1404167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is5GHz()).thenReturn(true); 1405167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 140673a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1407ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1408167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -60; 1409167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1410167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1411167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1412167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1413167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1414167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1415167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1416167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1417167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1418167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 14196ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #28 low signal network can not be Qualified network (2.4GHz) 1420167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1421167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1422167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1423167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * if current connected network's rssi is too low, then it is not qualified. We should 1424167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * make new QNS 1425167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1426167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test1 1427167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1428167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1429167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkNotQualifiedDueToLow2GRssi() { 1430167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1431167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1432167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1433167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1434167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, WifiQualifiedNetworkSelector.QUALIFIED_RSSI_24G_BAND - 1}; 1435167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1436167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1437167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1438167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1439167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1440167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 144160969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1442167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1443167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1444167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1445167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1446167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1447167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1448167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1449167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getRssi()).thenReturn(levels[1]); 1450167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(false); 1451167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is5GHz()).thenReturn(true); 1452167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 145373a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1454167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -60; 1455167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1456ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1457167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1458167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1459167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1460167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1461167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1462167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1463167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1464167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1465167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 14666ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #29 Choose current network due to current network bonus 1467167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1468167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1469167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1470167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * To connect to a network which is not linked to current connected network, unless this network 1471167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * is more than 10 db higher than current network, we should not switch. So although test2 has a 1472167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * lower signal, we still choose test2 1473167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1474167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test2 1475167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1476167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1477167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentNetworkStayDueToSameNetworkBonus() { 1478167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1479167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1480167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1481167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1482167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, -80}; 1483167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1484167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1485167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1486167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1487167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1488167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1489167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 149060969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1491167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1492167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1493167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1494167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1495167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1496167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1497167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(true); 1498167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 149973a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1500167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4 1501167250a118f9fb93f88a867cc7679414da4dc8b4xinhe + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 - 1; 1502167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1503ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1504167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1505167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1506167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 1507167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1508167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1509167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1510167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1511167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1512167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 15136ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #30 choose another network due to current network's signal is too low 1514167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1515167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1516167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1517167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * To connect to a network which is not linked to current connected network, if this network 1518167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * is more than 10 db higher than current network, we should switch 1519167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1520167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected new result: return test1 1521167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1522167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1523167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void switchNetworkStayDueToCurrentNetworkRssiLow() { 1524167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1525167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1526167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1527167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1528167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, -80}; 1529167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1530167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1531167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1532167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1533167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1534167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1535167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 153660969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1537167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1538167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1539167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1540167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1541167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1542167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1543167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(true); 1544167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 154573a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1546167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4 1547167250a118f9fb93f88a867cc7679414da4dc8b4xinhe + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 + 1; 1548167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1549ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1550167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1551167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1552167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1553167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1554167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1555167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1556167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1557167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1558167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 15596ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #31 Choose current BSSID due to current BSSID bonus 1560167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1561167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1562167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1563167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Linked network will be treated as same network. To connect to a network which is linked to 1564167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * current connected network, unless this network is more than 6 db higher than current network, 1565167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * we should not switch AP and stick to current BSSID 1566167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1567167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test2 1568167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1569167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1570167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void currentBssidStayDueToSameBSSIDBonus() { 1571167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1572167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1573167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1574167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1575167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, -80}; 1576167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1577167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1578167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1579167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1580167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //link two configuration 1581167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[0].linkedConfigurations = new HashMap<String, Integer>(); 1582167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].linkedConfigurations = new HashMap<String, Integer>(); 1583167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[0].linkedConfigurations.put(savedConfigs[1].configKey(), 1); 1584167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].linkedConfigurations.put(savedConfigs[0].configKey(), 1); 1585167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1586167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1587167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 158860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1589167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1590167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1591167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1592167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1593167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1594167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1595167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(true); 1596167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 159773a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1598167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_NETWORK_AWARD / 4 - 1; 1599167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1600ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1601167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1602167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1603167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 1604167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1605167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1606167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1607167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 1608167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1609167250a118f9fb93f88a867cc7679414da4dc8b4xinhe /** 16106ed97affc9bbce6497b6155285ba4a71196d69e1xinhe * Case #32 Choose another BSSID due to current BSSID's rssi is too low 1611167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1612167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * In this test. we simulate following scenario: 1613167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * WifiStateMachine is under connected state and current connected to test2 1614167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * Linked network will be treated as same network. To connect to a network which is linked to 1615167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * current connected network, unless this network is more than 6 db higher than current network, 1616167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * we should not switch AP and stick to current BSSID 1617167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * 1618167250a118f9fb93f88a867cc7679414da4dc8b4xinhe * expected result: return test2 1619167250a118f9fb93f88a867cc7679414da4dc8b4xinhe */ 1620167250a118f9fb93f88a867cc7679414da4dc8b4xinhe @Test 1621167250a118f9fb93f88a867cc7679414da4dc8b4xinhe public void swithBssidDueToLowRssi() { 1622167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] ssids = DEFAULT_SSIDS; 1623167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] bssids = DEFAULT_BSSIDS; 1624167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] frequencies = {2437, 2437}; 1625167250a118f9fb93f88a867cc7679414da4dc8b4xinhe String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS][ESS]"}; 1626167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] levels = {-100, -80}; 1627167250a118f9fb93f88a867cc7679414da4dc8b4xinhe int[] security = {SECURITY_PSK, SECURITY_PSK}; 1628167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1629167250a118f9fb93f88a867cc7679414da4dc8b4xinhe List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1630167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 1631167250a118f9fb93f88a867cc7679414da4dc8b4xinhe //link two configuration 1632167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[0].linkedConfigurations = new HashMap<String, Integer>(); 1633167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].linkedConfigurations = new HashMap<String, Integer>(); 1634167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[0].linkedConfigurations.put(savedConfigs[1].configKey(), 1); 1635167250a118f9fb93f88a867cc7679414da4dc8b4xinhe savedConfigs[1].linkedConfigurations.put(savedConfigs[0].configKey(), 1); 1636167250a118f9fb93f88a867cc7679414da4dc8b4xinhe prepareConfigStore(savedConfigs); 1637167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1638167250a118f9fb93f88a867cc7679414da4dc8b4xinhe final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 163960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 1640167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1641167250a118f9fb93f88a867cc7679414da4dc8b4xinhe mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 1642167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, true, false); 1643167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1644167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getNetworkId()).thenReturn(1); 1645167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 1646167250a118f9fb93f88a867cc7679414da4dc8b4xinhe when(mWifiInfo.is24GHz()).thenReturn(true); 1647167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 164873a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 1649167250a118f9fb93f88a867cc7679414da4dc8b4xinhe levels[0] = -80 + WifiQualifiedNetworkSelector.SAME_BSSID_AWARD / 4 + 1; 1650167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1651ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 1652167250a118f9fb93f88a867cc7679414da4dc8b4xinhe scanResultLinkConfiguration(savedConfigs, scanDetails); 1653167250a118f9fb93f88a867cc7679414da4dc8b4xinhe 1654167250a118f9fb93f88a867cc7679414da4dc8b4xinhe ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 1655167250a118f9fb93f88a867cc7679414da4dc8b4xinhe WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 1656167250a118f9fb93f88a867cc7679414da4dc8b4xinhe false, scanDetails, false, true, false, false); 1657167250a118f9fb93f88a867cc7679414da4dc8b4xinhe verifySelectedResult(chosenScanResult, candidate); 1658167250a118f9fb93f88a867cc7679414da4dc8b4xinhe } 16593ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 16603ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin /** 16613ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * Case #33 Choose an ephemeral network with a good score because no saved networks 16623ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * are available. 16633ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * 16643ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * In this test. we simulate following scenario: 16653ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * WifiStateMachine is not connected to any network. 16663ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 16673ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * test1 is an enterprise network w/o a score. 16683ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * test2 is an open network with a good score. Additionally it's a metered network. 16693ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * isUntrustedConnectionsAllowed is set to true. 16703ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * 16713ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin * expected result: return test2 with meteredHint set to True. 16723ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin */ 16733ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin @Test 16743ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin public void selectQualifiedNetworkChoosesEphemeral() { 16753ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin String[] ssids = DEFAULT_SSIDS; 16763ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin String[] bssids = DEFAULT_BSSIDS; 16773ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin int[] frequencies = {5200, 5200}; 16783ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 16793ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin int[] levels = {-70, -70}; 16803ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin Integer[] scores = {null, 120}; 16813ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin boolean[] meteredHints = {false, true}; 16823ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 16833ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 16843ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin configureScoreCache(scanDetails, scores, meteredHints); 16853ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 16863ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin // No saved networks. 16871e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 16881e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 16893ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 16903ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 16913ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin // Setup the config as an invalid candidate. This is done to workaround a Mockito issue. 16923ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin // Basically Mockito is unable to mock package-private methods in classes loaded from a 16933ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin // different Jar (like all of the framework code) which results in the actual saveNetwork() 16943ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin // method being invoked in this case. Because the config is invalid it quickly returns. 16953ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin unTrustedNetworkCandidate.SSID = null; 16963ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin unTrustedNetworkCandidate.networkId = WifiConfiguration.INVALID_NETWORK_ID; 16973ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin ScanResult untrustedScanResult = scanDetails.get(1).getScanResult(); 16983ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(mWifiConfigManager 16993ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin .wifiConfigurationFromScanResult(untrustedScanResult)) 17003ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin .thenReturn(unTrustedNetworkCandidate); 17013ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 17023ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin WifiConfiguration.NetworkSelectionStatus selectionStatus = 17033ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin mock(WifiConfiguration.NetworkSelectionStatus.class); 17043ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin when(unTrustedNetworkCandidate.getNetworkSelectionStatus()).thenReturn(selectionStatus); 1705ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(selectionStatus.getCandidate()).thenReturn(untrustedScanResult); 17063ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin 17073ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 17083ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin false /* forceSelectNetwork */, 17093ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin true /* isUntrustedConnectionsAllowed */, 17103ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin scanDetails, 17113ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin false, /* isLinkDebouncing */ 17123ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin false, /* isConnected */ 17133ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin true, /* isDisconnected */ 17143ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin false /* isSupplicantTransient */); 17153ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin verify(selectionStatus).setCandidate(untrustedScanResult); 1716ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(unTrustedNetworkCandidate, candidate); 17173ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin assertEquals(meteredHints[1], candidate.meteredHint); 17183ab8ec5cfa986b07e1c948af0f45bd333edef24cJeremy Joslin } 17190efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17200efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne /** 17210efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * Case #34 Test Filtering of potential candidate scanDetails (Untrusted allowed) 17220efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * 17230efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * In this test. we simulate following scenario 17240efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * WifiStateMachine is under disconnected state 17250efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test1 is @ 2GHz with RSSI -60 17260efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test2 is @ 5Ghz with RSSI -86, (below minimum threshold) 17270efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test3 is @ 5Ghz with RSSI -50, however it has no associated saved config 17280efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test4 is @ 2Ghz with RSSI -62, no associated config, but is Ephemeral 17290efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * 17300efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not 17310efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * compensate). 17320efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test1 & test4's scanDetails are returned by 'getFilteredScanDetail()' 17330efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne */ 17340efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne @Test 17350efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne public void testGetFilteredScanDetailsReturnsOnlyConsideredScanDetails_untrustedAllowed() { 17360efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""}; 17370efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55", 17380efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne "c0:ff:ee:ee:e3:ee"}; 17390efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] frequencies = {2437, 5180, 5180, 2437}; 17400efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", 17410efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne "[WPA2-EAP-CCMP][ESS]"}; 17420efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] levels = {-60, -86, -50, -62}; 17430efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 17440efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne boolean[] meteredHints = {false, false, false, true}; 17450efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne Integer[] scores = {null, null, null, 120}; 17460efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17470efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Create all 4 scanDetails 17480efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 17490efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17500efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Setup NetworkScoreCache for detecting ephemeral networks ("test4") 17510efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne configureScoreCache(scanDetails, scores, meteredHints); 17520efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 17530efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne unTrustedNetworkCandidate.SSID = null; 17540efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne unTrustedNetworkCandidate.networkId = WifiConfiguration.INVALID_NETWORK_ID; 17550efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne ScanResult untrustedScanResult = scanDetails.get(3).getScanResult(); 17560efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mWifiConfigManager 17570efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne .wifiConfigurationFromScanResult(untrustedScanResult)) 17580efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne .thenReturn(unTrustedNetworkCandidate); 17590efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration.NetworkSelectionStatus selectionStatus = 17600efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne mock(WifiConfiguration.NetworkSelectionStatus.class); 17610efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(unTrustedNetworkCandidate.getNetworkSelectionStatus()).thenReturn(selectionStatus); 17620efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17630efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Set up associated configs for test1 & test2 17640efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration[] savedConfigs = generateWifiConfigurations( 17650efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne Arrays.copyOfRange(ssids, 0, 2), Arrays.copyOfRange(security, 0, 2)); 17660efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne prepareConfigStore(savedConfigs); 17670efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne List<ScanDetail> savedScanDetails = new ArrayList<ScanDetail>(scanDetails.subList(0, 2)); 17680efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 176960969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 17700efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanResultLinkConfiguration(savedConfigs, savedScanDetails); 17710efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17720efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Force mock ConfigManager to return null (and not an empty list) for "test3" & "test4" 17731e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetails.get(2)), 17741e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 17751e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetails.get(3)), 17761e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 17770efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17780efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 17790efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17800efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 17810efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false /* forceSelectNetwork */, 17820efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne true /* isUntrustedConnectionsAllowed */, 17830efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanDetails, 17840efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false, /* isLinkDebouncing */ 17850efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false, /* isConnected */ 17860efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne true, /* isDisconnected */ 17870efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false /* isSupplicantTransient */); 17880efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17890efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne verifySelectedResult(chosenScanResult, candidate); 17900efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Verify two scanDetails returned in the filteredScanDetails 17910efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne assertEquals(2, mWifiQualifiedNetworkSelector.getFilteredScanDetails().size()); 179209abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(0).first.toString(), 17930efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanDetails.get(0).toString()); 179409abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(1).first.toString(), 17950efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanDetails.get(3).toString()); 17960efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne } 17970efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17980efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 17990efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne /** 18000efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * Case #35 Test Filtering of potential candidate scanDetails (Untrusted disallowed) 18010efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * 18020efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * In this test. we simulate following scenario 18030efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * WifiStateMachine is under disconnected state 18040efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test1 is @ 2GHz with RSSI -60 18050efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test2 is @ 5Ghz with RSSI -86, (below minimum threshold) 18060efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test3 is @ 5Ghz with RSSI -50, however it has no associated saved config 18070efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test4 is @ 2Ghz with RSSI -62, no associated config, but is Ephemeral 18080efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * 18090efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * Expected behavior: test1 is chosen due to 5GHz signal is too weak (5GHz bonus can not 18100efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * compensate). 18110efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne * test1 & test4's scanDetails are returned by 'getFilteredScanDetail()' 18120efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne */ 18130efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne @Test 18140efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne public void testGetFilteredScanDetailsReturnsOnlyConsideredScanDetails_untrustedDisallowed() { 18150efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] ssids = {"\"test1\"", "\"test2\"", "\"test3\"", "\"test4\""}; 18160efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "de:ad:ba:b1:e5:55", 18170efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne "c0:ff:ee:ee:e3:ee"}; 18180efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] frequencies = {2437, 5180, 5180, 2437}; 18190efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]", 18200efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne "[WPA2-EAP-CCMP][ESS]"}; 18210efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] levels = {-60, -86, -50, -62}; 18220efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne int[] security = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 18230efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne boolean[] meteredHints = {false, false, false, true}; 18240efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne Integer[] scores = {null, null, null, 120}; 18250efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18260efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Create all 4 scanDetails 18270efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 18280efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18290efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Setup NetworkScoreCache for detecting ephemeral networks ("test4") 18300efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne configureScoreCache(scanDetails, scores, meteredHints); 18310efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 18320efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne unTrustedNetworkCandidate.SSID = null; 18330efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne unTrustedNetworkCandidate.networkId = WifiConfiguration.INVALID_NETWORK_ID; 18340efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne ScanResult untrustedScanResult = scanDetails.get(3).getScanResult(); 18350efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(mWifiConfigManager 18360efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne .wifiConfigurationFromScanResult(untrustedScanResult)) 18370efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne .thenReturn(unTrustedNetworkCandidate); 18380efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration.NetworkSelectionStatus selectionStatus = 18390efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne mock(WifiConfiguration.NetworkSelectionStatus.class); 18400efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne when(unTrustedNetworkCandidate.getNetworkSelectionStatus()).thenReturn(selectionStatus); 18410efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18420efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Set up associated configs for test1 & test2 18430efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration[] savedConfigs = generateWifiConfigurations( 18440efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne Arrays.copyOfRange(ssids, 0, 2), Arrays.copyOfRange(security, 0, 2)); 18450efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne prepareConfigStore(savedConfigs); 18460efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne List<ScanDetail> savedScanDetails = new ArrayList<ScanDetail>(scanDetails.subList(0, 2)); 18470efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 184860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 18490efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanResultLinkConfiguration(savedConfigs, savedScanDetails); 18500efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18510efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Force mock ConfigManager to return null (and not an empty list) for "test3" & "test4" 18521e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetails.get(2)), 18531e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 18541e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(eq(scanDetails.get(3)), 18551e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 18560efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18570efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 18580efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18590efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 18600efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false /* forceSelectNetwork */, 18610efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false /* isUntrustedConnectionsAllowed */, 18620efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanDetails, 18630efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false, /* isLinkDebouncing */ 18640efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false, /* isConnected */ 18650efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne true, /* isDisconnected */ 18660efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne false /* isSupplicantTransient */); 18670efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne 18680efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne verifySelectedResult(chosenScanResult, candidate); 18690efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne //Verify two scanDetails returned in the filteredScanDetails 18700efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne assertEquals(1, mWifiQualifiedNetworkSelector.getFilteredScanDetails().size()); 187109abbe29be6e552a2531b0367bd6d29647d33767Glen Kuhne assertEquals(mWifiQualifiedNetworkSelector.getFilteredScanDetails().get(0).first.toString(), 18720efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne scanDetails.get(0).toString()); 18730efd09fea566f4445807b6aff60b18e127e72d38Glen Kuhne } 1874a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1875a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius /** 1876a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * Case #36 Ignore an ephemeral network if it was previously deleted. 1877a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * 1878a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * In this test. we simulate following scenario: 1879a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * WifiStateMachine is not connected to any network. 1880a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 1881a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * test1 is an open network with a low score. Additionally it's a metered network. 1882a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * test2 is an open network with a good score but was previously deleted. 1883a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * isUntrustedConnectionsAllowed is set to true. 1884a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * 1885a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius * expected result: return test1 with meteredHint set to True. 1886a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius */ 1887a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius @Test 1888a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius public void selectQualifiedNetworkDoesNotChooseDeletedEphemeral() { 1889a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius String[] ssids = DEFAULT_SSIDS; 1890a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius String[] bssids = DEFAULT_BSSIDS; 1891a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius int[] frequencies = {5200, 5200}; 1892a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 1893a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius int[] levels = {-70, -70}; 1894a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius Integer[] scores = {20, 120}; 1895a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius boolean[] meteredHints = {true, false}; 1896a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1897a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1898a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius configureScoreCache(scanDetails, scores, meteredHints); 1899a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1900a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // No saved networks. 19011e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 19021e5f0667515826cdc9c85a63a82c4c48cad446c2Ningyuan Wang anyBoolean())).thenReturn(null); 1903a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1904a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 1905a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // Setup the config as an invalid candidate. This is done to workaround a Mockito issue. 1906a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // Basically Mockito is unable to mock package-private methods in classes loaded from a 1907a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // different Jar (like all of the framework code) which results in the actual saveNetwork() 1908a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // method being invoked in this case. Because the config is invalid it quickly returns. 1909a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius unTrustedNetworkCandidate.SSID = null; 1910a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius unTrustedNetworkCandidate.networkId = WifiConfiguration.INVALID_NETWORK_ID; 1911a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius ScanResult untrustedScanResult = scanDetails.get(0).getScanResult(); 1912a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius when(mWifiConfigManager 1913a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius .wifiConfigurationFromScanResult(untrustedScanResult)) 1914a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius .thenReturn(unTrustedNetworkCandidate); 1915a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1916a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius // The second scan result is for an ephemeral network which was previously deleted 1917a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius when(mWifiConfigManager 191870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan .wasEphemeralNetworkDeleted(ScanDetailUtil.createQuotedSSID( 191970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan scanDetails.get(0).getScanResult().SSID))) 1920a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius .thenReturn(false); 1921a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius when(mWifiConfigManager 192270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan .wasEphemeralNetworkDeleted(ScanDetailUtil.createQuotedSSID( 192370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan scanDetails.get(1).getScanResult().SSID))) 1924a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius .thenReturn(true); 1925a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1926a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius WifiConfiguration.NetworkSelectionStatus selectionStatus = 1927a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius mock(WifiConfiguration.NetworkSelectionStatus.class); 1928a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius when(unTrustedNetworkCandidate.getNetworkSelectionStatus()).thenReturn(selectionStatus); 1929ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(selectionStatus.getCandidate()).thenReturn(untrustedScanResult); 1930a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius 1931a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 1932a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius false /* forceSelectNetwork */, 1933a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius true /* isUntrustedConnectionsAllowed */, 1934a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius scanDetails, 1935a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius false, /* isLinkDebouncing */ 1936a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius false, /* isConnected */ 1937a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius true, /* isDisconnected */ 1938a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius false /* isSupplicantTransient */); 1939a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius verify(selectionStatus).setCandidate(untrustedScanResult); 1940a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius assertSame(candidate, unTrustedNetworkCandidate); 1941a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius assertEquals(meteredHints[0], candidate.meteredHint); 1942a6b66a48b231f5729b8015d3446feb4c2fa0a9d1Roshan Pius } 1943ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1944ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 1945ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #37 Choose the saved config that doesn't qualify for external scoring. 1946ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 1947ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 1948ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * WifiStateMachine is not connected to any network. 1949ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 1950ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test1 is a saved network. 1951ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test2 is a saved network with useExternalScores set to true and a very high score. 1952ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 1953ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: return test1 because saved networks that don't request external scoring 1954ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * have a higher priority. 1955ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 1956ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 1957ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void selectQualifiedNetworkPrefersSavedWithoutExternalScores() { 1958ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] ssids = DEFAULT_SSIDS; 1959ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] bssids = DEFAULT_BSSIDS; 1960ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] frequencies = {5200, 5200}; 1961ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 1962ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] security = {SECURITY_PSK, SECURITY_PSK}; 1963ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] levels = {-70, -70}; 1964ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Integer[] scores = {null, 120}; 1965ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin boolean[] meteredHints = {false, true}; 1966ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1967ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 1968ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin configureScoreCache(scanDetails, scores, meteredHints); 1969ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1970ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration[] savedConfigs = generateWifiConfigurations(DEFAULT_SSIDS, security); 1971ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin savedConfigs[1].useExternalScores = true; // test2 is set to use external scores. 1972ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin prepareConfigStore(savedConfigs); 1973ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(savedConfigs)); 1974ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanResultLinkConfiguration(savedConfigs, scanDetails); 1975ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1976ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 1977ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* forceSelectNetwork */, 1978ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isUntrustedConnectionsAllowed */, 1979ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanDetails, 1980ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isLinkDebouncing */ 1981ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isConnected */ 1982ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true, /* isDisconnected */ 1983ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isSupplicantTransient */); 1984ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin verifySelectedResult(scanDetails.get(0).getScanResult(), candidate); 1985ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(candidate, savedConfigs[0]); 1986ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 1987ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 1988ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 1989ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #38 Choose the saved config that does qualify for external scoring when other saved 1990ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * networks are not available. 1991ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 1992ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 1993ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * WifiStateMachine is not connected to any network. 1994ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 1995ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test1 is a saved network with useExternalScores set to true and a very high score. 1996ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test2 is a saved network but not in range (not included in the scan results). 1997ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 1998ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: return test1 because there are no better saved networks within range. 1999ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2000ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2001ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void selectQualifiedNetworkSelectsSavedWithExternalScores() { 2002ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] ssids = {"\"test1\""}; 2003ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 2004ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] frequencies = {5200}; 2005ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]"}; 2006ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] security = {SECURITY_PSK, SECURITY_PSK}; 2007ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] levels = {-70}; 2008ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Integer[] scores = {120}; 2009ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin boolean[] meteredHints = {false}; 2010ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2011ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // Scan details only contains 1 ssid, test1. 2012ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2013ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin configureScoreCache(scanDetails, scores, meteredHints); 2014ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2015ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // The saved config contains 2 ssids, test1 & test2. 2016ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration[] savedConfigs = generateWifiConfigurations(DEFAULT_SSIDS, security); 2017ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin savedConfigs[0].useExternalScores = true; // test1 is set to use external scores. 2018ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin prepareConfigStore(savedConfigs); 2019ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(savedConfigs)); 2020ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanResultLinkConfiguration(savedConfigs, scanDetails); 2021ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2022ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 2023ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* forceSelectNetwork */, 2024ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isUntrustedConnectionsAllowed */, 2025ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanDetails, 2026ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isLinkDebouncing */ 2027ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isConnected */ 2028ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true, /* isDisconnected */ 2029ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isSupplicantTransient */); 2030ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin verifySelectedResult(scanDetails.get(0).getScanResult(), candidate); 2031ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(candidate, savedConfigs[0]); 2032ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2033ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2034ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2035ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #39 Choose the saved config that does qualify for external scoring over the 2036ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * untrusted network with the same score. 2037ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2038ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2039ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * WifiStateMachine is not connected to any network. 2040ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 2041ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test1 is a saved network with useExternalScores set to true and the same score as test1. 2042ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test2 is NOT saved network but in range with a good external score. 2043ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2044ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: return test1 because the tie goes to the saved network. 2045ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2046ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2047ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void selectQualifiedNetworkPrefersSavedWithExternalScoresOverUntrusted() { 2048ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] ssids = DEFAULT_SSIDS; 2049ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] bssids = DEFAULT_BSSIDS; 2050ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] frequencies = {5200, 5200}; 2051ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 2052ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] security = {SECURITY_PSK, SECURITY_PSK}; 2053ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] levels = {-70, -70}; 2054ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Integer[] scores = {120, 120}; 2055ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin boolean[] meteredHints = {false, true}; 2056ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2057ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // Both networks are in the scan results. 2058ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2059ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin configureScoreCache(scanDetails, scores, meteredHints); 2060ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2061ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // Set up the associated configs only for test1 2062ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration[] savedConfigs = generateWifiConfigurations( 2063ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Arrays.copyOfRange(ssids, 0, 1), Arrays.copyOfRange(security, 0, 1)); 2064ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin savedConfigs[0].useExternalScores = true; // test1 is set to use external scores. 2065ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin prepareConfigStore(savedConfigs); 2066ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(savedConfigs)); 2067ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanResultLinkConfiguration(savedConfigs, scanDetails); 2068ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 2069ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager 2070ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .wifiConfigurationFromScanResult(scanDetails.get(1).getScanResult())) 2071ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .thenReturn(unTrustedNetworkCandidate); 2072ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2073ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 2074ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* forceSelectNetwork */, 2075ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true /* isUntrustedConnectionsAllowed */, 2076ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanDetails, 2077ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isLinkDebouncing */ 2078ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isConnected */ 2079ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true, /* isDisconnected */ 2080ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isSupplicantTransient */); 2081ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin verifySelectedResult(scanDetails.get(0).getScanResult(), candidate); 2082ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(candidate, savedConfigs[0]); 2083ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2084ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2085ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2086ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #40 Choose the ephemeral config over the saved config that does qualify for external 2087ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * scoring because the untrusted network has a higher score. 2088ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2089ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2090ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * WifiStateMachine is not connected to any network. 2091ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * selectQualifiedNetwork() is called with 2 scan results, test1 and test2. 2092ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test1 is a saved network with useExternalScores set to true and a low score. 2093ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * test2 is NOT saved network but in range with a good external score. 2094ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2095ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: return test2 because it has a better score. 2096ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2097ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2098ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void selectQualifiedNetworkPrefersUntrustedOverScoredSaved() { 2099ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] ssids = DEFAULT_SSIDS; 2100ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] bssids = DEFAULT_BSSIDS; 2101ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] frequencies = {5200, 5200}; 2102ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"}; 2103ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] security = {SECURITY_PSK, SECURITY_PSK}; 2104ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int[] levels = {-70, -70}; 2105ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Integer[] scores = {10, 120}; 2106ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin boolean[] meteredHints = {false, true}; 2107ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2108ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // Both networks are in the scan results. 2109ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2110ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin configureScoreCache(scanDetails, scores, meteredHints); 2111ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2112ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin // Set up the associated configs only for test1 2113ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration[] savedConfigs = generateWifiConfigurations( 2114ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin Arrays.copyOfRange(ssids, 0, 1), Arrays.copyOfRange(security, 0, 1)); 2115ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin savedConfigs[0].useExternalScores = true; // test1 is set to use external scores. 2116ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin prepareConfigStore(savedConfigs); 2117ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager.getSavedNetworks()).thenReturn(Arrays.asList(savedConfigs)); 2118ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanResultLinkConfiguration(savedConfigs, scanDetails); 2119ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration unTrustedNetworkCandidate = mock(WifiConfiguration.class); 2120ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin unTrustedNetworkCandidate.SSID = null; 2121ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin unTrustedNetworkCandidate.networkId = WifiConfiguration.INVALID_NETWORK_ID; 2122ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult untrustedScanResult = scanDetails.get(1).getScanResult(); 2123ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(mWifiConfigManager 2124ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .wifiConfigurationFromScanResult(untrustedScanResult)) 2125ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .thenReturn(unTrustedNetworkCandidate); 2126ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration.NetworkSelectionStatus selectionStatus = 2127ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin mock(WifiConfiguration.NetworkSelectionStatus.class); 2128ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(unTrustedNetworkCandidate.getNetworkSelectionStatus()).thenReturn(selectionStatus); 2129ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin when(selectionStatus.getCandidate()).thenReturn(untrustedScanResult); 2130ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2131ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork( 2132ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* forceSelectNetwork */, 2133ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true /* isUntrustedConnectionsAllowed */, 2134ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin scanDetails, 2135ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isLinkDebouncing */ 2136ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false, /* isConnected */ 2137ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin true, /* isDisconnected */ 2138ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin false /* isSupplicantTransient */); 2139ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin verify(selectionStatus).setCandidate(untrustedScanResult); 2140ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(unTrustedNetworkCandidate, candidate); 2141ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2142ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2143ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2144ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #41 Ensure the ExternalScoreEvaluator correctly selects the untrusted network. 2145ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2146ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2147ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network. 2148ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The untrusted network has the higher score. 2149ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2150ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: The untrusted network is determined to be the best network. 2151ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2152ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2153ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void externalScoreEvaluator_untrustedIsBest() { 2154ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator = 2155ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true); 2156ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult untrustedScanResult = new ScanResult(); 2157ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int untrustedScore = 100; 2158ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult); 2159ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2160ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult savedScanResult = new ScanResult(); 2161ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int savedScore = 50; 2162ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration savedConfig = new WifiConfiguration(); 2163ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult); 2164ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2165ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.UNTRUSTED_NETWORK, evaluator.getBestCandidateType()); 2166ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(untrustedScore, evaluator.getHighScore()); 2167ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(untrustedScanResult, evaluator.getScanResultCandidate()); 2168ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2169ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2170ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2171ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #42 Ensure the ExternalScoreEvaluator correctly selects the saved network. 2172ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2173ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2174ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network. 2175ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The saved network has the higher score. 2176ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2177ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: The saved network is determined to be the best network. 2178ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2179ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2180ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void externalScoreEvaluator_savedIsBest() { 2181ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator = 2182ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true); 2183ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult untrustedScanResult = new ScanResult(); 2184ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int untrustedScore = 50; 2185ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult); 2186ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2187ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult savedScanResult = new ScanResult(); 2188ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int savedScore = 100; 2189ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration savedConfig = new WifiConfiguration(); 2190ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult); 2191ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2192ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType()); 2193ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(savedScore, evaluator.getHighScore()); 2194ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(savedScanResult, evaluator.getScanResultCandidate()); 2195ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2196ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2197ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2198ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #43 Ensure the ExternalScoreEvaluator correctly selects the saved network if a 2199ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * tie occurs. 2200ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2201ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2202ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The ExternalScoreEvaluator is asked to evaluate 1 untrusted network and 1 saved network. 2203ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Both networks have the same score. 2204ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2205ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: The saved network is determined to be the best network. 2206ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2207ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2208ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void externalScoreEvaluator_tieScores() { 2209ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator = 2210ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true); 2211ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult untrustedScanResult = new ScanResult(); 2212ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int untrustedScore = 100; 2213ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult); 2214ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2215ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult savedScanResult = new ScanResult(); 2216ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int savedScore = 100; 2217ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration savedConfig = new WifiConfiguration(); 2218ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult); 2219ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2220ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType()); 2221ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(savedScore, evaluator.getHighScore()); 2222ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(savedScanResult, evaluator.getScanResultCandidate()); 2223ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2224ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2225ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2226ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #44 Ensure the ExternalScoreEvaluator correctly selects the saved network out of 2227ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * multiple options. 2228ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2229ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test. we simulate following scenario: 2230ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The ExternalScoreEvaluator is asked to evaluate 2 untrusted networks and 2 saved networks. 2231ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The high scores are equal and the low scores differ. 2232ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2233ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: The saved network is determined to be the best network. 2234ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2235ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2236ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void externalScoreEvaluator_multipleScores() { 2237ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator = 2238ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true); 2239ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult untrustedScanResult = new ScanResult(); 2240ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int untrustedScore = 100; 2241ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(untrustedScore, untrustedScanResult); 2242ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(80, new ScanResult()); 2243ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2244ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin ScanResult savedScanResult = new ScanResult(); 2245ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin int savedScore = 100; 2246ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiConfiguration savedConfig = new WifiConfiguration(); 2247ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(savedScore, savedConfig, savedScanResult); 2248ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(90, new WifiConfiguration(), new ScanResult()); 2249ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2250ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.SAVED_NETWORK, evaluator.getBestCandidateType()); 2251ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(savedScore, evaluator.getHighScore()); 2252ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertSame(savedScanResult, evaluator.getScanResultCandidate()); 2253ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2254ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin 2255ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin /** 2256ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * Case #45 Ensure the ExternalScoreEvaluator correctly handles NULL score inputs. 2257ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2258ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * In this test we simulate following scenario: 2259ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * The ExternalScoreEvaluator is asked to evaluate both types of candidates with NULL scores. 2260ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * 2261ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin * expected result: No crashes. The best candidate type is returned as NONE. 2262ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin */ 2263ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin @Test 2264ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin public void externalScoreEvaluator_nullScores() { 2265ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin WifiQualifiedNetworkSelector.ExternalScoreEvaluator evaluator = 2266ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin new WifiQualifiedNetworkSelector.ExternalScoreEvaluator(mLocalLog, true); 2267ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalUntrustedCandidate(null, new ScanResult()); 2268ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2269ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.NONE, evaluator.getBestCandidateType()); 2270ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin evaluator.evalSavedCandidate(null, new WifiConfiguration(), new ScanResult()); 2271ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin assertEquals(WifiQualifiedNetworkSelector.ExternalScoreEvaluator 2272ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin .BestCandidateType.NONE, evaluator.getBestCandidateType()); 2273ea2048738be95ae9d5367a42ba798503a7039a6bJeremy Joslin } 2274828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2275828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan /** 2276828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * Case #46 Choose 2.4GHz BSSID with stronger RSSI value over 2277828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * 5GHz BSSID with weaker RSSI value 2278828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * 2279828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * In this test. we simulate following scenario: 2280828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * Two APs are found in scan results 2281828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * BSSID1 is @ 5GHz with RSSI -82 2282828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * BSSID2 is @ 2Ghz with RSSI -72 2283828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * These two BSSIDs get exactly the same QNS score 2284828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * 2285828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan * expect BSSID2 to be chosen as it has stronger RSSI value 2286828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan */ 2287828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan @Test 2288828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan public void chooseStrongerRssiOver5GHz() { 2289828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan String[] ssids = {"\"test1\"", "\"test1\""}; 2290828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2291828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan int[] frequencies = {5220, 2437}; 2292828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan String[] caps = {"[ESS]", "[ESS]"}; 2293828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan int[] levels = {-82, -72}; 2294828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan int[] security = {SECURITY_NONE, SECURITY_NONE}; 2295828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2296828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2297828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 2298828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan prepareConfigStore(savedConfigs); 2299828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2300828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 2301828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 2302828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan scanResultLinkConfiguration(savedConfigs, scanDetails); 2303828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2304828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 2305828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2306828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 2307828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan false, scanDetails, false, false, true, false); 2308828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan 2309828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan verifySelectedResult(chosenScanResult, candidate); 2310828b94eca5e0ffa67448f67a9dfb4d7eb492312aRandy Pan } 2311fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2312fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan /** 2313fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * Case #47 Choose the currently connected BSSID after a firmware initiated roaming. 2314fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * 2315fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * In this test. we simulate following scenario: 2316fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * Two APs are found in scan results 2317fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * BSSID1 is @ 2.4GHz with RSSI -78 2318fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * BSSID2 is @ 2.4Ghz with RSSI -77 2319fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * BSSID2 is chosen because of stronger RSSI. Then firmware initiates 2320fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * a roaming to BSSID1. QNS now selects BSSID1 because of the bonus for currently 2321fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * connected network even if BSSID 2 has slightly stronger signal strengh. 2322fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * 2323fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan * expect BSSID2 to be chosen after firmware roaming 2324fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan */ 2325fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan @Test 2326fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan public void chooseCurrentlyConnectedBssid() { 2327fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan String[] ssids = {"\"test1\"", "\"test1\""}; 2328fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2329fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan int[] frequencies = {2437, 2437}; 2330fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan String[] caps = {"[ESS]", "[ESS]"}; 2331fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan int[] levels = {-78, -77}; 2332fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan int[] security = {SECURITY_NONE, SECURITY_NONE}; 2333fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2334fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2335fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 2336fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan prepareConfigStore(savedConfigs); 2337fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2338fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 2339fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 2340fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan scanResultLinkConfiguration(savedConfigs, scanDetails); 2341fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2342fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan // Choose BSSID2 as it has stronger RSSI 2343fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 2344fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 2345fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan false, scanDetails, false, false, true, false); 2346fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan verifySelectedResult(chosenScanResult, candidate); 2347fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan when(mWifiInfo.getBSSID()).thenReturn(bssids[1]); 2348fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 2349fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2350fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan // Choose BSSID2 as it has stronger RSSI and it is the currently connected BSSID 2351fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan chosenScanResult = scanDetails.get(1).getScanResult(); 2352fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(true, 2353fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan false, scanDetails, false, true, false, false); 2354fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan verifySelectedResult(chosenScanResult, candidate); 2355fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2356fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan // Pretend firmware roamed the device to BSSID1 2357fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan when(mWifiInfo.getBSSID()).thenReturn(bssids[0]); 2358fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan 2359fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan // Choose BSSID1 as it is the currently connected BSSID even if BSSID2 has slightly 2360fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan // higher RSSI value. 2361fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan chosenScanResult = scanDetails.get(0).getScanResult(); 2362fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(true, 2363fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan false, scanDetails, false, true, false, false); 2364fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan verifySelectedResult(chosenScanResult, candidate); 2365fbc0f388aacac432f5abfadfd25e212d5e4b159bRandy Pan } 236670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 236770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan /** 236870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * Case #48 no new QNS if current network doesn't show up in the 236970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * scan results. 237070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * 237170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * In this test. we simulate following scenario: 237270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * WifiStateMachine is under connected state and 2.4GHz test1 is connected. 237370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * The second scan results contains test2 which is 5GHz but no test1. Skip 237470570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * QNS to avoid aggressive network switching. 237570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * 237670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan * expected return null 237770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan */ 237870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan @Test 237970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan public void noNewQNSCurrentNetworkNotInScanResults() { 238070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //Prepare saved network configurations. 238170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan String[] ssidsConfig = DEFAULT_SSIDS; 238270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan int[] security = {SECURITY_PSK, SECURITY_PSK}; 238370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssidsConfig, security); 238470570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan prepareConfigStore(savedConfigs); 238570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan final List<WifiConfiguration> savedNetwork = Arrays.asList(savedConfigs); 238670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiConfigManager.getSavedNetworks()).thenReturn(savedNetwork); 238770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 238870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //Prepare the first scan results. 238970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan String[] ssids = {DEFAULT_SSIDS[0]}; 239070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan String[] bssids = {DEFAULT_BSSIDS[0]}; 239170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan int[] frequencies = {2437}; 239270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan String[] caps = {"[WPA2-EAP-CCMP][ESS]"}; 239370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan int[] levels = {-78}; 239470570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 239570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan scanResultLinkConfiguration(savedConfigs, scanDetails); 239670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 239770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //Connect to test1. 239870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, false, scanDetails, false, 239970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan false, true, false); 240070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 240170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.getNetworkId()).thenReturn(1); 240270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.getBSSID()).thenReturn(bssids[0]); 240370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiInfo.is24GHz()).thenReturn(true); 2404e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mWifiQualifiedNetworkSelector.setWifiNetworkScoreCache(null); 240570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mWifiConfigManager.getEnableAutoJoinWhenAssociated()).thenReturn(true); 240670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan when(mClock.elapsedRealtime()).thenReturn(SystemClock.elapsedRealtime() + 11 * 1000); 240770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 240870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //Prepare the second scan results which doesn't contain test1. 240970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan ssids[0] = DEFAULT_SSIDS[1]; 241070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan bssids[0] = DEFAULT_BSSIDS[1]; 241170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan frequencies[0] = 5180; 241270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan caps[0] = "[WPA2-EAP-CCMP][ESS]"; 241370570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan levels[0] = WifiQualifiedNetworkSelector.QUALIFIED_RSSI_5G_BAND; 241470570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 241570570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan scanResultLinkConfiguration(savedConfigs, scanDetails); 241670570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan 241770570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //Skip the second network selection since current connected network is 241870570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan //missing from the scan results. 241970570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 242070570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan false, scanDetails, false, true, false, false); 242170570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan assertEquals("Expect no network selection", null, candidate); 242270570f92c6e0a65c144c8df2e5639ef454f1dc7aRandy Pan } 2423e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 24243112931546f051366df4fd15bd3236f11875a915pkanwar boolean compareCarrierConfigs(WifiConfiguration candidate, WifiConfiguration carrierConfig) { 24253112931546f051366df4fd15bd3236f11875a915pkanwar if (!candidate.SSID.equals(carrierConfig.SSID)) { 24263112931546f051366df4fd15bd3236f11875a915pkanwar return false; 24273112931546f051366df4fd15bd3236f11875a915pkanwar } 24283112931546f051366df4fd15bd3236f11875a915pkanwar if (!candidate.ephemeral || carrierConfig.ephemeral) { 24293112931546f051366df4fd15bd3236f11875a915pkanwar return false; 24303112931546f051366df4fd15bd3236f11875a915pkanwar } 24313112931546f051366df4fd15bd3236f11875a915pkanwar if (!candidate.isCarrierNetwork || carrierConfig.isCarrierNetwork) { 24323112931546f051366df4fd15bd3236f11875a915pkanwar return false; 24333112931546f051366df4fd15bd3236f11875a915pkanwar } 24343112931546f051366df4fd15bd3236f11875a915pkanwar if (candidate.enterpriseConfig.getEapMethod() != 24353112931546f051366df4fd15bd3236f11875a915pkanwar carrierConfig.enterpriseConfig.getEapMethod()) { 24363112931546f051366df4fd15bd3236f11875a915pkanwar return false; 24373112931546f051366df4fd15bd3236f11875a915pkanwar } 24383112931546f051366df4fd15bd3236f11875a915pkanwar return true; 24393112931546f051366df4fd15bd3236f11875a915pkanwar } 24403112931546f051366df4fd15bd3236f11875a915pkanwar 2441e22b68960966645a77cb71042879a4ab0d9bd638pkanwar /** 2442e22b68960966645a77cb71042879a4ab0d9bd638pkanwar * Case #49 Between two 2G Carrier networks, choose the one with stronger RSSI value 2443e22b68960966645a77cb71042879a4ab0d9bd638pkanwar * if other conditions are the same and the RSSI values are not staturated. 2444e22b68960966645a77cb71042879a4ab0d9bd638pkanwar */ 2445e22b68960966645a77cb71042879a4ab0d9bd638pkanwar @Test 2446e22b68960966645a77cb71042879a4ab0d9bd638pkanwar public void chooseStrongerRssi2GCarrierNetwork() { 2447e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2448e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] ssids = {"TEST1", "TEST2"}; 2449e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2450e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] frequencies = {2470, 2437}; 2451e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"}; 2452e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] levels = {-65,-55}; 2453e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] security = {SECURITY_PSK, SECURITY_PSK}; 2454e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2455e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2456e22b68960966645a77cb71042879a4ab0d9bd638pkanwar ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 245714145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 245814145984773a3ffb992723045dd6d829c6328b83pkanwar any(Boolean.class))).thenReturn(null); 245914145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class), 246014145984773a3ffb992723045dd6d829c6328b83pkanwar any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg()); 24613112931546f051366df4fd15bd3236f11875a915pkanwar when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class))) 24623112931546f051366df4fd15bd3236f11875a915pkanwar .thenReturn(chosenScanResult); 2463ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true); 2464e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2465e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 246614145984773a3ffb992723045dd6d829c6328b83pkanwar false, scanDetails, false, false, true, false); 24673112931546f051366df4fd15bd3236f11875a915pkanwar assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(1))); 2468e22b68960966645a77cb71042879a4ab0d9bd638pkanwar } 2469e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 247014145984773a3ffb992723045dd6d829c6328b83pkanwar 2471e22b68960966645a77cb71042879a4ab0d9bd638pkanwar /** 2472e22b68960966645a77cb71042879a4ab0d9bd638pkanwar * Case #50 Choose 5G over 2G. 2473e22b68960966645a77cb71042879a4ab0d9bd638pkanwar */ 2474e22b68960966645a77cb71042879a4ab0d9bd638pkanwar @Test 2475e22b68960966645a77cb71042879a4ab0d9bd638pkanwar public void choose5GNetworkOver2GNetwork() { 2476e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2477e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] ssids = {"TEST1", "TEST2"}; 2478e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2479e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] frequencies = {2437, 5240}; 2480e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"}; 2481e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] levels = {-65,-55}; 2482e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2483e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2484e22b68960966645a77cb71042879a4ab0d9bd638pkanwar ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 248514145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 248614145984773a3ffb992723045dd6d829c6328b83pkanwar any(Boolean.class))).thenReturn(null); 248714145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class), 248814145984773a3ffb992723045dd6d829c6328b83pkanwar any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg()); 24893112931546f051366df4fd15bd3236f11875a915pkanwar when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class))) 24903112931546f051366df4fd15bd3236f11875a915pkanwar .thenReturn(chosenScanResult); 2491ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true); 2492e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2493e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 249414145984773a3ffb992723045dd6d829c6328b83pkanwar false, scanDetails, false, false, true, false); 24953112931546f051366df4fd15bd3236f11875a915pkanwar assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(1))); 2496e22b68960966645a77cb71042879a4ab0d9bd638pkanwar } 2497e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2498e22b68960966645a77cb71042879a4ab0d9bd638pkanwar /** 2499e22b68960966645a77cb71042879a4ab0d9bd638pkanwar * Case #51 Stay on same BSSID & SSID. 2500e22b68960966645a77cb71042879a4ab0d9bd638pkanwar */ 2501e22b68960966645a77cb71042879a4ab0d9bd638pkanwar @Test 2502e22b68960966645a77cb71042879a4ab0d9bd638pkanwar public void chooseSameNetwork() { 2503e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2504e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] ssids = {"TEST1", "TEST2"}; 2505e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2506e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] frequencies = {2470, 2437}; 2507e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"}; 2508e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] levels = {-65,-55}; 2509e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] security = {SECURITY_PSK, SECURITY_PSK}; 2510e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2511e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2512e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration[] savedConfigs = generateWifiConfigurations(ssids, security); 2513e22b68960966645a77cb71042879a4ab0d9bd638pkanwar prepareConfigStore(savedConfigs); 2514e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2515e22b68960966645a77cb71042879a4ab0d9bd638pkanwar ScanResult chosenScanResult = scanDetails.get(0).getScanResult(); 251614145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 251714145984773a3ffb992723045dd6d829c6328b83pkanwar any(Boolean.class))).thenReturn(null); 251814145984773a3ffb992723045dd6d829c6328b83pkanwar when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class), 251914145984773a3ffb992723045dd6d829c6328b83pkanwar any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg()); 25203112931546f051366df4fd15bd3236f11875a915pkanwar when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class))) 25213112931546f051366df4fd15bd3236f11875a915pkanwar .thenReturn(chosenScanResult); 2522e22b68960966645a77cb71042879a4ab0d9bd638pkanwar when(mWifiInfo.getNetworkId()).thenReturn(0); 2523e22b68960966645a77cb71042879a4ab0d9bd638pkanwar when(mWifiInfo.getBSSID()).thenReturn(bssids[0]); 2524ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true); 2525e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2526e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 252714145984773a3ffb992723045dd6d829c6328b83pkanwar false, scanDetails, false, true, false, false); 25283112931546f051366df4fd15bd3236f11875a915pkanwar 25293112931546f051366df4fd15bd3236f11875a915pkanwar assertTrue(compareCarrierConfigs(candidate, mCarrierConfiguredNetworks.get(0))); 2530e22b68960966645a77cb71042879a4ab0d9bd638pkanwar } 2531e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2532e22b68960966645a77cb71042879a4ab0d9bd638pkanwar /** 2533e22b68960966645a77cb71042879a4ab0d9bd638pkanwar * Case #52 Test condition where no Carrier networks are defined. 2534e22b68960966645a77cb71042879a4ab0d9bd638pkanwar */ 2535e22b68960966645a77cb71042879a4ab0d9bd638pkanwar @Test 2536e22b68960966645a77cb71042879a4ab0d9bd638pkanwar public void testNoCarrierNetworks() { 2537e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2538e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] ssids = {"TEST1", "TEST2"}; 2539e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2540e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] frequencies = {5200, 5240}; 2541e22b68960966645a77cb71042879a4ab0d9bd638pkanwar String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"}; 2542e22b68960966645a77cb71042879a4ab0d9bd638pkanwar // test2 has slightly stronger RSSI value than test1 2543e22b68960966645a77cb71042879a4ab0d9bd638pkanwar int[] levels = {-65,-53}; 2544e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2545e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2546e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2547e22b68960966645a77cb71042879a4ab0d9bd638pkanwar List<WifiConfiguration> nullCarrierConfiguredNetworks = new ArrayList<WifiConfiguration>(); 2548e22b68960966645a77cb71042879a4ab0d9bd638pkanwar mWifiQualifiedNetworkSelector.setCarrierConfiguredNetworks(nullCarrierConfiguredNetworks); 2549ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(true); 2550e22b68960966645a77cb71042879a4ab0d9bd638pkanwar 2551e22b68960966645a77cb71042879a4ab0d9bd638pkanwar WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 2552e22b68960966645a77cb71042879a4ab0d9bd638pkanwar true, scanDetails, false, false, true, false); 2553e22b68960966645a77cb71042879a4ab0d9bd638pkanwar assertEquals("Expect no network selection", null, candidate); 2554e22b68960966645a77cb71042879a4ab0d9bd638pkanwar } 255514145984773a3ffb992723045dd6d829c6328b83pkanwar 255614145984773a3ffb992723045dd6d829c6328b83pkanwar /** 255714145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #53 Test condition where no Carrier networks are defined. 255814145984773a3ffb992723045dd6d829c6328b83pkanwar */ 255914145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 256014145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoSuccess() { 256114145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 256214145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4"; 256314145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "R29vZ2xlLUE=|2|4"; 256414145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4"; 256514145984773a3ffb992723045dd6d829c6328b83pkanwar 256614145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 256714145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 256814145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right number of etnries", configList.size(), 3); 256914145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\""); 257014145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(1).SSID, "\"Google-A\""); 257114145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(2).SSID, "\"Google-Guest\""); 257214145984773a3ffb992723045dd6d829c6328b83pkanwar assertTrue("Expect right key", 257314145984773a3ffb992723045dd6d829c6328b83pkanwar configList.get(0).allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)); 257414145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right EAP method", 257514145984773a3ffb992723045dd6d829c6328b83pkanwar configList.get(0).enterpriseConfig.getEapMethod(), 4); 257614145984773a3ffb992723045dd6d829c6328b83pkanwar } 257714145984773a3ffb992723045dd6d829c6328b83pkanwar 257814145984773a3ffb992723045dd6d829c6328b83pkanwar /** 257914145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #54 Test condition where string has non-numerics. 258014145984773a3ffb992723045dd6d829c6328b83pkanwar */ 258114145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 258214145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoBadEntries1() { 258314145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 258414145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4"; 258514145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "R29vZ2xlLUE=|2|A"; //Invalid entry. Non-numeric. 258614145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4"; 258714145984773a3ffb992723045dd6d829c6328b83pkanwar 258814145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 258914145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 259014145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right number of etnries", configList.size(), 2); 259114145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\""); 259214145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\""); 259314145984773a3ffb992723045dd6d829c6328b83pkanwar } 259414145984773a3ffb992723045dd6d829c6328b83pkanwar 259514145984773a3ffb992723045dd6d829c6328b83pkanwar /** 259614145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #55 Test condition where the config does not have the right number of entries. 259714145984773a3ffb992723045dd6d829c6328b83pkanwar */ 259814145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 259914145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoBadEntries2() { 260014145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 260114145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2"; //Invalid number of entries 260214145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "R29vZ2xlLUE=|2|4"; 260314145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4"; 260414145984773a3ffb992723045dd6d829c6328b83pkanwar 260514145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 260614145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 260714145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Google-A\""); 260814145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\""); 260914145984773a3ffb992723045dd6d829c6328b83pkanwar } 261014145984773a3ffb992723045dd6d829c6328b83pkanwar 261114145984773a3ffb992723045dd6d829c6328b83pkanwar /** 261214145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #56 Test invalid base-64. 261314145984773a3ffb992723045dd6d829c6328b83pkanwar */ 261414145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 261514145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoBadBase64() { 261614145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 261714145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4"; 261814145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "xyz==|2|4"; //Invalid base64 261914145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4"; 262014145984773a3ffb992723045dd6d829c6328b83pkanwar 262114145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 262214145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 262314145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\""); 262414145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(1).SSID, "\"Google-Guest\""); 262514145984773a3ffb992723045dd6d829c6328b83pkanwar } 262614145984773a3ffb992723045dd6d829c6328b83pkanwar 262714145984773a3ffb992723045dd6d829c6328b83pkanwar /** 262814145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #56 Test invalid eap-method 262914145984773a3ffb992723045dd6d829c6328b83pkanwar */ 263014145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 263114145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoBadEapMethod() { 263214145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 263314145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4"; 263414145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "R29vZ2xlLUE=|2|4"; 263514145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|11"; //Invalid eap-method 263614145984773a3ffb992723045dd6d829c6328b83pkanwar 263714145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 263814145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 263914145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\""); 264014145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(1).SSID, "\"Google-A\""); 264114145984773a3ffb992723045dd6d829c6328b83pkanwar } 264214145984773a3ffb992723045dd6d829c6328b83pkanwar 264314145984773a3ffb992723045dd6d829c6328b83pkanwar /** 264414145984773a3ffb992723045dd6d829c6328b83pkanwar * Case #56 Test invalid key 264514145984773a3ffb992723045dd6d829c6328b83pkanwar */ 264614145984773a3ffb992723045dd6d829c6328b83pkanwar @Test 264714145984773a3ffb992723045dd6d829c6328b83pkanwar public void testParseCarrierInfoBadKey() { 264814145984773a3ffb992723045dd6d829c6328b83pkanwar String[] wifiArray = new String[3]; 264914145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[0] = "V2lmaSBFeHRyYQ==|2|4"; 265014145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[1] = "R29vZ2xlLUE=|9|4"; //Invalid key 265114145984773a3ffb992723045dd6d829c6328b83pkanwar wifiArray[2] = "R29vZ2xlLUd1ZXN0|2|4"; 265214145984773a3ffb992723045dd6d829c6328b83pkanwar 265314145984773a3ffb992723045dd6d829c6328b83pkanwar List<WifiConfiguration> configList = 265414145984773a3ffb992723045dd6d829c6328b83pkanwar mWifiQualifiedNetworkSelector.parseCarrierSuppliedWifiInfo(wifiArray); 265514145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(0).SSID, "\"Wifi Extra\""); 265614145984773a3ffb992723045dd6d829c6328b83pkanwar assertEquals("Expect right network", configList.get(2).SSID, "\"Google-Guest\""); 265714145984773a3ffb992723045dd6d829c6328b83pkanwar } 2658ab9a573e3138911e08d037a6996297be30be20bcpkanwar 2659ab9a573e3138911e08d037a6996297be30be20bcpkanwar /** 2660ab9a573e3138911e08d037a6996297be30be20bcpkanwar * Case #57 Test condition where no Carrier networks are defined. 2661ab9a573e3138911e08d037a6996297be30be20bcpkanwar */ 2662ab9a573e3138911e08d037a6996297be30be20bcpkanwar @Test 2663ab9a573e3138911e08d037a6996297be30be20bcpkanwar public void testCarrierNotEnabledByUser() { 2664ab9a573e3138911e08d037a6996297be30be20bcpkanwar 2665ab9a573e3138911e08d037a6996297be30be20bcpkanwar String[] ssids = {"TEST1", "TEST2"}; 2666ab9a573e3138911e08d037a6996297be30be20bcpkanwar String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 2667ab9a573e3138911e08d037a6996297be30be20bcpkanwar int[] frequencies = {2437, 5240}; 2668ab9a573e3138911e08d037a6996297be30be20bcpkanwar String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"}; 2669ab9a573e3138911e08d037a6996297be30be20bcpkanwar int[] levels = {-65,-55}; 2670ab9a573e3138911e08d037a6996297be30be20bcpkanwar 2671ab9a573e3138911e08d037a6996297be30be20bcpkanwar List<ScanDetail> scanDetails = getScanDetails(ssids, bssids, frequencies, caps, levels); 2672ab9a573e3138911e08d037a6996297be30be20bcpkanwar ScanResult chosenScanResult = scanDetails.get(1).getScanResult(); 2673ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.updateSavedNetworkWithNewScanDetail(any(ScanDetail.class), 2674ab9a573e3138911e08d037a6996297be30be20bcpkanwar any(Boolean.class))).thenReturn(null); 2675ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.saveNetworkAndSetCandidate(any(WifiConfiguration.class), 2676ab9a573e3138911e08d037a6996297be30be20bcpkanwar any(ScanResult.class))).then(AdditionalAnswers.returnsFirstArg()); 26773112931546f051366df4fd15bd3236f11875a915pkanwar when(mWifiConfigManager.getScanResultCandidate(any(WifiConfiguration.class))) 26783112931546f051366df4fd15bd3236f11875a915pkanwar .thenReturn(chosenScanResult); 2679ab9a573e3138911e08d037a6996297be30be20bcpkanwar when(mWifiConfigManager.getIsCarrierNetworkEnabledByUser()).thenReturn(false); 2680ab9a573e3138911e08d037a6996297be30be20bcpkanwar 2681ab9a573e3138911e08d037a6996297be30be20bcpkanwar WifiConfiguration candidate = mWifiQualifiedNetworkSelector.selectQualifiedNetwork(false, 2682ab9a573e3138911e08d037a6996297be30be20bcpkanwar false, scanDetails, false, false, true, false); 2683ab9a573e3138911e08d037a6996297be30be20bcpkanwar assertEquals("Expect no network selection", null, candidate); 2684ab9a573e3138911e08d037a6996297be30be20bcpkanwar } 26858f3ec73d1ce52b3f23e4cccd6a202b5707874f46xinhe} 2686