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