1f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh/*
2f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * Copyright (C) 2016 The Android Open Source Project
3f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh *
4f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * Licensed under the Apache License, Version 2.0 (the "License");
5f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * you may not use this file except in compliance with the License.
6f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * You may obtain a copy of the License at
7f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh *
8f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh *      http://www.apache.org/licenses/LICENSE-2.0
9f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh *
10f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * Unless required by applicable law or agreed to in writing, software
11f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * distributed under the License is distributed on an "AS IS" BASIS,
12f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * See the License for the specific language governing permissions and
14f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * limitations under the License.
15f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh */
16f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
17f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhpackage com.android.server.wifi;
18f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
19f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
20f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_NONE;
21f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK;
22f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
23f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport static org.junit.Assert.*;
24f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport static org.mockito.Mockito.*;
25f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
26f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.content.Context;
27f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.database.ContentObserver;
28f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.NetworkKey;
29f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.NetworkScoreManager;
30f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.Uri;
31f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.wifi.ScanResult;
32f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.wifi.WifiConfiguration;
33f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.net.wifi.WifiNetworkScoreCache;
34f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.os.Looper;
35f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.os.SystemClock;
36f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.provider.Settings;
37f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.test.suitebuilder.annotation.SmallTest;
38f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport android.util.LocalLog;
39f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
40f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport com.android.server.wifi.WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs;
41f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
42f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.junit.After;
43f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.junit.Before;
44f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.junit.Test;
45f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.mockito.ArgumentCaptor;
46f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.mockito.Captor;
47f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.mockito.Mock;
48f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport org.mockito.MockitoAnnotations;
49f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
50f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport java.util.ArrayList;
51f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhimport java.util.List;
52f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
53f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh/**
54f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh * Unit tests for {@link ScoredNetworkEvaluator}.
55f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh */
56f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh@SmallTest
57f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikhpublic class ScoredNetworkEvaluatorTest {
58f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    private ContentObserver mContentObserver;
59f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    private int mThresholdQualifiedRssi2G;
60f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    private int mThresholdQualifiedRssi5G;
61f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
62f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Mock private Context mContext;
63f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Mock private Clock mClock;
64f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Mock private FrameworkFacade mFrameworkFacade;
65f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Mock private NetworkScoreManager mNetworkScoreManager;
66f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Mock private WifiConfigManager mWifiConfigManager;
67f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
68f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Captor private ArgumentCaptor<NetworkKey[]> mNetworkKeyArrayCaptor;
69f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
70f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    private WifiNetworkScoreCache mScoreCache;
71f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    private ScoredNetworkEvaluator mScoredNetworkEvaluator;
72f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
73f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Before
74f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void setUp() throws Exception {
75f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mThresholdQualifiedRssi2G = -73;
76f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mThresholdQualifiedRssi5G = -70;
77f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
78f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        MockitoAnnotations.initMocks(this);
79f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
80f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        when(mFrameworkFacade.getIntegerSetting(mContext,
81f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
82f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(1);
83f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
84f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ArgumentCaptor<ContentObserver> observerCaptor =
85f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ArgumentCaptor.forClass(ContentObserver.class);
86f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoreCache = new WifiNetworkScoreCache(mContext);
87f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator = new ScoredNetworkEvaluator(mContext,
88f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                Looper.getMainLooper(), mFrameworkFacade, mNetworkScoreManager,
89f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                mWifiConfigManager, new LocalLog(0), mScoreCache);
90f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verify(mFrameworkFacade).registerContentObserver(eq(mContext), any(Uri.class), eq(false),
91f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                observerCaptor.capture());
92f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mContentObserver = observerCaptor.getValue();
93f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
94f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        reset(mNetworkScoreManager);
95f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
96f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        when(mClock.getElapsedSinceBootMillis()).thenReturn(SystemClock.elapsedRealtime());
97f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
98f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
99f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @After
100f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void tearDown() {
101f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        validateMockitoUsage();
102f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
103f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
104f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
105f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testUpdate_recommendationsDisabled() {
106f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\""};
107f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3"};
108f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470};
109f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
110f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8};
111f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK};
112f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
113f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil
114f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupScanDetailsAndConfigStore(
115f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock);
116f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
117f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        when(mFrameworkFacade.getIntegerSetting(mContext,
118f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
119f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(0);
120f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
121f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mContentObserver.onChange(false /* unused */);
122f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
123f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails());
124f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
125f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verifyZeroInteractions(mNetworkScoreManager);
126f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
127f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
128f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
129f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testUpdate_emptyScanList() {
130f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\""};
131f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3"};
132f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470};
133f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
134f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8};
135f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK};
136f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
137f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil
138f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupScanDetailsAndConfigStore(
139f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock);
140f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
141f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator.update(new ArrayList<ScanDetail>());
142f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
143f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verifyZeroInteractions(mNetworkScoreManager);
144f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
145f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
146f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
147f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testUpdate_allNetworksUnscored() {
148f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
149f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
150f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
151f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
152f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_NONE};
153f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
154f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
155f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil
156f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupScanDetailsAndConfigStore(
157f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock);
158f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
159f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails());
160f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
161f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
162f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(2, mNetworkKeyArrayCaptor.getValue().length);
163f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        NetworkKey expectedNetworkKey = NetworkKey.createFromScanResult(
164f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetailsAndConfigs.getScanDetails().get(0).getScanResult());
165f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[0]);
166f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        expectedNetworkKey = NetworkKey.createFromScanResult(
167f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetailsAndConfigs.getScanDetails().get(1).getScanResult());
168f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(expectedNetworkKey, mNetworkKeyArrayCaptor.getValue()[1]);
169f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
170f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
171f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
172f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testUpdate_oneScored_oneUnscored() {
173f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
174f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
175f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
176f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
177f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_NONE};
178f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
179f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
180f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanDetailsAndWifiConfigs scanDetailsAndConfigs = WifiNetworkSelectorTestUtil
181f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupScanDetailsAndConfigStore(
182f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        ssids, bssids, freqs, caps, levels, securities, mWifiConfigManager, mClock);
183f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
184f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scoredScanDetails = scanDetailsAndConfigs.getScanDetails().subList(0, 1);
185f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {120};
186f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {true};
187f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(
188f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                mScoreCache, scoredScanDetails, scores, meteredHints);
189f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
190f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator.update(scanDetailsAndConfigs.getScanDetails());
191f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
192f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verify(mNetworkScoreManager).requestScores(mNetworkKeyArrayCaptor.capture());
193f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
194f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        NetworkKey[] requestedScores = mNetworkKeyArrayCaptor.getValue();
195f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(1, requestedScores.length);
196f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        NetworkKey expectedNetworkKey = NetworkKey.createFromScanResult(
197f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetailsAndConfigs.getScanDetails().get(1).getScanResult());
198f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(expectedNetworkKey, requestedScores[0]);
199f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
200f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
201f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
202f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_recommendationsDisabled() {
203f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        when(mFrameworkFacade.getIntegerSetting(mContext,
204f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, 0))
205f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(0);
206f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
207f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mContentObserver.onChange(false /* unused */);
208f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
209f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        mScoredNetworkEvaluator.evaluateNetworks(null, null, null, false, false, null);
210f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
211f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        verifyZeroInteractions(mWifiConfigManager, mNetworkScoreManager);
212f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
213f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
214f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
215f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * When no saved networks available, choose the available ephemeral networks
216f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * if untrusted networks are allowed.
217f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
218f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
219f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseEphemeralNetworkBecauseOfNoSavedNetwork() {
220f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
221f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
222f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
223f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
224f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
225f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {null, 120};
226f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, true};
227f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
228f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
229f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ssids, bssids, freqs, caps, levels, mClock);
230f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
231f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
232f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
233f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // No saved networks.
23403c23584f072aef576736044c1fa12ddcb2d882bRoshan Pius        when(mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(any(ScanDetail.class)))
235f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(null);
236f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
237f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanResult scanResult = scanDetails.get(1).getScanResult();
238f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
239f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupEphemeralNetwork(mWifiConfigManager, 1, scanDetails.get(1), meteredHints[1]);
240f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
241f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Untrusted networks allowed.
242f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
243f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
244f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
245f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
246f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
247f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanResult, candidate);
248f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(meteredHints[1], candidate.meteredHint);
249f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
250f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
251f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
252f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * When no saved networks available, choose the highest scored ephemeral networks
253f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * if untrusted networks are allowed.
254f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
255f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
256f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseHigherScoredEphemeralNetwork() {
257f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
258f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
259f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
260f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[ESS]", "[ESS]"};
261f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
262f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {100, 120};
263f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {true, true};
264f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanResult[] scanResults = new ScanResult[2];
265f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2];
266f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
267f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
268f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ssids, bssids, freqs, caps, levels, mClock);
269f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
270f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
271f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
272f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // No saved networks.
27303c23584f072aef576736044c1fa12ddcb2d882bRoshan Pius        when(mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(any(ScanDetail.class)))
274f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(null);
275f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
276f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        for (int i = 0; i < 2; i++) {
277f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh            scanResults[i] = scanDetails.get(i).getScanResult();
278f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh            ephemeralNetworkConfigs[i] = WifiNetworkSelectorTestUtil.setupEphemeralNetwork(
279f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                    mWifiConfigManager, i, scanDetails.get(i), meteredHints[i]);
280f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        }
281f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
282f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
283f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
284f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
285f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate);
286f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
287f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanResults[1], candidate);
288f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(meteredHints[1], candidate.meteredHint);
289f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
290f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
291f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
292f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Don't choose available ephemeral networks if no saved networks and untrusted networks
293f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * are not allowed.
294f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
295f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
296f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_noEphemeralNetworkWhenUntrustedNetworksNotAllowed() {
297f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
298f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
299f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
300f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
301f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 10};
302f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {null, 120};
303f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, true};
304f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
305f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil.buildScanDetails(
306f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ssids, bssids, freqs, caps, levels, mClock);
307f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
308f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
309f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
310f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // No saved networks.
31103c23584f072aef576736044c1fa12ddcb2d882bRoshan Pius        when(mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(any(ScanDetail.class)))
312f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(null);
313f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
314f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.setupEphemeralNetwork(
315f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                mWifiConfigManager, 1, scanDetails.get(1), meteredHints[1]);
316f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
317f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Untrusted networks not allowed.
318f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
319f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, false, null);
320f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
321f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals("Expect null configuration", null, candidate);
322f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
323f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
324f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
325f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Choose externally scored saved network.
326f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
327f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
328f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseSavedNetworkWithExternalScore() {
329f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\""};
330f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3"};
331f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {5200};
332f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]"};
333f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK};
334f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi5G + 8};
335f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {120};
336f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false};
337f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
338f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
339f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
340f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        freqs, caps, levels, securities, mWifiConfigManager, mClock);
341f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
342f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
343f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = true;
344f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
345f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
346f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
347f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
348f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
349f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
350f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
351f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
352f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
353f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails.get(0).getScanResult(), candidate);
354f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
355f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
356f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
357f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Choose externally scored saved network with higher score.
358f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
359f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
360f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseSavedNetworkWithHigherExternalScore() {
361f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
362f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
363f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
364f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
365f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_PSK};
366f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
367f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {100, 120};
368f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, false};
369f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
370f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
371f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
372f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        freqs, caps, levels, securities, mWifiConfigManager, mClock);
373f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
374f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
375f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true;
376f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
377f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
378f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
379f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
380f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
381f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
382f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
383f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
384f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
385f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails.get(1).getScanResult(), candidate);
386f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
387f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
388f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
389f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Prefer externally scored saved network over untrusted network when they have
390f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * the same score.
391f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
392f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
393f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseExternallyScoredOverUntrustedNetworksWithSameScore() {
394f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
395f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
396f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
397f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
398f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_NONE};
399f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
400f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {120, 120};
401f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, true};
402f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
403f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
404f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
405f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        freqs, caps, levels, securities, mWifiConfigManager, mClock);
406f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
407f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
408f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = true;
409f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
410f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
411f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
412f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
413f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
414f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
415f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
416f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[0], candidate);
417f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
418f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails.get(0).getScanResult(), candidate);
419f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
420f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
421f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
422f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Choose untrusted network when it has higher score than the externally scored
423f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * saved network.
424f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
425f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
426f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseUntrustedWithHigherScoreThanExternallyScoredNetwork() {
427f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Saved network.
428f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] savedSsids = {"\"test1\""};
429f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] savedBssids = {"6c:f3:7f:ae:8c:f3"};
430f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] savedFreqs = {2470};
431f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] savedCaps = {"[WPA2-EAP-CCMP][ESS]"};
432f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] savedSecurities = {SECURITY_PSK};
433f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] savedLevels = {mThresholdQualifiedRssi2G + 8};
434f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Ephemeral network.
435f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ephemeralSsids = {"\"test2\""};
436f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ephemeralBssids = {"6c:f3:7f:ae:8c:f4"};
437f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] ephemeralFreqs = {2437};
438f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ephemeralCaps = {"[ESS]"};
439f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] ephemeralLevels = {mThresholdQualifiedRssi2G + 8};
440f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Ephemeral network has higher score than the saved network.
441f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {100, 120};
442f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, true};
443f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
444f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Set up the saved network.
445f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
446f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(savedSsids,
447f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        savedBssids, savedFreqs, savedCaps, savedLevels, savedSecurities,
448f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        mWifiConfigManager, mClock);
449f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
450f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
451f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = true;
452f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
453f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Set up the ephemeral network.
454f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        scanDetails.addAll(WifiNetworkSelectorTestUtil.buildScanDetails(
455f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ephemeralSsids, ephemeralBssids, ephemeralFreqs,
456f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ephemeralCaps, ephemeralLevels, mClock));
457f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanResult ephemeralScanResult = scanDetails.get(1).getScanResult();
458f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration ephemeralNetworkConfig = WifiNetworkSelectorTestUtil
459f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .setupEphemeralNetwork(mWifiConfigManager, 1, scanDetails.get(1),
460f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        meteredHints[1]);
461f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
462f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // Set up score cache for both the saved network and the ephemeral network.
463f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
464f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
465f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
466f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
467f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
468f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
469f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfig, candidate);
470f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
471f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                ephemeralScanResult, candidate);
472f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
473f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
474f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
475f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Prefer externally scored saved network over untrusted network when they have
476f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * the same score.
477f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
478f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
479f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_nullScoredNetworks() {
480f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
481f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
482f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
483f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[ESS]"};
484f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_NONE};
485f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 8, mThresholdQualifiedRssi2G + 8};
486f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        Integer[] scores = {null, null};
487f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, true};
488f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
489f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
490f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
491f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        freqs, caps, levels, securities, mWifiConfigManager, mClock);
492f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
493f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
494f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = true;
495f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
496f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
497f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, scores, meteredHints);
498f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
499f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
500f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                null, null, false, true, null);
501f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
502f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals("Expect null configuration", null, candidate);
503f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
504f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
505f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
506f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * Between two ephemeral networks with the same RSSI, choose
507f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     * the currently connected one.
508f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
509f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
510f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseActiveEphemeralNetwork() {
511f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
512f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
513f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
514f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[ESS]", "[ESS]"};
515f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 28, mThresholdQualifiedRssi2G + 28};
516f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {true, true};
517f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        ScanResult[] scanResults = new ScanResult[2];
518f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] ephemeralNetworkConfigs = new WifiConfiguration[2];
519f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
520f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = WifiNetworkSelectorTestUtil
521f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .buildScanDetails(ssids, bssids, freqs, caps, levels, mClock);
522f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
523f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(
524f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                mScoreCache, scanDetails, null, meteredHints);
525f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
526f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        // No saved networks.
52703c23584f072aef576736044c1fa12ddcb2d882bRoshan Pius        when(mWifiConfigManager.getConfiguredNetworkForScanDetailAndCache(any(ScanDetail.class)))
528f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                .thenReturn(null);
529f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
530f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        for (int i = 0; i < 2; i++) {
531f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh            scanResults[i] = scanDetails.get(i).getScanResult();
532f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh            ephemeralNetworkConfigs[i] = WifiNetworkSelectorTestUtil.setupEphemeralNetwork(
533f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                    mWifiConfigManager, i, scanDetails.get(i), meteredHints[i]);
534f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        }
535f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
536f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(
537f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, ephemeralNetworkConfigs[1],
538f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                bssids[1], true, true, null);
539f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
540f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(ephemeralNetworkConfigs[1], candidate);
541f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
542f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanResults[1], candidate);
543f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        assertEquals(meteredHints[1], candidate.meteredHint);
544f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
545f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
546f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    /**
547f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     *  Between two externally scored saved networks with the same RSSI, choose
548f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     *  the currently connected one.
549f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh     */
550f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    @Test
551f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    public void testEvaluateNetworks_chooseActiveSavedNetwork() {
552f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] ssids = {"\"test1\"", "\"test2\""};
553f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"};
554f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] freqs = {2470, 2437};
555f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        String[] caps = {"[WPA2-EAP-CCMP][ESS]", "[WPA2-EAP-CCMP][ESS]"};
556f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] securities = {SECURITY_PSK, SECURITY_PSK};
557f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        int[] levels = {mThresholdQualifiedRssi2G + 28, mThresholdQualifiedRssi2G + 28};
558f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        boolean[] meteredHints = {false, false};
559f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
560f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.ScanDetailsAndWifiConfigs scanDetailsAndConfigs =
561f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                WifiNetworkSelectorTestUtil.setupScanDetailsAndConfigStore(ssids, bssids,
562f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                        freqs, caps, levels, securities, mWifiConfigManager, mClock);
563f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        List<ScanDetail> scanDetails = scanDetailsAndConfigs.getScanDetails();
564f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration[] savedConfigs = scanDetailsAndConfigs.getWifiConfigs();
565f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        savedConfigs[0].useExternalScores = savedConfigs[1].useExternalScores = true;
566f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
567f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.configureScoreCache(mScoreCache,
568f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails, null, meteredHints);
569f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
570f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfiguration candidate = mScoredNetworkEvaluator.evaluateNetworks(scanDetails,
571f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                savedConfigs[1], bssids[1], true, true, null);
572f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh
573f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiConfigurationTestUtil.assertConfigurationEqual(savedConfigs[1], candidate);
574f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh        WifiNetworkSelectorTestUtil.verifySelectedScanResult(mWifiConfigManager,
575f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh                scanDetails.get(1).getScanResult(), candidate);
576f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh    }
577f14e4b8fdd949b4ba0feb63dded4d9b233859300Amin Shaikh}
578