1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.wifi; 18 19 import static android.net.wifi.WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_TEMPORARY_DISABLED; 20 21 import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_EAP; 22 import static com.android.server.wifi.WifiConfigurationTestUtil.SECURITY_PSK; 23 import static com.android.server.wifi.WifiConfigurationTestUtil.generateWifiConfig; 24 25 import static org.junit.Assert.assertEquals; 26 import static org.junit.Assert.assertNotNull; 27 import static org.junit.Assert.assertTrue; 28 import static org.mockito.Mockito.any; 29 import static org.mockito.Mockito.anyBoolean; 30 import static org.mockito.Mockito.anyInt; 31 import static org.mockito.Mockito.anyString; 32 import static org.mockito.Mockito.atLeast; 33 import static org.mockito.Mockito.eq; 34 import static org.mockito.Mockito.mock; 35 import static org.mockito.Mockito.never; 36 import static org.mockito.Mockito.times; 37 import static org.mockito.Mockito.verify; 38 import static org.mockito.Mockito.verifyNoMoreInteractions; 39 import static org.mockito.Mockito.when; 40 41 import android.net.wifi.WifiConfiguration; 42 import android.net.wifi.WifiEnterpriseConfig; 43 import android.net.wifi.WifiNetworkSuggestion; 44 import android.net.wifi.WifiSsid; 45 import android.os.Process; 46 import android.telephony.SubscriptionManager; 47 import android.util.LocalLog; 48 import android.util.Pair; 49 50 import androidx.test.filters.SmallTest; 51 52 import com.android.modules.utils.build.SdkLevel; 53 import com.android.server.wifi.WifiNetworkSuggestionsManager.ExtendedWifiNetworkSuggestion; 54 import com.android.server.wifi.WifiNetworkSuggestionsManager.PerAppInfo; 55 import com.android.server.wifi.entitlement.PseudonymInfo; 56 57 import org.junit.Before; 58 import org.junit.Test; 59 import org.mockito.ArgumentCaptor; 60 import org.mockito.Mock; 61 import org.mockito.MockitoAnnotations; 62 63 import java.util.ArrayList; 64 import java.util.Arrays; 65 import java.util.Collections; 66 import java.util.HashSet; 67 import java.util.List; 68 import java.util.Optional; 69 import java.util.Set; 70 71 /** 72 * Unit tests for {@link NetworkSuggestionNominator}. 73 */ 74 @SmallTest 75 public class NetworkSuggestionNominatorTest extends WifiBaseTest { 76 private static final int TEST_UID = 3555; 77 private static final int TEST_UID_OTHER = 3545; 78 private static final int TEST_NETWORK_ID = 55; 79 private static final String TEST_PACKAGE = "com.test"; 80 private static final String TEST_PACKAGE_OTHER = "com.test.other"; 81 private static final String TEST_FQDN = "fqdn"; 82 private static final int TEST_CARRIER_ID = 1911; 83 private static final String TEST_CARRIER_NAME = "testCarrier"; 84 private static final int TEST_SUB_ID = 2020; 85 private static final String PASSPOINT_UNIQUE_ID = "uniqueId"; 86 87 88 private @Mock WifiConfigManager mWifiConfigManager; 89 private @Mock WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager; 90 private @Mock Clock mClock; 91 private @Mock WifiCarrierInfoManager mWifiCarrierInfoManager; 92 private @Mock WifiPseudonymManager mWifiPseudonymManager; 93 private @Mock WifiMetrics mWifiMetrics; 94 private NetworkSuggestionNominator mNetworkSuggestionNominator; 95 private List<Pair<ScanDetail, WifiConfiguration>> mPasspointCandidates = 96 Collections.emptyList(); 97 98 /** Sets up test. */ 99 @Before setUp()100 public void setUp() throws Exception { 101 MockitoAnnotations.initMocks(this); 102 mNetworkSuggestionNominator = new NetworkSuggestionNominator( 103 mWifiNetworkSuggestionsManager, mWifiConfigManager, 104 new LocalLog(100), mWifiCarrierInfoManager, mWifiPseudonymManager, 105 mWifiMetrics); 106 when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(any())).thenReturn( 107 SubscriptionManager.INVALID_SUBSCRIPTION_ID); 108 when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(anyString())).thenReturn(false); 109 } 110 111 /** 112 * Ensure that we ignore all scan results not matching the network suggestion. 113 * Expected connectable Networks: {} 114 */ 115 @Test testSelectNetworkSuggestionForNoMatch()116 public void testSelectNetworkSuggestionForNoMatch() { 117 String[] scanSsids = {"test1", "test2"}; 118 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 119 int[] freqs = {2470, 2437}; 120 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 121 int[] levels = {-67, -76}; 122 String[] suggestionSsids = {}; 123 int[] securities = {}; 124 boolean[] appInteractions = {}; 125 boolean[] meteredness = {}; 126 int[] priorities = {}; 127 int[] uids = {}; 128 String[] packageNames = {}; 129 boolean[] autojoin = {}; 130 boolean[] shareWithUser = {}; 131 int[] priorityGroup = {}; 132 133 ScanDetail[] scanDetails = 134 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 135 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 136 securities, appInteractions, meteredness, priorities, uids, 137 packageNames, autojoin, shareWithUser, priorityGroup); 138 // Link the scan result with suggestions. 139 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 140 141 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 142 mNetworkSuggestionNominator.nominateNetworks( 143 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 144 Collections.emptySet(), 145 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 146 connectableNetworks.add(Pair.create(scanDetail, configuration)); 147 }); 148 149 assertTrue(connectableNetworks.isEmpty()); 150 verify(mWifiMetrics, never()) 151 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 152 } 153 154 /** 155 * Ensure that we nominate the only matching network suggestion. 156 * Expected connectable Networks: {suggestionSsids[0]} 157 */ 158 @Test testSelectNetworkSuggestionForOneMatch()159 public void testSelectNetworkSuggestionForOneMatch() { 160 String[] scanSsids = {"test1", "test2"}; 161 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 162 int[] freqs = {2470, 2437}; 163 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 164 int[] levels = {-67, -76}; 165 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 166 int[] securities = {SECURITY_PSK}; 167 boolean[] appInteractions = {true}; 168 boolean[] meteredness = {true}; 169 int[] priorities = {-1}; 170 int[] uids = {TEST_UID}; 171 String[] packageNames = {TEST_PACKAGE}; 172 boolean[] autojoin = {true}; 173 boolean[] shareWithUser = {true}; 174 int[] priorityGroup = {0}; 175 ScanDetail[] scanDetails = 176 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 177 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 178 securities, appInteractions, meteredness, priorities, uids, 179 packageNames, autojoin, shareWithUser, priorityGroup); 180 // Link the scan result with suggestions. 181 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 182 // setup config manager interactions. 183 setupAddToWifiConfigManager(suggestions[0]); 184 185 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 186 mNetworkSuggestionNominator.nominateNetworks( 187 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 188 Collections.emptySet(), 189 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 190 connectableNetworks.add(Pair.create(scanDetail, configuration)); 191 }); 192 193 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 194 verify(mWifiMetrics, never()) 195 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 196 } 197 198 @Test testSelectNetworkSuggestionForOneMatchWithInsecureEnterpriseSuggestion()199 public void testSelectNetworkSuggestionForOneMatchWithInsecureEnterpriseSuggestion() { 200 String[] scanSsids = {"test1"}; 201 String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 202 int[] freqs = {2470}; 203 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]"}; 204 int[] levels = {-67}; 205 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 206 int[] securities = {SECURITY_EAP}; 207 boolean[] appInteractions = {true}; 208 boolean[] meteredness = {true}; 209 int[] priorities = {-1}; 210 int[] uids = {TEST_UID}; 211 String[] packageNames = {TEST_PACKAGE}; 212 boolean[] autojoin = {true}; 213 boolean[] shareWithUser = {true}; 214 int[] priorityGroup = {0}; 215 216 ScanDetail[] scanDetails = 217 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 218 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 219 securities, appInteractions, meteredness, priorities, uids, 220 packageNames, autojoin, shareWithUser, priorityGroup); 221 WifiConfiguration config = suggestions[0].wns.wifiConfiguration; 222 config.enterpriseConfig.setCaPath(null); 223 // Link the scan result with suggestions. 224 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 225 // setup config manager interactions. 226 setupAddToWifiConfigManager(suggestions[0]); 227 228 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 229 mNetworkSuggestionNominator.nominateNetworks( 230 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 231 Collections.emptySet(), 232 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 233 connectableNetworks.add(Pair.create(scanDetail, configuration)); 234 }); 235 236 // Verify no network is nominated. 237 assertTrue(connectableNetworks.isEmpty()); 238 verify(mWifiMetrics, never()) 239 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 240 } 241 242 /** 243 * Ensure that we nominate the all network suggestion corresponding to the scan results 244 * Expected connectable Networks: {suggestionSsids[0], suggestionSsids[1]} 245 */ 246 @Test testSelectNetworkSuggestionForMultipleMatch()247 public void testSelectNetworkSuggestionForMultipleMatch() { 248 String[] scanSsids = {"test1", "test2"}; 249 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 250 int[] freqs = {2470, 2437}; 251 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 252 int[] levels = {-56, -45}; 253 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""}; 254 int[] securities = {SECURITY_PSK, SECURITY_PSK}; 255 boolean[] appInteractions = {true, true}; 256 boolean[] meteredness = {true, true}; 257 int[] priorities = {-1, -1}; 258 int[] uids = {TEST_UID, TEST_UID}; 259 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE}; 260 boolean[] autojoin = {true, true}; 261 boolean[] shareWithUser = {true, true}; 262 int[] priorityGroup = {0, 0}; 263 264 ScanDetail[] scanDetails = 265 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 266 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 267 securities, appInteractions, meteredness, priorities, uids, 268 packageNames, autojoin, shareWithUser, priorityGroup); 269 // Link the scan result with suggestions. 270 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 271 // setup config manager interactions. 272 setupAddToWifiConfigManager(suggestions[0], suggestions[1]); 273 274 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 275 mNetworkSuggestionNominator.nominateNetworks( 276 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 277 Collections.emptySet(), 278 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 279 connectableNetworks.add(Pair.create(scanDetail, configuration)); 280 }); 281 282 validateConnectableNetworks(connectableNetworks, scanSsids[0], scanSsids[1]); 283 verify(mWifiMetrics, never()) 284 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 285 } 286 287 /** 288 * Ensure that we nominate the network suggestion corresponding to the scan result with 289 * higest priority. 290 * Expected connectable Networks: {suggestionSsids[0]} 291 */ 292 @Test testSelectNetworkSuggestionForMultipleMatchHighPriorityWins()293 public void testSelectNetworkSuggestionForMultipleMatchHighPriorityWins() { 294 String[] scanSsids = {"test1", "test2"}; 295 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 296 int[] freqs = {2470, 2437}; 297 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 298 int[] levels = {-56, -45}; 299 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""}; 300 int[] securities = {SECURITY_PSK, SECURITY_PSK}; 301 boolean[] appInteractions = {true, true}; 302 boolean[] meteredness = {true, true}; 303 int[] priorities = {5, 1}; 304 int[] uids = {TEST_UID, TEST_UID}; 305 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE}; 306 boolean[] autojoin = {true, true}; 307 boolean[] shareWithUser = {true, true}; 308 int[] priorityGroup = {1, 1}; 309 310 ScanDetail[] scanDetails = 311 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 312 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 313 securities, appInteractions, meteredness, priorities, uids, 314 packageNames, autojoin, shareWithUser, priorityGroup); 315 // Link the scan result with suggestions. 316 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 317 // setup config manager interactions. 318 setupAddToWifiConfigManager(suggestions[0], suggestions[1]); 319 320 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 321 mNetworkSuggestionNominator.nominateNetworks( 322 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 323 Collections.emptySet(), 324 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 325 connectableNetworks.add(Pair.create(scanDetail, configuration)); 326 }); 327 328 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 329 verify(mWifiMetrics, never()) 330 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 331 } 332 333 /** 334 * Ensure that we nominate the network suggestion corresponding to the scan result with 335 * higest priority from each priority group within same suggestor app. 336 * Expected connectable Networks: {suggestionSsids[0], suggestionSsids[2]} 337 */ 338 @Test testSelectNetworkSuggestionForMultipleMatchHighPriorityFromEachPriorityGroupWins()339 public void testSelectNetworkSuggestionForMultipleMatchHighPriorityFromEachPriorityGroupWins() { 340 String[] scanSsids = {"test1", "test2", "test3", "test4"}; 341 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:f3:7f:ae:8c:f5", 342 "6c:f3:7f:ae:8c:f6"}; 343 int[] freqs = {2470, 2437, 2470, 2437}; 344 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]", 345 "[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 346 int[] levels = {-56, -45, -44, -43}; 347 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\"", 348 "\"" + scanSsids[2] + "\"", "\"" + scanSsids[3] + "\""}; 349 int[] securities = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 350 boolean[] appInteractions = {true, true, true, true}; 351 boolean[] meteredness = {false, false, false, false}; 352 int[] priorities = {5, 4, 3, 1}; 353 int[] uids = {TEST_UID, TEST_UID, TEST_UID, TEST_UID}; 354 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE}; 355 boolean[] autojoin = {true, true, true, true}; 356 boolean[] shareWithUser = {true, true, true, true}; 357 int[] priorityGroup = {0, 0 , 1 , 1}; 358 359 ScanDetail[] scanDetails = 360 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 361 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 362 securities, appInteractions, meteredness, priorities, uids, 363 packageNames, autojoin, shareWithUser, priorityGroup); 364 365 // Link the scan result with suggestions. 366 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 367 // setup config manager interactions. 368 setupAddToWifiConfigManager(suggestions[0], suggestions[1], suggestions[2], suggestions[3]); 369 370 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 371 mNetworkSuggestionNominator.nominateNetworks( 372 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 373 Collections.emptySet(), 374 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 375 connectableNetworks.add(Pair.create(scanDetail, configuration)); 376 }); 377 378 validateConnectableNetworks(connectableNetworks, scanSsids[0], scanSsids[2]); 379 verify(mWifiMetrics, never()) 380 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 381 } 382 383 /** 384 * Ensure that we nominate all profiles when multiple suggestor suggested same network. 385 * 386 * Expected connectable Networks: {suggestionSsids[0], suggestionSsids[1], suggestionSsids[2]} 387 */ 388 @Test testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestions()389 public void testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestions() { 390 String[] scanSsids = {"test1", "test2"}; 391 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 392 int[] freqs = {2470, 2437}; 393 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 394 int[] levels = {-23, -45}; 395 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\"", 396 "\"" + scanSsids[1] + "\""}; 397 int[] securities = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 398 boolean[] appInteractions = {true, true, false}; 399 boolean[] meteredness = {true, true, false}; 400 int[] priorities = {-1, -1, -1}; 401 int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER}; 402 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER}; 403 boolean[] autojoin = {true, true, true}; 404 boolean[] shareWithUser = {true, true, true}; 405 int[] priorityGroup = {0, 0, 0}; 406 407 ScanDetail[] scanDetails = 408 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 409 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 410 securities, appInteractions, meteredness, priorities, uids, 411 packageNames, autojoin, shareWithUser, priorityGroup); 412 // Link the scan result with suggestions. 413 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 414 // setup config manager interactions. 415 setupAddToWifiConfigManager(suggestions[0], suggestions[1], suggestions[2]); 416 417 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 418 mNetworkSuggestionNominator.nominateNetworks( 419 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 420 Collections.emptySet(), 421 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 422 connectableNetworks.add(Pair.create(scanDetail, configuration)); 423 }); 424 425 validateConnectableNetworks(connectableNetworks, scanSsids[0], scanSsids[1], scanSsids[1]); 426 verify(mWifiMetrics).incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 427 } 428 429 /** 430 * Ensure that we nominate the network suggestion with the higest priority among network 431 * suggestions from the same package. Among different packages, nominate all the suggestion 432 * corresponding to the scan result. 433 * 434 * The suggestion[1] has higher priority than suggestion[0]. 435 * 436 * Expected connectable Networks: {suggestionSsids[1], 437 * (suggestionSsids[2], 438 * suggestionSsids[3]} 439 */ 440 @Test 441 public void testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestionsHighPriorityWins()442 testSelectNetworkSuggestionForMultipleMatchWithMultipleSuggestionsHighPriorityWins() { 443 String[] scanSsids = {"test1", "test2", "test3", "test4"}; 444 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4", "6c:fc:de:34:12", 445 "6c:fd:a1:11:11:98"}; 446 int[] freqs = {2470, 2437, 2470, 2437}; 447 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]", 448 "[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 449 int[] levels = {-23, -45, -56, -65}; 450 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\"", 451 "\"" + scanSsids[2] + "\"", "\"" + scanSsids[3] + "\""}; 452 int[] securities = {SECURITY_PSK, SECURITY_PSK, SECURITY_PSK, SECURITY_PSK}; 453 boolean[] appInteractions = {true, true, false, false}; 454 boolean[] meteredness = {true, true, false, false}; 455 int[] priorities = {0, 5, -1, -1}; 456 int[] uids = {TEST_UID, TEST_UID, TEST_UID_OTHER, TEST_UID_OTHER}; 457 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE, TEST_PACKAGE_OTHER, 458 TEST_PACKAGE_OTHER}; 459 boolean[] autojoin = {true, true, true, true}; 460 boolean[] shareWithUser = {true, true, true, true}; 461 int[] priorityGroup = {0, 0, 0, 0}; 462 463 ScanDetail[] scanDetails = 464 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 465 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 466 securities, appInteractions, meteredness, priorities, uids, 467 packageNames, autojoin, shareWithUser, priorityGroup); 468 // Link the scan result with suggestions. 469 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 470 // setup config manager interactions. 471 setupAddToWifiConfigManager(suggestions[0], suggestions[1], suggestions[2], suggestions[3]); 472 473 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 474 mNetworkSuggestionNominator.nominateNetworks( 475 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 476 Collections.emptySet(), 477 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 478 connectableNetworks.add(Pair.create(scanDetail, configuration)); 479 }); 480 481 validateConnectableNetworks(connectableNetworks, scanSsids[1], scanSsids[2], scanSsids[3]); 482 verify(mWifiMetrics, never()) 483 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 484 } 485 486 /** 487 * Ensure that we nominate no candidate if the only matching network suggestion, but we failed 488 * the {@link WifiConfigManager} interactions. 489 * 490 * Expected connectable Networks: {} 491 */ 492 @Test testSelectNetworkSuggestionForOneMatchButInToWifiConfigManager()493 public void testSelectNetworkSuggestionForOneMatchButInToWifiConfigManager() { 494 String[] scanSsids = {"test1", "test2"}; 495 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 496 int[] freqs = {2470, 2437}; 497 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 498 int[] levels = {-67, -76}; 499 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 500 int[] securities = {SECURITY_PSK}; 501 boolean[] appInteractions = {true}; 502 boolean[] meteredness = {true}; 503 int[] priorities = {-1}; 504 int[] uids = {TEST_UID}; 505 String[] packageNames = {TEST_PACKAGE}; 506 boolean[] autojoin = {true}; 507 boolean[] shareWithUser = {true}; 508 int[] priorityGroup = {1}; 509 510 ScanDetail[] scanDetails = 511 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 512 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 513 securities, appInteractions, meteredness, priorities, uids, 514 packageNames, autojoin, shareWithUser, priorityGroup); 515 // Link the scan result with suggestions. 516 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 517 518 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 519 mNetworkSuggestionNominator.nominateNetworks( 520 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 521 Collections.emptySet(), 522 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 523 connectableNetworks.add(Pair.create(scanDetail, configuration)); 524 }); 525 526 assertTrue(connectableNetworks.isEmpty()); 527 528 verify(mWifiConfigManager).getConfiguredNetwork(eq(suggestions[0] 529 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getProfileKey())); 530 // Verify we did not try to add any new networks or other interactions with 531 // WifiConfigManager. 532 verifyNoMoreInteractions(mWifiConfigManager); 533 verify(mWifiMetrics, never()) 534 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 535 } 536 537 /** 538 * Ensure that we nominate the only matching network suggestion, but that matches an existing 539 * saved network (maybe saved or maybe it exists from a previous connection attempt) . 540 * 541 * Expected connectable Networks: {suggestionSsids[0]} 542 */ 543 @Test testSelectNetworkSuggestionForOneMatchForExistingNetwork()544 public void testSelectNetworkSuggestionForOneMatchForExistingNetwork() { 545 String[] scanSsids = {"test1", "test2"}; 546 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 547 int[] freqs = {2470, 2437}; 548 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 549 int[] levels = {-67, -76}; 550 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 551 int[] securities = {SECURITY_PSK}; 552 boolean[] appInteractions = {true}; 553 boolean[] meteredness = {true}; 554 int[] priorities = {-1}; 555 int[] uids = {TEST_UID}; 556 String[] packageNames = {TEST_PACKAGE}; 557 boolean[] autojoin = {true}; 558 boolean[] shareWithUser = {true}; 559 int[] priorityGroup = {0}; 560 561 ScanDetail[] scanDetails = 562 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 563 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 564 securities, appInteractions, meteredness, priorities, uids, 565 packageNames, autojoin, shareWithUser, priorityGroup); 566 // Link the scan result with suggestions. 567 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 568 // setup config manager interactions. 569 suggestions[0].wns.wifiConfiguration.fromWifiNetworkSuggestion = true; 570 suggestions[0].wns.wifiConfiguration.ephemeral = true; 571 setupAddToWifiConfigManager(suggestions[0]); 572 // Existing saved network matching the credentials. 573 when(mWifiConfigManager.getConfiguredNetwork(suggestions[0] 574 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getKey())) 575 .thenReturn(suggestions[0].wns.wifiConfiguration); 576 577 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 578 mNetworkSuggestionNominator.nominateNetworks( 579 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 580 Collections.emptySet(), 581 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 582 connectableNetworks.add(Pair.create(scanDetail, configuration)); 583 }); 584 585 validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]}); 586 587 // check for any saved networks. 588 verify(mWifiConfigManager, times(suggestionSsids.length)) 589 .isNetworkTemporarilyDisabledByUser(anyString()); 590 verify(mWifiConfigManager).getConfiguredNetwork(suggestions[0] 591 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getProfileKey()); 592 verify(mWifiConfigManager).isNonCarrierMergedNetworkTemporarilyDisabled(any()); 593 if (SdkLevel.isAtLeastS()) { 594 verify(mWifiConfigManager).getConfiguredNetwork(suggestions[0] 595 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getKey()); 596 } 597 // Verify we did not try to add any new networks or other interactions with 598 // WifiConfigManager. 599 verifyNoMoreInteractions(mWifiConfigManager); 600 if (SdkLevel.isAtLeastS()) { 601 verify(mWifiMetrics).addSuggestionExistsForSavedNetwork( 602 suggestions[0].wns.wifiConfiguration.getKey()); 603 } 604 } 605 606 /** 607 * Ensure that we don't nominate the only matching network suggestion if it was previously 608 * disabled by the user. 609 * 610 * Expected connectable Networks: {} 611 */ 612 @Test testSelectNetworkSuggestionForOneMatchButUserForgotTheNetwork()613 public void testSelectNetworkSuggestionForOneMatchButUserForgotTheNetwork() { 614 String[] scanSsids = {"test1", "test2"}; 615 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 616 int[] freqs = {2470, 2437}; 617 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 618 int[] levels = {-67, -76}; 619 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 620 int[] securities = {SECURITY_PSK}; 621 boolean[] appInteractions = {true}; 622 boolean[] meteredness = {true}; 623 int[] priorities = {-1}; 624 int[] uids = {TEST_UID}; 625 String[] packageNames = {TEST_PACKAGE}; 626 boolean[] autojoin = {true}; 627 boolean[] shareWithUser = {true}; 628 int[] priorityGroup = {0}; 629 630 ScanDetail[] scanDetails = 631 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 632 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 633 securities, appInteractions, meteredness, priorities, uids, 634 packageNames, autojoin, shareWithUser, priorityGroup); 635 // Link the scan result with suggestions. 636 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 637 // setup config manager interactions. 638 setupAddToWifiConfigManager(suggestions[0]); 639 // Network was disabled by the user. 640 when(mWifiConfigManager.isNetworkTemporarilyDisabledByUser(suggestionSsids[0])) 641 .thenReturn(true); 642 643 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 644 mNetworkSuggestionNominator.nominateNetworks( 645 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 646 Collections.emptySet(), 647 (ScanDetail scanDetail, WifiConfiguration configuration) -> 648 connectableNetworks.add(Pair.create(scanDetail, configuration))); 649 650 assertTrue(connectableNetworks.isEmpty()); 651 652 verify(mWifiConfigManager, times(suggestionSsids.length)) 653 .isNetworkTemporarilyDisabledByUser(anyString()); 654 verify(mWifiMetrics, never()) 655 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 656 } 657 658 /** 659 * Ensure that we don't nominate the only matching network suggestion if the network 660 * configuration already exists (maybe saved or maybe it exists from a previous connection 661 * attempt) and blacklisted. 662 * 663 * Expected connectable Networks: {} 664 */ 665 @Test testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisabled()666 public void testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisabled() { 667 String[] scanSsids = {"test1", "test2"}; 668 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 669 int[] freqs = {2470, 2437}; 670 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 671 int[] levels = {-67, -76}; 672 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 673 int[] securities = {SECURITY_PSK}; 674 boolean[] appInteractions = {true}; 675 boolean[] meteredness = {true}; 676 int[] priorities = {-1}; 677 int[] uids = {TEST_UID}; 678 String[] packageNames = {TEST_PACKAGE}; 679 boolean[] autojoin = {true}; 680 boolean[] shareWithUser = {true}; 681 int[] priorityGroup = {0}; 682 683 ScanDetail[] scanDetails = 684 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 685 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 686 securities, appInteractions, meteredness, priorities, uids, 687 packageNames, autojoin, shareWithUser, priorityGroup); 688 // Link the scan result with suggestions. 689 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 690 // Mark the network disabled. 691 suggestions[0].wns.wifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus( 692 NETWORK_SELECTION_TEMPORARY_DISABLED); 693 // setup config manager interactions. 694 setupAddToWifiConfigManager(suggestions[0]); 695 696 // Existing network matching the credentials. 697 when(mWifiConfigManager.getConfiguredNetwork(suggestions[0] 698 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getProfileKey())) 699 .thenReturn(suggestions[0].wns.wifiConfiguration); 700 701 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 702 mNetworkSuggestionNominator.nominateNetworks( 703 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 704 Collections.emptySet(), 705 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 706 connectableNetworks.add(Pair.create(scanDetail, configuration)); 707 }); 708 709 assertTrue(connectableNetworks.isEmpty()); 710 verify(mWifiConfigManager).getConfiguredNetwork(eq( 711 suggestions[0].wns.wifiConfiguration.getProfileKey())); 712 verify(mWifiConfigManager).tryEnableNetwork(eq( 713 suggestions[0].wns.wifiConfiguration.networkId)); 714 if (SdkLevel.isAtLeastS()) { 715 verify(mWifiConfigManager).getConfiguredNetwork(eq( 716 suggestions[0].wns.wifiConfiguration.getKey())); 717 } 718 // Verify we did not try to add any new networks or other interactions with 719 // WifiConfigManager. 720 verifyNoMoreInteractions(mWifiConfigManager); 721 verify(mWifiMetrics, never()) 722 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 723 } 724 725 /** 726 * Ensure that we do nominate the only matching network suggestion if the network configuration 727 * already exists (maybe saved or maybe it exists from a previous connection attempt) and a 728 * temporary blacklist expired. 729 * 730 * Expected connectable Networks: {suggestionSsids[0]} 731 */ 732 @Test testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisableExpired()733 public void testSelectNetworkSuggestionForOneMatchForExistingNetworkButTempDisableExpired() { 734 String[] scanSsids = {"test1", "test2"}; 735 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 736 int[] freqs = {2470, 2437}; 737 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 738 int[] levels = {-67, -76}; 739 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 740 int[] securities = {SECURITY_PSK}; 741 boolean[] appInteractions = {true}; 742 boolean[] meteredness = {true}; 743 int[] priorities = {-1}; 744 int[] uids = {TEST_UID}; 745 String[] packageNames = {TEST_PACKAGE}; 746 boolean[] autojoin = {true}; 747 boolean[] shareWithUser = {true}; 748 int[] priorityGroup = {0}; 749 750 ScanDetail[] scanDetails = 751 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 752 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 753 securities, appInteractions, meteredness, priorities, uids, 754 packageNames, autojoin, shareWithUser, priorityGroup); 755 // Link the scan result with suggestions. 756 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 757 // setup config manager interactions. 758 suggestions[0].wns.wifiConfiguration.fromWifiNetworkSuggestion = true; 759 suggestions[0].wns.wifiConfiguration.ephemeral = true; 760 setupAddToWifiConfigManager(suggestions[0]); 761 // Mark the network disabled. 762 suggestions[0].wns.wifiConfiguration.getNetworkSelectionStatus().setNetworkSelectionStatus( 763 NETWORK_SELECTION_TEMPORARY_DISABLED); 764 // Existing network matching the credentials. 765 when(mWifiConfigManager.getConfiguredNetwork(suggestions[0] 766 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getProfileKey())) 767 .thenReturn(suggestions[0].wns.wifiConfiguration); 768 when(mWifiConfigManager.tryEnableNetwork(suggestions[0].wns.wifiConfiguration.networkId)) 769 .thenReturn(true); 770 771 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 772 mNetworkSuggestionNominator.nominateNetworks( 773 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 774 Collections.emptySet(), 775 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 776 connectableNetworks.add(Pair.create(scanDetail, configuration)); 777 }); 778 779 validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]}); 780 781 verify(mWifiConfigManager, times(suggestionSsids.length)) 782 .isNetworkTemporarilyDisabledByUser(anyString()); 783 verify(mWifiConfigManager).getConfiguredNetwork(eq(suggestions[0] 784 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getProfileKey())); 785 verify(mWifiConfigManager).tryEnableNetwork(eq( 786 suggestions[0].wns.wifiConfiguration.networkId)); 787 verify(mWifiConfigManager).isNonCarrierMergedNetworkTemporarilyDisabled(any()); 788 if (SdkLevel.isAtLeastS()) { 789 verify(mWifiConfigManager).getConfiguredNetwork(eq(suggestions[0] 790 .createInternalWifiConfiguration(mWifiCarrierInfoManager).getKey())); 791 } 792 // Verify we did not try to add any new networks or other interactions with 793 // WifiConfigManager. 794 verifyNoMoreInteractions(mWifiConfigManager); 795 verify(mWifiMetrics, never()) 796 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 797 } 798 799 /** 800 * Ensure that we do nominate the only matching passponit network suggestion. 801 * Expected connectable Networks: {suggestionSsids[0]} 802 */ 803 @Test testSuggestionPasspointNetworkCandidatesMatches()804 public void testSuggestionPasspointNetworkCandidatesMatches() { 805 String[] scanSsids = {"test1", "test2"}; 806 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 807 int[] freqs = {2470, 2437}; 808 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 809 int[] levels = {-67, -76}; 810 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 811 int[] securities = {SECURITY_PSK}; 812 boolean[] appInteractions = {true}; 813 boolean[] meteredness = {true}; 814 int[] priorities = {-1}; 815 int[] uids = {TEST_UID}; 816 String[] packageNames = {TEST_PACKAGE}; 817 boolean[] autojoin = {true}; 818 boolean[] shareWithUser = {true}; 819 int[] priorityGroup = {0}; 820 821 ScanDetail[] scanDetails = 822 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 823 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 824 securities, appInteractions, meteredness, priorities, uids, packageNames, 825 autojoin, shareWithUser, priorityGroup); 826 HashSet<ExtendedWifiNetworkSuggestion> matchedExtSuggestions = new HashSet<>(); 827 matchedExtSuggestions.add(suggestions[0]); 828 List<Pair<ScanDetail, WifiConfiguration>> passpointCandidates = new ArrayList<>(); 829 suggestions[0].wns.wifiConfiguration.FQDN = TEST_FQDN; 830 suggestions[0].wns.wifiConfiguration.setPasspointUniqueId(PASSPOINT_UNIQUE_ID); 831 832 passpointCandidates.add(Pair.create(scanDetails[0], 833 suggestions[0].createInternalWifiConfiguration(mWifiCarrierInfoManager))); 834 when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForFqdn(TEST_FQDN)) 835 .thenReturn(matchedExtSuggestions); 836 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 837 mNetworkSuggestionNominator.nominateNetworks( 838 Arrays.asList(scanDetails), passpointCandidates, false, false, false, 839 Collections.emptySet(), 840 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 841 connectableNetworks.add(Pair.create(scanDetail, configuration)); 842 }); 843 assertEquals(1, connectableNetworks.size()); 844 validateConnectableNetworks(connectableNetworks, new String[] {scanSsids[0]}); 845 verify(mWifiMetrics, never()) 846 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 847 } 848 849 /** 850 * Ensure that we don't nominate the only matching passponit network suggestion when it's not 851 * approved. 852 * Expected connectable Networks: {} 853 */ 854 @Test testSuggestionPasspointNetworkCandidatesNoApprovedMatches()855 public void testSuggestionPasspointNetworkCandidatesNoApprovedMatches() { 856 String[] scanSsids = {"test1", "test2"}; 857 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 858 int[] freqs = {2470, 2437}; 859 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 860 int[] levels = {-67, -76}; 861 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 862 int[] securities = {SECURITY_PSK}; 863 boolean[] appInteractions = {true}; 864 boolean[] meteredness = {true}; 865 int[] priorities = {-1}; 866 int[] uids = {TEST_UID}; 867 String[] packageNames = {TEST_PACKAGE}; 868 boolean[] autojoin = {true}; 869 boolean[] shareWithUser = {true}; 870 int[] priorityGroup = {0}; 871 872 ScanDetail[] scanDetails = 873 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 874 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 875 securities, appInteractions, meteredness, priorities, uids, packageNames, 876 autojoin, shareWithUser, priorityGroup); 877 HashSet<ExtendedWifiNetworkSuggestion> matchedExtSuggestions = new HashSet<>(); 878 matchedExtSuggestions.add(suggestions[0]); 879 List<Pair<ScanDetail, WifiConfiguration>> passpointCandidates = new ArrayList<>(); 880 suggestions[0].wns.wifiConfiguration.FQDN = TEST_FQDN; 881 suggestions[0].wns.wifiConfiguration.setPasspointUniqueId(PASSPOINT_UNIQUE_ID); 882 883 passpointCandidates.add(Pair.create(scanDetails[0], 884 suggestions[0].createInternalWifiConfiguration(mWifiCarrierInfoManager))); 885 // As user haven't approved this suggestion, return null 886 when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForFqdn(TEST_FQDN)) 887 .thenReturn(Set.of()); 888 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 889 mNetworkSuggestionNominator.nominateNetworks( 890 Arrays.asList(scanDetails), passpointCandidates, false, false, false, 891 Collections.emptySet(), 892 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 893 connectableNetworks.add(Pair.create(scanDetail, configuration)); 894 }); 895 assertTrue(connectableNetworks.isEmpty()); 896 verify(mWifiMetrics, never()) 897 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 898 } 899 900 /** 901 * Ensure that we will not nominate the matching network suggestions which auto-join is 902 * disabled. 903 * Expected connectable Networks: {} 904 */ 905 @Test testSelectNetworkSuggestionForOneMatchButAutojoinDisabled()906 public void testSelectNetworkSuggestionForOneMatchButAutojoinDisabled() { 907 String[] scanSsids = {"test1", "test2"}; 908 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 909 int[] freqs = {2470, 2437}; 910 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 911 int[] levels = {-67, -76}; 912 String[] suggestionSsids = {"\"" + scanSsids[0] + "\"", "\"" + scanSsids[1] + "\""}; 913 int[] securities = {SECURITY_PSK, SECURITY_PSK}; 914 boolean[] appInteractions = {true, true}; 915 boolean[] meteredness = {true, true}; 916 int[] priorities = {-1, -1}; 917 int[] uids = {TEST_UID, TEST_UID}; 918 String[] packageNames = {TEST_PACKAGE, TEST_PACKAGE}; 919 boolean[] autojoin = {false, false}; 920 boolean[] shareWithUser = {true, false}; 921 int[] priorityGroup = {0, 0}; 922 923 ScanDetail[] scanDetails = 924 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 925 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 926 securities, appInteractions, meteredness, priorities, uids, 927 packageNames, autojoin, shareWithUser, priorityGroup); 928 // Link the scan result with suggestions. 929 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 930 // setup config manager interactions. 931 setupAddToWifiConfigManager(suggestions[0], suggestions[1]); 932 933 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 934 mNetworkSuggestionNominator.nominateNetworks( 935 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 936 Collections.emptySet(), 937 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 938 connectableNetworks.add(Pair.create(scanDetail, configuration)); 939 }); 940 941 // Verify no network is nominated. 942 assertTrue(connectableNetworks.isEmpty()); 943 verify(mWifiMetrics, never()) 944 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 945 } 946 947 @Test testSelectNetworkSuggestionForOneMatchCarrierNetworkWithNoSim()948 public void testSelectNetworkSuggestionForOneMatchCarrierNetworkWithNoSim() { 949 String[] scanSsids = {"test1"}; 950 String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 951 int[] freqs = {2470}; 952 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]"}; 953 int[] levels = {-67}; 954 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 955 int[] securities = {SECURITY_EAP}; 956 boolean[] appInteractions = {true}; 957 boolean[] meteredness = {true}; 958 int[] priorities = {-1}; 959 int[] uids = {TEST_UID}; 960 String[] packageNames = {TEST_PACKAGE}; 961 boolean[] autojoin = {true}; 962 boolean[] shareWithUser = {true}; 963 int[] priorityGroup = {0}; 964 965 ScanDetail[] scanDetails = 966 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 967 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 968 securities, appInteractions, meteredness, priorities, uids, 969 packageNames, autojoin, shareWithUser, priorityGroup); 970 suggestions[0].wns.wifiConfiguration.carrierId = TEST_CARRIER_ID; 971 when(mWifiCarrierInfoManager 972 .getBestMatchSubscriptionId(suggestions[0].wns.wifiConfiguration)) 973 .thenReturn(TEST_SUB_ID); 974 when(mWifiCarrierInfoManager.isSimReady(TEST_SUB_ID)).thenReturn(false); 975 // Link the scan result with suggestions. 976 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 977 // setup config manager interactions. 978 setupAddToWifiConfigManager(suggestions[0]); 979 980 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 981 mNetworkSuggestionNominator.nominateNetworks( 982 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 983 Collections.emptySet(), 984 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 985 connectableNetworks.add(Pair.create(scanDetail, configuration)); 986 }); 987 988 // Verify no network is nominated. 989 assertTrue(connectableNetworks.isEmpty()); 990 verify(mWifiMetrics, never()) 991 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 992 } 993 994 @Test testSelectNetworkSuggestionForOneMatchSimBasedWithEncryptionInfoNotAvailabele()995 public void testSelectNetworkSuggestionForOneMatchSimBasedWithEncryptionInfoNotAvailabele() { 996 String[] scanSsids = {"test1"}; 997 String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 998 int[] freqs = {2470}; 999 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]"}; 1000 int[] levels = {-67}; 1001 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1002 int[] securities = {SECURITY_EAP}; 1003 boolean[] appInteractions = {true}; 1004 boolean[] meteredness = {true}; 1005 int[] priorities = {-1}; 1006 int[] uids = {TEST_UID}; 1007 String[] packageNames = {TEST_PACKAGE}; 1008 boolean[] autojoin = {true}; 1009 boolean[] shareWithUser = {true}; 1010 int[] priorityGroup = {0}; 1011 1012 ScanDetail[] scanDetails = 1013 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1014 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1015 securities, appInteractions, meteredness, priorities, uids, 1016 packageNames, autojoin, shareWithUser, priorityGroup); 1017 WifiConfiguration eapSimConfig = suggestions[0].wns.wifiConfiguration; 1018 eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); 1019 eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); 1020 eapSimConfig.carrierId = TEST_CARRIER_ID; 1021 when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(eapSimConfig)) 1022 .thenReturn(TEST_SUB_ID); 1023 when(mWifiCarrierInfoManager.isSimReady(TEST_SUB_ID)).thenReturn(true); 1024 when(mWifiCarrierInfoManager.requiresImsiEncryption(TEST_SUB_ID)).thenReturn(true); 1025 when(mWifiCarrierInfoManager.isImsiEncryptionInfoAvailable(TEST_SUB_ID)).thenReturn(false); 1026 // Link the scan result with suggestions. 1027 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1028 // setup config manager interactions. 1029 setupAddToWifiConfigManager(suggestions[0]); 1030 1031 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1032 mNetworkSuggestionNominator.nominateNetworks( 1033 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1034 Collections.emptySet(), 1035 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1036 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1037 }); 1038 1039 // Verify no network is nominated. 1040 assertTrue(connectableNetworks.isEmpty()); 1041 verify(mWifiMetrics, never()) 1042 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1043 } 1044 1045 @Test testSelectNetworkSuggestionForOneMatchSimBasedWithOobPseudonymInfoAvailable()1046 public void testSelectNetworkSuggestionForOneMatchSimBasedWithOobPseudonymInfoAvailable() { 1047 String[] scanSsids = {"test1"}; 1048 String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 1049 int[] freqs = {2470}; 1050 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]"}; 1051 int[] levels = {-67}; 1052 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1053 int[] securities = {SECURITY_EAP}; 1054 boolean[] appInteractions = {true}; 1055 boolean[] meteredness = {true}; 1056 int[] priorities = {-1}; 1057 int[] uids = {TEST_UID}; 1058 String[] packageNames = {TEST_PACKAGE}; 1059 boolean[] autojoin = {true}; 1060 boolean[] shareWithUser = {true}; 1061 int[] priorityGroup = {0}; 1062 1063 ScanDetail[] scanDetails = 1064 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1065 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1066 securities, appInteractions, meteredness, priorities, uids, 1067 packageNames, autojoin, shareWithUser, priorityGroup); 1068 WifiConfiguration eapSimConfig = suggestions[0].wns.wifiConfiguration; 1069 eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); 1070 eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); 1071 eapSimConfig.carrierId = TEST_CARRIER_ID; 1072 eapSimConfig.subscriptionId = TEST_SUB_ID; 1073 when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(any())).thenReturn(TEST_SUB_ID); 1074 when(mWifiCarrierInfoManager.isSimReady(TEST_SUB_ID)).thenReturn(true); 1075 when(mWifiCarrierInfoManager.isCarrierNetworkOffloadEnabled(anyInt(), anyBoolean())) 1076 .thenReturn(true); 1077 when(mWifiCarrierInfoManager.isOobPseudonymFeatureEnabled(TEST_CARRIER_ID)) 1078 .thenReturn(true); 1079 PseudonymInfo mockPseudonymInfo = mock(PseudonymInfo.class); 1080 when(mWifiPseudonymManager.getValidPseudonymInfo(anyInt())) 1081 .thenReturn(Optional.of(mockPseudonymInfo)); 1082 // Link the scan result with suggestions. 1083 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1084 // setup config manager interactions. 1085 setupAddToWifiConfigManager(suggestions[0]); 1086 1087 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1088 mNetworkSuggestionNominator.nominateNetworks( 1089 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1090 Collections.emptySet(), 1091 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1092 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1093 }); 1094 1095 verify(mWifiPseudonymManager).updateWifiConfiguration(any()); 1096 assertEquals(1, connectableNetworks.size()); 1097 } 1098 1099 @Test testSelectNetworkSuggestionForOneMatchSimBasedWithOobPseudonymIsNotAvailable()1100 public void testSelectNetworkSuggestionForOneMatchSimBasedWithOobPseudonymIsNotAvailable() { 1101 String[] scanSsids = {"test1"}; 1102 String[] bssids = {"6c:f3:7f:ae:8c:f3"}; 1103 int[] freqs = {2470}; 1104 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]"}; 1105 int[] levels = {-67}; 1106 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1107 int[] securities = {SECURITY_EAP}; 1108 boolean[] appInteractions = {true}; 1109 boolean[] meteredness = {true}; 1110 int[] priorities = {-1}; 1111 int[] uids = {TEST_UID}; 1112 String[] packageNames = {TEST_PACKAGE}; 1113 boolean[] autojoin = {true}; 1114 boolean[] shareWithUser = {true}; 1115 int[] priorityGroup = {0}; 1116 1117 ScanDetail[] scanDetails = 1118 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1119 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1120 securities, appInteractions, meteredness, priorities, uids, 1121 packageNames, autojoin, shareWithUser, priorityGroup); 1122 WifiConfiguration eapSimConfig = suggestions[0].wns.wifiConfiguration; 1123 eapSimConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM); 1124 eapSimConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE); 1125 eapSimConfig.carrierId = TEST_CARRIER_ID; 1126 eapSimConfig.subscriptionId = TEST_SUB_ID; 1127 when(mWifiCarrierInfoManager.getBestMatchSubscriptionId(any())).thenReturn(TEST_SUB_ID); 1128 when(mWifiCarrierInfoManager.isSimReady(TEST_SUB_ID)).thenReturn(true); 1129 when(mWifiCarrierInfoManager.isCarrierNetworkOffloadEnabled(anyInt(), anyBoolean())) 1130 .thenReturn(true); 1131 when(mWifiCarrierInfoManager.isOobPseudonymFeatureEnabled(TEST_CARRIER_ID)) 1132 .thenReturn(true); 1133 when(mWifiPseudonymManager.getValidPseudonymInfo(anyInt())).thenReturn(Optional.empty()); 1134 // Link the scan result with suggestions. 1135 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1136 // setup config manager interactions. 1137 setupAddToWifiConfigManager(suggestions[0]); 1138 1139 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1140 mNetworkSuggestionNominator.nominateNetworks( 1141 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1142 Collections.emptySet(), 1143 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1144 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1145 }); 1146 1147 // Verify no network is nominated. 1148 assertTrue(connectableNetworks.isEmpty()); 1149 verify(mWifiPseudonymManager).retrievePseudonymOnFailureTimeoutExpired(any()); 1150 verify(mWifiMetrics, never()) 1151 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1152 } 1153 1154 /** 1155 * Ensure that we nominate no matching network suggestion. 1156 * Because the only matched suggestion is untrusted and untrusted is not allowed 1157 * Expected connectable Networks: {} 1158 */ 1159 @Test testSelectNetworkSuggestionForOneMatchUntrustedNotAllow()1160 public void testSelectNetworkSuggestionForOneMatchUntrustedNotAllow() { 1161 String[] scanSsids = {"test1", "test2"}; 1162 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1163 int[] freqs = {2470, 2437}; 1164 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1165 int[] levels = {-67, -76}; 1166 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1167 int[] securities = {SECURITY_PSK}; 1168 boolean[] appInteractions = {true}; 1169 boolean[] meteredness = {true}; 1170 int[] priorities = {-1}; 1171 int[] uids = {TEST_UID}; 1172 String[] packageNames = {TEST_PACKAGE}; 1173 boolean[] autojoin = {true}; 1174 boolean[] shareWithUser = {true}; 1175 int[] priorityGroup = {0}; 1176 1177 ScanDetail[] scanDetails = 1178 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1179 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1180 securities, appInteractions, meteredness, priorities, uids, 1181 packageNames, autojoin, shareWithUser, priorityGroup); 1182 suggestions[0].wns.wifiConfiguration.trusted = false; 1183 // Link the scan result with suggestions. 1184 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1185 1186 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1187 mNetworkSuggestionNominator.nominateNetworks( 1188 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1189 Collections.emptySet(), 1190 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1191 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1192 }); 1193 1194 assertTrue(connectableNetworks.isEmpty()); 1195 verify(mWifiMetrics, never()) 1196 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1197 } 1198 1199 /** 1200 * Ensure that we nominate the one matching network suggestion. 1201 * Because the only matched suggestion is untrusted and untrusted is allowed 1202 * Expected connectable Networks: {suggestionSsids[0]} 1203 */ 1204 @Test testSelectNetworkSuggestionForOneMatchUntrustedAllow()1205 public void testSelectNetworkSuggestionForOneMatchUntrustedAllow() { 1206 String[] scanSsids = {"test1", "test2"}; 1207 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1208 int[] freqs = {2470, 2437}; 1209 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1210 int[] levels = {-67, -76}; 1211 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1212 int[] securities = {SECURITY_PSK}; 1213 boolean[] appInteractions = {true}; 1214 boolean[] meteredness = {true}; 1215 int[] priorities = {-1}; 1216 int[] uids = {TEST_UID}; 1217 String[] packageNames = {TEST_PACKAGE}; 1218 boolean[] autojoin = {true}; 1219 boolean[] shareWithUser = {true}; 1220 int[] priorityGroup = {0}; 1221 1222 ScanDetail[] scanDetails = 1223 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1224 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1225 securities, appInteractions, meteredness, priorities, uids, 1226 packageNames, autojoin, shareWithUser, priorityGroup); 1227 suggestions[0].wns.wifiConfiguration.trusted = false; 1228 // Link the scan result with suggestions. 1229 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1230 1231 setupAddToWifiConfigManager(suggestions[0]); 1232 1233 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1234 mNetworkSuggestionNominator.nominateNetworks( 1235 Arrays.asList(scanDetails), mPasspointCandidates, true, false, false, 1236 Collections.emptySet(), 1237 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1238 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1239 }); 1240 1241 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1242 verify(mWifiMetrics, never()) 1243 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1244 } 1245 1246 /** 1247 * Ensure that we nominate no matching network suggestion. 1248 * Because the only matched suggestion is oem paid and oem paid is not allowed 1249 * Expected connectable Networks: {} 1250 */ 1251 @Test testSelectNetworkSuggestionForOneMatchOemPaidNotAllow()1252 public void testSelectNetworkSuggestionForOneMatchOemPaidNotAllow() { 1253 String[] scanSsids = {"test1", "test2"}; 1254 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1255 int[] freqs = {2470, 2437}; 1256 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1257 int[] levels = {-67, -76}; 1258 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1259 int[] securities = {SECURITY_PSK}; 1260 boolean[] appInteractions = {true}; 1261 boolean[] meteredness = {true}; 1262 int[] priorities = {-1}; 1263 int[] uids = {TEST_UID}; 1264 String[] packageNames = {TEST_PACKAGE}; 1265 boolean[] autojoin = {true}; 1266 boolean[] shareWithUser = {true}; 1267 int[] priorityGroup = {0}; 1268 1269 ScanDetail[] scanDetails = 1270 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1271 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1272 securities, appInteractions, meteredness, priorities, uids, 1273 packageNames, autojoin, shareWithUser, priorityGroup); 1274 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1275 // Link the scan result with suggestions. 1276 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1277 1278 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1279 mNetworkSuggestionNominator.nominateNetworks( 1280 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1281 Collections.emptySet(), 1282 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1283 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1284 }); 1285 1286 assertTrue(connectableNetworks.isEmpty()); 1287 verify(mWifiMetrics, never()) 1288 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1289 } 1290 1291 1292 /** 1293 * Ensure that we nominate the one matching network suggestion. 1294 * Because the only matched suggestion is oem paid and oem paid is allowed 1295 * Expected connectable Networks: {suggestionSsids[0]} 1296 */ 1297 @Test testSelectNetworkSuggestionForOneMatchOemPaidAllow()1298 public void testSelectNetworkSuggestionForOneMatchOemPaidAllow() { 1299 String[] scanSsids = {"test1", "test2"}; 1300 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1301 int[] freqs = {2470, 2437}; 1302 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1303 int[] levels = {-67, -76}; 1304 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1305 int[] securities = {SECURITY_PSK}; 1306 boolean[] appInteractions = {true}; 1307 boolean[] meteredness = {true}; 1308 int[] priorities = {-1}; 1309 int[] uids = {TEST_UID}; 1310 String[] packageNames = {TEST_PACKAGE}; 1311 boolean[] autojoin = {true}; 1312 boolean[] shareWithUser = {true}; 1313 int[] priorityGroup = {0}; 1314 1315 ScanDetail[] scanDetails = 1316 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1317 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1318 securities, appInteractions, meteredness, priorities, uids, 1319 packageNames, autojoin, shareWithUser, priorityGroup); 1320 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1321 // Link the scan result with suggestions. 1322 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1323 1324 setupAddToWifiConfigManager(suggestions[0]); 1325 1326 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1327 mNetworkSuggestionNominator.nominateNetworks( 1328 Arrays.asList(scanDetails), mPasspointCandidates, false, true, false, 1329 Collections.emptySet(), 1330 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1331 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1332 }); 1333 1334 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1335 verify(mWifiMetrics, never()) 1336 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1337 } 1338 1339 /** 1340 * Ensure that we nominate no matching network suggestion. 1341 * Because the only matched suggestion is oem private and oem private is not allowed 1342 * Expected connectable Networks: {} 1343 */ 1344 @Test testSelectNetworkSuggestionForOneMatchOemPrivateNotAllow()1345 public void testSelectNetworkSuggestionForOneMatchOemPrivateNotAllow() { 1346 String[] scanSsids = {"test1", "test2"}; 1347 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1348 int[] freqs = {2470, 2437}; 1349 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1350 int[] levels = {-67, -76}; 1351 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1352 int[] securities = {SECURITY_PSK}; 1353 boolean[] appInteractions = {true}; 1354 boolean[] meteredness = {true}; 1355 int[] priorities = {-1}; 1356 int[] uids = {TEST_UID}; 1357 String[] packageNames = {TEST_PACKAGE}; 1358 boolean[] autojoin = {true}; 1359 boolean[] shareWithUser = {true}; 1360 int[] priorityGroup = {0}; 1361 1362 ScanDetail[] scanDetails = 1363 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1364 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1365 securities, appInteractions, meteredness, priorities, uids, 1366 packageNames, autojoin, shareWithUser, priorityGroup); 1367 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1368 // Link the scan result with suggestions. 1369 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1370 1371 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1372 mNetworkSuggestionNominator.nominateNetworks( 1373 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1374 Collections.emptySet(), 1375 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1376 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1377 }); 1378 1379 assertTrue(connectableNetworks.isEmpty()); 1380 verify(mWifiMetrics, never()) 1381 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1382 } 1383 1384 1385 /** 1386 * Ensure that we nominate the one matching network suggestion. 1387 * Because the only matched suggestion is oem private and oem private is allowed 1388 * Expected connectable Networks: {suggestionSsids[0]} 1389 */ 1390 @Test testSelectNetworkSuggestionForOneMatchOemPrivateAllow()1391 public void testSelectNetworkSuggestionForOneMatchOemPrivateAllow() { 1392 String[] scanSsids = {"test1", "test2"}; 1393 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1394 int[] freqs = {2470, 2437}; 1395 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1396 int[] levels = {-67, -76}; 1397 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1398 int[] securities = {SECURITY_PSK}; 1399 boolean[] appInteractions = {true}; 1400 boolean[] meteredness = {true}; 1401 int[] priorities = {-1}; 1402 int[] uids = {TEST_UID}; 1403 String[] packageNames = {TEST_PACKAGE}; 1404 boolean[] autojoin = {true}; 1405 boolean[] shareWithUser = {true}; 1406 int[] priorityGroup = {0}; 1407 1408 ScanDetail[] scanDetails = 1409 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1410 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1411 securities, appInteractions, meteredness, priorities, uids, 1412 packageNames, autojoin, shareWithUser, priorityGroup); 1413 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1414 // Link the scan result with suggestions. 1415 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1416 1417 setupAddToWifiConfigManager(suggestions[0]); 1418 1419 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1420 mNetworkSuggestionNominator.nominateNetworks( 1421 Arrays.asList(scanDetails), mPasspointCandidates, false, false, true, 1422 Collections.emptySet(), 1423 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1424 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1425 }); 1426 1427 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1428 verify(mWifiMetrics, never()) 1429 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1430 } 1431 1432 /** 1433 * Ensure that we nominate the one matching network suggestion. 1434 * Because the only matched suggestion has oem private & oem paid flags and both oem private and 1435 * oem paid is allowed. 1436 * Ensure that only the oemPaid flag is set in the candidate chosen to connect. 1437 * Expected connectable Networks: {suggestionSsids[0]} 1438 */ 1439 @Test 1440 public void testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAndOemPrivateAllow()1441 testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAndOemPrivateAllow() { 1442 String[] scanSsids = {"test1", "test2"}; 1443 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1444 int[] freqs = {2470, 2437}; 1445 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1446 int[] levels = {-67, -76}; 1447 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1448 int[] securities = {SECURITY_PSK}; 1449 boolean[] appInteractions = {true}; 1450 boolean[] meteredness = {true}; 1451 int[] priorities = {-1}; 1452 int[] uids = {TEST_UID}; 1453 String[] packageNames = {TEST_PACKAGE}; 1454 boolean[] autojoin = {true}; 1455 boolean[] shareWithUser = {true}; 1456 int[] priorityGroup = {0}; 1457 1458 ScanDetail[] scanDetails = 1459 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1460 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1461 securities, appInteractions, meteredness, priorities, uids, 1462 packageNames, autojoin, shareWithUser, priorityGroup); 1463 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1464 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1465 // Link the scan result with suggestions. 1466 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1467 1468 setupAddToWifiConfigManager(suggestions[0]); 1469 1470 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1471 mNetworkSuggestionNominator.nominateNetworks( 1472 Arrays.asList(scanDetails), mPasspointCandidates, false, true, true, 1473 Collections.emptySet(), 1474 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1475 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1476 }); 1477 1478 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1479 verify(mWifiMetrics, never()) 1480 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1481 } 1482 1483 /** 1484 * Ensure that we nominate no matching network suggestion. 1485 * Because the only matched suggestion has oem private & oem paid flags and both oem private and 1486 * oem paid is not allowed. 1487 * Expected connectable Networks: {} 1488 */ 1489 @Test 1490 public void testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAndOemPrivateNotAllow()1491 testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAndOemPrivateNotAllow() { 1492 String[] scanSsids = {"test1", "test2"}; 1493 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1494 int[] freqs = {2470, 2437}; 1495 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1496 int[] levels = {-67, -76}; 1497 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1498 int[] securities = {SECURITY_PSK}; 1499 boolean[] appInteractions = {true}; 1500 boolean[] meteredness = {true}; 1501 int[] priorities = {-1}; 1502 int[] uids = {TEST_UID}; 1503 String[] packageNames = {TEST_PACKAGE}; 1504 boolean[] autojoin = {true}; 1505 boolean[] shareWithUser = {true}; 1506 int[] priorityGroup = {0}; 1507 1508 ScanDetail[] scanDetails = 1509 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1510 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1511 securities, appInteractions, meteredness, priorities, uids, 1512 packageNames, autojoin, shareWithUser, priorityGroup); 1513 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1514 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1515 // Link the scan result with suggestions. 1516 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1517 1518 setupAddToWifiConfigManager(suggestions[0]); 1519 1520 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1521 mNetworkSuggestionNominator.nominateNetworks( 1522 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1523 Collections.emptySet(), 1524 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1525 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1526 }); 1527 1528 assertTrue(connectableNetworks.isEmpty()); 1529 verify(mWifiMetrics, never()) 1530 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1531 } 1532 1533 /** 1534 * Ensure that we nominate the one matching network suggestion. 1535 * Because the only matched suggestion has oem private & oem paid flags and only oem paid is 1536 * allowed. 1537 * Ensure that only the oemPaid flag is set in the candidate chosen to connect. 1538 * Expected connectable Networks: {suggestionSsids[0]} 1539 */ 1540 @Test 1541 public void testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAllow()1542 testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPaidAllow() { 1543 String[] scanSsids = {"test1", "test2"}; 1544 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1545 int[] freqs = {2470, 2437}; 1546 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1547 int[] levels = {-67, -76}; 1548 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1549 int[] securities = {SECURITY_PSK}; 1550 boolean[] appInteractions = {true}; 1551 boolean[] meteredness = {true}; 1552 int[] priorities = {-1}; 1553 int[] uids = {TEST_UID}; 1554 String[] packageNames = {TEST_PACKAGE}; 1555 boolean[] autojoin = {true}; 1556 boolean[] shareWithUser = {true}; 1557 int[] priorityGroup = {0}; 1558 1559 ScanDetail[] scanDetails = 1560 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1561 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1562 securities, appInteractions, meteredness, priorities, uids, 1563 packageNames, autojoin, shareWithUser, priorityGroup); 1564 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1565 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1566 // Link the scan result with suggestions. 1567 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1568 1569 setupAddToWifiConfigManager(suggestions[0]); 1570 1571 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1572 mNetworkSuggestionNominator.nominateNetworks( 1573 Arrays.asList(scanDetails), mPasspointCandidates, false, true, false, 1574 Collections.emptySet(), 1575 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1576 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1577 }); 1578 1579 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1580 verify(mWifiMetrics, never()) 1581 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1582 } 1583 1584 /** 1585 * Ensure that we nominate the one matching network suggestion. 1586 * Because the only matched suggestion has oem private & oem paid flags and only oem private is 1587 * allowed. 1588 * Ensure that only the oemPrivate flag is set in the candidate chosen to connect. 1589 * Expected connectable Networks: {suggestionSsids[0]} 1590 */ 1591 @Test 1592 public void testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPrivateAllow()1593 testSelectNetworkSuggestionForOneOemPaidAndOemPrivateMatchWithOemPrivateAllow() { 1594 String[] scanSsids = {"test1", "test2"}; 1595 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1596 int[] freqs = {2470, 2437}; 1597 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1598 int[] levels = {-67, -76}; 1599 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1600 int[] securities = {SECURITY_PSK}; 1601 boolean[] appInteractions = {true}; 1602 boolean[] meteredness = {true}; 1603 int[] priorities = {-1}; 1604 int[] uids = {TEST_UID}; 1605 String[] packageNames = {TEST_PACKAGE}; 1606 boolean[] autojoin = {true}; 1607 boolean[] shareWithUser = {true}; 1608 int[] priorityGroup = {0}; 1609 1610 ScanDetail[] scanDetails = 1611 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1612 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1613 securities, appInteractions, meteredness, priorities, uids, 1614 packageNames, autojoin, shareWithUser, priorityGroup); 1615 suggestions[0].wns.wifiConfiguration.oemPaid = true; 1616 suggestions[0].wns.wifiConfiguration.oemPrivate = true; 1617 // Link the scan result with suggestions. 1618 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1619 1620 setupAddToWifiConfigManager(suggestions[0]); 1621 1622 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1623 mNetworkSuggestionNominator.nominateNetworks( 1624 Arrays.asList(scanDetails), mPasspointCandidates, false, false, true, 1625 Collections.emptySet(), 1626 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1627 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1628 }); 1629 1630 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1631 verify(mWifiMetrics, never()) 1632 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1633 } 1634 1635 1636 /** 1637 * Ensure that we nominate the no matching network suggestion. 1638 * Because the only matched suggestion is metered carrier network from Non data SIM 1639 * Expected connectable Networks: {} 1640 */ 1641 @Test testSelectNetworkSuggestionForOneMatchMeteredNonDataSim()1642 public void testSelectNetworkSuggestionForOneMatchMeteredNonDataSim() { 1643 String[] scanSsids = {"test1", "test2"}; 1644 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1645 int[] freqs = {2470, 2437}; 1646 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1647 int[] levels = {-67, -76}; 1648 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1649 int[] securities = {SECURITY_PSK}; 1650 boolean[] appInteractions = {true}; 1651 boolean[] meteredness = {true}; 1652 int[] priorities = {-1}; 1653 int[] uids = {TEST_UID}; 1654 String[] packageNames = {TEST_PACKAGE}; 1655 boolean[] autojoin = {true}; 1656 boolean[] shareWithUser = {true}; 1657 int[] priorityGroup = {0}; 1658 1659 ScanDetail[] scanDetails = 1660 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1661 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1662 securities, appInteractions, meteredness, priorities, uids, 1663 packageNames, autojoin, shareWithUser, priorityGroup); 1664 suggestions[0].wns.wifiConfiguration.carrierId = TEST_CARRIER_ID; 1665 suggestions[0].wns.wifiConfiguration.meteredHint = true; 1666 when(mWifiCarrierInfoManager.isCarrierNetworkFromNonDefaultDataSim(any())).thenReturn(true); 1667 // Link the scan result with suggestions. 1668 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1669 setupAddToWifiConfigManager(suggestions[0]); 1670 1671 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1672 mNetworkSuggestionNominator.nominateNetworks( 1673 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1674 Collections.emptySet(), 1675 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1676 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1677 }); 1678 1679 assertTrue(connectableNetworks.isEmpty()); 1680 verify(mWifiMetrics, never()) 1681 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1682 } 1683 1684 /** 1685 * Ensure that we nominate the no matching network suggestion. 1686 * Because the only matched suggestion is carrier network which offloading is disabled. 1687 * Expected connectable Networks: {} 1688 */ 1689 @Test testSelectNetworkSuggestionForOneMatchCarrierOffloadDisabled()1690 public void testSelectNetworkSuggestionForOneMatchCarrierOffloadDisabled() { 1691 String[] scanSsids = {"test1", "test2"}; 1692 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1693 int[] freqs = {2470, 2437}; 1694 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1695 int[] levels = {-67, -76}; 1696 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1697 int[] securities = {SECURITY_PSK}; 1698 boolean[] appInteractions = {true}; 1699 boolean[] meteredness = {true}; 1700 int[] priorities = {-1}; 1701 int[] uids = {TEST_UID}; 1702 String[] packageNames = {TEST_PACKAGE}; 1703 boolean[] autojoin = {true}; 1704 boolean[] shareWithUser = {true}; 1705 int[] priorityGroup = {0}; 1706 1707 ScanDetail[] scanDetails = 1708 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1709 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1710 securities, appInteractions, meteredness, priorities, uids, 1711 packageNames, autojoin, shareWithUser, priorityGroup); 1712 suggestions[0].wns.wifiConfiguration.carrierId = TEST_CARRIER_ID; 1713 when(mWifiCarrierInfoManager.isCarrierNetworkOffloadEnabled(anyInt(), anyBoolean())) 1714 .thenReturn(false); 1715 // Link the scan result with suggestions. 1716 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1717 setupAddToWifiConfigManager(suggestions[0]); 1718 1719 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1720 mNetworkSuggestionNominator.nominateNetworks( 1721 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1722 Collections.emptySet(), 1723 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1724 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1725 }); 1726 1727 assertTrue(connectableNetworks.isEmpty()); 1728 verify(mWifiMetrics, never()) 1729 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1730 } 1731 1732 /** 1733 * Ensure that we nominate no matching network suggestion. 1734 * Because the only matched suggestion is restricted and restricted is not allowed 1735 * Expected connectable Networks: {} 1736 */ 1737 @Test testSelectNetworkSuggestionForOneMatchRestrictedNotAllow()1738 public void testSelectNetworkSuggestionForOneMatchRestrictedNotAllow() { 1739 String[] scanSsids = {"test1", "test2"}; 1740 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1741 int[] freqs = {2470, 2437}; 1742 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1743 int[] levels = {-67, -76}; 1744 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1745 int[] securities = {SECURITY_PSK}; 1746 boolean[] appInteractions = {true}; 1747 boolean[] meteredness = {true}; 1748 int[] priorities = {-1}; 1749 int[] uids = {TEST_UID}; 1750 String[] packageNames = {TEST_PACKAGE}; 1751 boolean[] autojoin = {true}; 1752 boolean[] shareWithUser = {true}; 1753 int[] priorityGroup = {0}; 1754 1755 ScanDetail[] scanDetails = 1756 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1757 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1758 securities, appInteractions, meteredness, priorities, uids, 1759 packageNames, autojoin, shareWithUser, priorityGroup); 1760 suggestions[0].wns.wifiConfiguration.restricted = true; 1761 // Link the scan result with suggestions. 1762 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1763 1764 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1765 mNetworkSuggestionNominator.nominateNetworks( 1766 Arrays.asList(scanDetails), mPasspointCandidates, false, false, false, 1767 Collections.emptySet(), 1768 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1769 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1770 }); 1771 1772 assertTrue(connectableNetworks.isEmpty()); 1773 verify(mWifiMetrics, never()) 1774 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1775 } 1776 1777 /** 1778 * Ensure that we nominate the one matching network suggestion. 1779 * Because the only matched suggestion is restricted and restricted is allowed 1780 * Expected connectable Networks: {suggestionSsids[0]} 1781 */ 1782 @Test testSelectNetworkSuggestionForOneMatchRestrictedAllow()1783 public void testSelectNetworkSuggestionForOneMatchRestrictedAllow() { 1784 String[] scanSsids = {"test1", "test2"}; 1785 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1786 int[] freqs = {2470, 2437}; 1787 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1788 int[] levels = {-67, -76}; 1789 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1790 int[] securities = {SECURITY_PSK}; 1791 boolean[] appInteractions = {true}; 1792 boolean[] meteredness = {true}; 1793 int[] priorities = {-1}; 1794 int[] uids = {TEST_UID}; 1795 String[] packageNames = {TEST_PACKAGE}; 1796 boolean[] autojoin = {true}; 1797 boolean[] shareWithUser = {true}; 1798 int[] priorityGroup = {0}; 1799 1800 ScanDetail[] scanDetails = 1801 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1802 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1803 securities, appInteractions, meteredness, priorities, uids, 1804 packageNames, autojoin, shareWithUser, priorityGroup); 1805 suggestions[0].wns.wifiConfiguration.restricted = true; 1806 // Link the scan result with suggestions. 1807 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1808 1809 setupAddToWifiConfigManager(suggestions[0]); 1810 1811 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1812 mNetworkSuggestionNominator.nominateNetworks( 1813 Arrays.asList(scanDetails), mPasspointCandidates, true, false, false, 1814 Set.of(suggestions[0].wns.wifiConfiguration.creatorUid), 1815 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1816 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1817 }); 1818 1819 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1820 verify(mWifiMetrics, never()) 1821 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1822 } 1823 1824 /** 1825 * Ensure that we nominate the one matching network suggestion. 1826 * Because the only matched suggestion is restricted and suggested by the SYSTEM_SERVER 1827 * Expected connectable Networks: {suggestionSsids[0]} 1828 */ 1829 @Test testSelectNetworkSuggestionForOneMatchRestrictedAllowBySystemServer()1830 public void testSelectNetworkSuggestionForOneMatchRestrictedAllowBySystemServer() { 1831 String[] scanSsids = {"test1", "test2"}; 1832 String[] bssids = {"6c:f3:7f:ae:8c:f3", "6c:f3:7f:ae:8c:f4"}; 1833 int[] freqs = {2470, 2437}; 1834 String[] caps = {"[WPA2-EAP/SHA1-CCMP][ESS]", "[WPA2-EAP/SHA1-CCMP][ESS]"}; 1835 int[] levels = {-67, -76}; 1836 String[] suggestionSsids = {"\"" + scanSsids[0] + "\""}; 1837 int[] securities = {SECURITY_PSK}; 1838 boolean[] appInteractions = {true}; 1839 boolean[] meteredness = {true}; 1840 int[] priorities = {-1}; 1841 int[] uids = {Process.SYSTEM_UID}; 1842 String[] packageNames = {TEST_PACKAGE}; 1843 boolean[] autojoin = {true}; 1844 boolean[] shareWithUser = {true}; 1845 int[] priorityGroup = {0}; 1846 1847 ScanDetail[] scanDetails = 1848 buildScanDetails(scanSsids, bssids, freqs, caps, levels, mClock); 1849 ExtendedWifiNetworkSuggestion[] suggestions = buildNetworkSuggestions(suggestionSsids, 1850 securities, appInteractions, meteredness, priorities, uids, 1851 packageNames, autojoin, shareWithUser, priorityGroup); 1852 suggestions[0].wns.wifiConfiguration.restricted = true; 1853 // Link the scan result with suggestions. 1854 linkScanDetailsWithNetworkSuggestions(scanDetails, suggestions); 1855 1856 setupAddToWifiConfigManager(suggestions[0]); 1857 1858 List<Pair<ScanDetail, WifiConfiguration>> connectableNetworks = new ArrayList<>(); 1859 mNetworkSuggestionNominator.nominateNetworks( 1860 Arrays.asList(scanDetails), mPasspointCandidates, true, false, false, 1861 Collections.emptySet(), // restrictedNetworkAllowedUids is empty 1862 (ScanDetail scanDetail, WifiConfiguration configuration) -> { 1863 connectableNetworks.add(Pair.create(scanDetail, configuration)); 1864 }); 1865 1866 validateConnectableNetworks(connectableNetworks, scanSsids[0]); 1867 verify(mWifiMetrics, never()) 1868 .incrementNetworkSuggestionMoreThanOneSuggestionForSingleScanResult(); 1869 } 1870 setupAddToWifiConfigManager(ExtendedWifiNetworkSuggestion...candidates)1871 private void setupAddToWifiConfigManager(ExtendedWifiNetworkSuggestion...candidates) { 1872 for (int i = 0; i < candidates.length; i++) { 1873 WifiConfiguration candidate = candidates[i].createInternalWifiConfiguration( 1874 mWifiCarrierInfoManager); 1875 WifiConfiguration.NetworkSelectionStatus status = 1876 mock(WifiConfiguration.NetworkSelectionStatus.class); 1877 when(status.isNetworkEnabled()).thenReturn(true); 1878 candidate.setNetworkSelectionStatus(status); 1879 when(mWifiConfigManager.getConfiguredNetwork(candidate.getProfileKey())) 1880 .thenReturn(candidate); 1881 } 1882 } 1883 verifyAddToWifiConfigManager( boolean trustedSet, boolean oemPaidSet, boolean oemPrivateSet, WifiConfiguration...candidates)1884 private void verifyAddToWifiConfigManager( 1885 boolean trustedSet, boolean oemPaidSet, boolean oemPrivateSet, 1886 WifiConfiguration...candidates) { 1887 // check for any saved networks. 1888 verify(mWifiConfigManager, atLeast(candidates.length)).getConfiguredNetwork(anyString()); 1889 1890 ArgumentCaptor<WifiConfiguration> wifiConfigurationCaptor = 1891 ArgumentCaptor.forClass(WifiConfiguration.class); 1892 verify(mWifiConfigManager, times(candidates.length)).addOrUpdateNetwork( 1893 wifiConfigurationCaptor.capture(), anyInt(), anyString(), eq(false)); 1894 verify(mWifiConfigManager, times(candidates.length)).allowAutojoin(anyInt(), anyBoolean()); 1895 for (int i = 0; i < candidates.length; i++) { 1896 WifiConfiguration addedWifiConfiguration = null; 1897 for (WifiConfiguration configuration : wifiConfigurationCaptor.getAllValues()) { 1898 if (configuration.SSID.equals(candidates[i].SSID)) { 1899 addedWifiConfiguration = configuration; 1900 break; 1901 } 1902 } 1903 assertNotNull(addedWifiConfiguration); 1904 assertTrue(addedWifiConfiguration.ephemeral); 1905 assertTrue(addedWifiConfiguration.fromWifiNetworkSuggestion); 1906 assertEquals(trustedSet, addedWifiConfiguration.trusted); 1907 assertEquals(oemPaidSet, addedWifiConfiguration.oemPaid); 1908 assertEquals(oemPrivateSet, addedWifiConfiguration.oemPrivate); 1909 } 1910 1911 verify(mWifiConfigManager, times(candidates.length)).updateNetworkSelectionStatus( 1912 anyInt(), anyInt()); 1913 verify(mWifiConfigManager, times(candidates.length)).getConfiguredNetwork(anyInt()); 1914 } 1915 1916 /** 1917 * Build an array of scanDetails based on the caller supplied network SSID, BSSID, 1918 * frequency, capability and RSSI level information. 1919 */ buildScanDetails(String[] ssids, String[] bssids, int[] freqs, String[] caps, int[] levels, Clock clock)1920 private static ScanDetail[] buildScanDetails(String[] ssids, String[] bssids, int[] freqs, 1921 String[] caps, int[] levels, Clock clock) { 1922 if (ssids == null || ssids.length == 0) return new ScanDetail[0]; 1923 1924 ScanDetail[] scanDetails = new ScanDetail[ssids.length]; 1925 long timeStamp = clock.getElapsedSinceBootMillis(); 1926 for (int index = 0; index < ssids.length; index++) { 1927 scanDetails[index] = new ScanDetail(WifiSsid.fromUtf8Text(ssids[index]), 1928 bssids[index], caps[index], levels[index], freqs[index], timeStamp, 0); 1929 } 1930 return scanDetails; 1931 } 1932 1933 /** 1934 * Generate an array of {@link android.net.wifi.WifiConfiguration} based on the caller 1935 * supplied network SSID and security information. 1936 */ buildWifiConfigurations(String[] ssids, int[] securities)1937 private static WifiConfiguration[] buildWifiConfigurations(String[] ssids, int[] securities) { 1938 if (ssids == null || ssids.length == 0) return new WifiConfiguration[0]; 1939 1940 WifiConfiguration[] configs = new WifiConfiguration[ssids.length]; 1941 for (int index = 0; index < ssids.length; index++) { 1942 configs[index] = generateWifiConfig(-1, 0, ssids[index], false, true, null, 1943 null, securities[index]); 1944 } 1945 return configs; 1946 } 1947 buildNetworkSuggestions( String[] ssids, int[] securities, boolean[] appInteractions, boolean[] meteredness, int[] priorities, int[] uids, String[] packageNames, boolean[] autojoin, boolean[] shareWithUser, int[] priorityGroup)1948 private ExtendedWifiNetworkSuggestion[] buildNetworkSuggestions( 1949 String[] ssids, int[] securities, boolean[] appInteractions, boolean[] meteredness, 1950 int[] priorities, int[] uids, String[] packageNames, boolean[] autojoin, 1951 boolean[] shareWithUser, int[] priorityGroup) { 1952 WifiConfiguration[] configs = buildWifiConfigurations(ssids, securities); 1953 ExtendedWifiNetworkSuggestion[] suggestions = 1954 new ExtendedWifiNetworkSuggestion[configs.length]; 1955 for (int i = 0; i < configs.length; i++) { 1956 configs[i].priority = priorities[i]; 1957 configs[i].creatorUid = uids[i]; 1958 configs[i].meteredOverride = meteredness[i] 1959 ? WifiConfiguration.METERED_OVERRIDE_METERED 1960 : WifiConfiguration.METERED_OVERRIDE_NONE; 1961 configs[i].creatorName = packageNames[i]; 1962 configs[i].ephemeral = true; 1963 configs[i].fromWifiNetworkSuggestion = true; 1964 PerAppInfo perAppInfo = new PerAppInfo(uids[i], packageNames[i], null); 1965 WifiNetworkSuggestion suggestion = 1966 new WifiNetworkSuggestion(configs[i], null, appInteractions[i], false, 1967 shareWithUser[i], true, priorityGroup[i]); 1968 suggestions[i] = new ExtendedWifiNetworkSuggestion(suggestion, perAppInfo, autojoin[i]); 1969 } 1970 return suggestions; 1971 } 1972 1973 /** 1974 * Link scan results to the network suggestions. 1975 * 1976 * The shorter of the 2 input params will be used to loop over so the inputs don't 1977 * need to be of equal length. 1978 * If there are more scan details than suggestions, the remaining 1979 * scan details will be associated with a NULL suggestions. 1980 * If there are more suggestions than scan details, the remaining 1981 * suggestions will be associated with the last scan detail. 1982 */ linkScanDetailsWithNetworkSuggestions( ScanDetail[] scanDetails, ExtendedWifiNetworkSuggestion[] suggestions)1983 private void linkScanDetailsWithNetworkSuggestions( 1984 ScanDetail[] scanDetails, ExtendedWifiNetworkSuggestion[] suggestions) { 1985 if (suggestions == null || scanDetails == null) { 1986 return; 1987 } 1988 int minLength = Math.min(scanDetails.length, suggestions.length); 1989 1990 // 1 to 1 mapping from scan detail to suggestion. 1991 for (int i = 0; i < minLength; i++) { 1992 ScanDetail scanDetail = scanDetails[i]; 1993 final ExtendedWifiNetworkSuggestion matchingSuggestion = suggestions[i]; 1994 Set<ExtendedWifiNetworkSuggestion> matchingSuggestions = Set.of(matchingSuggestion); 1995 when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail(eq(scanDetail))) 1996 .thenReturn(matchingSuggestions); 1997 } 1998 if (scanDetails.length > suggestions.length) { 1999 // No match for the remaining scan details. 2000 for (int i = minLength; i < scanDetails.length; i++) { 2001 ScanDetail scanDetail = scanDetails[i]; 2002 when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( 2003 eq(scanDetail))).thenReturn(Set.of()); 2004 } 2005 } else if (suggestions.length > scanDetails.length) { 2006 // All the additional suggestions match the last scan detail. 2007 HashSet<ExtendedWifiNetworkSuggestion> matchingSuggestions = new HashSet<>( 2008 Arrays.asList(suggestions).subList(minLength - 1, suggestions.length)); 2009 ScanDetail lastScanDetail = scanDetails[minLength - 1]; 2010 when(mWifiNetworkSuggestionsManager.getNetworkSuggestionsForScanDetail( 2011 eq(lastScanDetail))).thenReturn(matchingSuggestions); 2012 } 2013 } 2014 validateConnectableNetworks(List<Pair<ScanDetail, WifiConfiguration>> actual, String...expectedSsids)2015 private void validateConnectableNetworks(List<Pair<ScanDetail, WifiConfiguration>> actual, 2016 String...expectedSsids) { 2017 assertEquals(expectedSsids.length, actual.size()); 2018 Set<String> actualSsids = new HashSet<>(); 2019 2020 for (Pair<ScanDetail, WifiConfiguration> candidate : actual) { 2021 // check if the scan detail matches the wificonfiguration. 2022 assertEquals("\"" + candidate.first.getSSID() + "\"", candidate.second.SSID); 2023 actualSsids.add(candidate.first.getSSID()); 2024 } 2025 // Verify actual matches the expected. 2026 assertTrue(actualSsids.containsAll(Arrays.asList(expectedSsids))); 2027 } 2028 } 2029