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 android.net.wifi; 18 19 import static org.junit.Assert.*; 20 21 import android.net.MacAddress; 22 import android.net.wifi.hotspot2.PasspointConfiguration; 23 import android.net.wifi.hotspot2.PasspointTestUtils; 24 import android.os.Parcel; 25 26 import androidx.test.filters.SmallTest; 27 28 import org.junit.Test; 29 30 /** 31 * Unit tests for {@link android.net.wifi.WifiNetworkSuggestion}. 32 */ 33 @SmallTest 34 public class WifiNetworkSuggestionTest { 35 private static final String TEST_SSID = "\"Test123\""; 36 private static final String TEST_BSSID = "12:12:12:12:12:12"; 37 private static final String TEST_SSID_1 = "\"Test1234\""; 38 private static final String TEST_PRESHARED_KEY = "Test123"; 39 private static final String TEST_FQDN = "fqdn"; 40 private static final String TEST_WAPI_CERT_SUITE = "suite"; 41 private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch"; 42 43 /** 44 * Validate correctness of WifiNetworkSuggestion object created by 45 * {@link WifiNetworkSuggestion.Builder#build()} for Open network which requires 46 * app interaction. 47 */ 48 @Test testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction()49 public void testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction() { 50 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 51 .setSsid(TEST_SSID) 52 .setIsAppInteractionRequired(true) 53 .build(); 54 55 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 56 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 57 .get(WifiConfiguration.KeyMgmt.NONE)); 58 assertTrue(suggestion.isAppInteractionRequired); 59 assertFalse(suggestion.isUserInteractionRequired); 60 assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE, 61 suggestion.wifiConfiguration.meteredOverride); 62 assertEquals(-1, suggestion.wifiConfiguration.priority); 63 assertFalse(suggestion.isUserAllowedToManuallyConnect); 64 assertTrue(suggestion.isInitialAutoJoinEnabled); 65 } 66 67 /** 68 * Validate correctness of WifiNetworkSuggestion object created by 69 * {@link WifiNetworkSuggestion.Builder#build()} for WPA_EAP network which requires 70 * app interaction, not share credential and has a priority of zero set. 71 */ 72 @Test 73 public void testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction()74 testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction() { 75 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 76 .setSsid(TEST_SSID) 77 .setWpa2Passphrase(TEST_PRESHARED_KEY) 78 .setIsAppInteractionRequired(true) 79 .setCredentialSharedWithUser(false) 80 .setPriority(0) 81 .build(); 82 83 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 84 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 85 .get(WifiConfiguration.KeyMgmt.WPA_PSK)); 86 assertEquals("\"" + TEST_PRESHARED_KEY + "\"", 87 suggestion.wifiConfiguration.preSharedKey); 88 assertTrue(suggestion.isAppInteractionRequired); 89 assertFalse(suggestion.isUserInteractionRequired); 90 assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE, 91 suggestion.wifiConfiguration.meteredOverride); 92 assertEquals(0, suggestion.wifiConfiguration.priority); 93 assertFalse(suggestion.isUserAllowedToManuallyConnect); 94 assertTrue(suggestion.isInitialAutoJoinEnabled); 95 } 96 97 /** 98 * Validate correctness of WifiNetworkSuggestion object created by 99 * {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires 100 * user interaction and is metered. 101 */ 102 @Test 103 public void testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction()104 testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction() { 105 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 106 .setSsid(TEST_SSID) 107 .setWpa2Passphrase(TEST_PRESHARED_KEY) 108 .setIsUserInteractionRequired(true) 109 .setIsInitialAutojoinEnabled(false) 110 .setIsMetered(true) 111 .build(); 112 113 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 114 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 115 .get(WifiConfiguration.KeyMgmt.WPA_PSK)); 116 assertEquals("\"" + TEST_PRESHARED_KEY + "\"", 117 suggestion.wifiConfiguration.preSharedKey); 118 assertFalse(suggestion.isAppInteractionRequired); 119 assertTrue(suggestion.isUserInteractionRequired); 120 assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED, 121 suggestion.wifiConfiguration.meteredOverride); 122 assertEquals(-1, suggestion.wifiConfiguration.priority); 123 assertTrue(suggestion.isUserAllowedToManuallyConnect); 124 assertFalse(suggestion.isInitialAutoJoinEnabled); 125 } 126 127 /** 128 * Validate correctness of WifiNetworkSuggestion object created by 129 * {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires 130 * user interaction and is not metered. 131 */ 132 @Test 133 public void testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithNotMeteredAndReqUserInteraction()134 testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithNotMeteredAndReqUserInteraction() { 135 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 136 .setSsid(TEST_SSID) 137 .setWpa2Passphrase(TEST_PRESHARED_KEY) 138 .setIsUserInteractionRequired(true) 139 .setIsInitialAutojoinEnabled(false) 140 .setIsMetered(false) 141 .build(); 142 143 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 144 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 145 .get(WifiConfiguration.KeyMgmt.WPA_PSK)); 146 assertEquals("\"" + TEST_PRESHARED_KEY + "\"", 147 suggestion.wifiConfiguration.preSharedKey); 148 assertFalse(suggestion.isAppInteractionRequired); 149 assertTrue(suggestion.isUserInteractionRequired); 150 assertEquals(WifiConfiguration.METERED_OVERRIDE_NOT_METERED, 151 suggestion.wifiConfiguration.meteredOverride); 152 assertEquals(-1, suggestion.wifiConfiguration.priority); 153 assertTrue(suggestion.isUserAllowedToManuallyConnect); 154 assertFalse(suggestion.isInitialAutoJoinEnabled); 155 } 156 157 /** 158 * Validate correctness of WifiNetworkSuggestion object created by 159 * {@link WifiNetworkSuggestion.Builder#build()} for OWE network. 160 */ 161 @Test testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid()162 public void testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid() { 163 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 164 .setSsid(TEST_SSID) 165 .setBssid(MacAddress.fromString(TEST_BSSID)) 166 .setIsEnhancedOpen(true) 167 .build(); 168 169 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 170 assertEquals(TEST_BSSID, suggestion.wifiConfiguration.BSSID); 171 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 172 .get(WifiConfiguration.KeyMgmt.OWE)); 173 assertNull(suggestion.wifiConfiguration.preSharedKey); 174 assertTrue(suggestion.wifiConfiguration.requirePmf); 175 assertFalse(suggestion.isUserAllowedToManuallyConnect); 176 assertTrue(suggestion.isInitialAutoJoinEnabled); 177 } 178 179 /** 180 * Validate correctness of WifiNetworkSuggestion object created by 181 * {@link WifiNetworkSuggestion.Builder#build()} for SAE network. 182 */ 183 @Test testWifiNetworkSuggestionBuilderForWpa3PskNetwork()184 public void testWifiNetworkSuggestionBuilderForWpa3PskNetwork() { 185 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 186 .setSsid(TEST_SSID) 187 .setWpa3Passphrase(TEST_PRESHARED_KEY) 188 .setCredentialSharedWithUser(true) 189 .setIsInitialAutojoinEnabled(false) 190 .build(); 191 192 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 193 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 194 .get(WifiConfiguration.KeyMgmt.SAE)); 195 assertEquals("\"" + TEST_PRESHARED_KEY + "\"", 196 suggestion.wifiConfiguration.preSharedKey); 197 assertTrue(suggestion.wifiConfiguration.requirePmf); 198 assertTrue(suggestion.isUserAllowedToManuallyConnect); 199 assertFalse(suggestion.isInitialAutoJoinEnabled); 200 } 201 202 203 /** 204 * Validate correctness of WifiNetworkSuggestion object created by 205 * {@link WifiNetworkSuggestion.Builder#build()} for SuiteB network. 206 */ 207 @Test testWifiNetworkSuggestionBuilderForWpa3EapNetwork()208 public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() { 209 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); 210 enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); 211 enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); 212 enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0); 213 enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); 214 215 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 216 .setSsid(TEST_SSID) 217 .setWpa3EnterpriseConfig(enterpriseConfig) 218 .build(); 219 220 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 221 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 222 .get(WifiConfiguration.KeyMgmt.SUITE_B_192)); 223 assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers 224 .get(WifiConfiguration.GroupCipher.GCMP_256)); 225 assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers 226 .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256)); 227 assertTrue(suggestion.wifiConfiguration.requirePmf); 228 assertNull(suggestion.wifiConfiguration.preSharedKey); 229 // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested 230 // here. 231 assertTrue(suggestion.isUserAllowedToManuallyConnect); 232 assertTrue(suggestion.isInitialAutoJoinEnabled); 233 } 234 235 /** 236 * Ensure create enterprise suggestion requires CA, when CA certificate is missing, will throw 237 * an exception. 238 */ 239 @Test (expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderForEapNetworkWithoutCa()240 public void testWifiNetworkSuggestionBuilderForEapNetworkWithoutCa() { 241 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); 242 enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); 243 enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); 244 enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH); 245 246 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 247 .setSsid(TEST_SSID) 248 .setWpa2EnterpriseConfig(enterpriseConfig) 249 .build(); 250 } 251 252 /** 253 * Ensure create enterprise suggestion requires CA, when both domain suffix and alt subject 254 * match are missing, will throw an exception. 255 */ 256 @Test (expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderForEapNetworkWithoutMatch()257 public void testWifiNetworkSuggestionBuilderForEapNetworkWithoutMatch() { 258 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); 259 enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS); 260 enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC); 261 enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0); 262 263 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 264 .setSsid(TEST_SSID) 265 .setWpa3EnterpriseConfig(enterpriseConfig) 266 .build(); 267 } 268 269 /** 270 * Validate correctness of WifiNetworkSuggestion object created by 271 * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-PSK network. 272 */ 273 @Test testWifiNetworkSuggestionBuilderForWapiPskNetwork()274 public void testWifiNetworkSuggestionBuilderForWapiPskNetwork() { 275 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 276 .setSsid(TEST_SSID) 277 .setWapiPassphrase(TEST_PRESHARED_KEY) 278 .build(); 279 280 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 281 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 282 .get(WifiConfiguration.KeyMgmt.WAPI_PSK)); 283 assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers 284 .get(WifiConfiguration.PairwiseCipher.SMS4)); 285 assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers 286 .get(WifiConfiguration.GroupCipher.SMS4)); 287 assertEquals("\"" + TEST_PRESHARED_KEY + "\"", 288 suggestion.wifiConfiguration.preSharedKey); 289 } 290 291 292 /** 293 * Validate correctness of WifiNetworkSuggestion object created by 294 * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-CERT network. 295 */ 296 @Test testWifiNetworkSuggestionBuilderForWapiCertNetwork()297 public void testWifiNetworkSuggestionBuilderForWapiCertNetwork() { 298 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); 299 enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.WAPI_CERT); 300 enterpriseConfig.setWapiCertSuite(TEST_WAPI_CERT_SUITE); 301 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 302 .setSsid(TEST_SSID) 303 .setWapiEnterpriseConfig(enterpriseConfig) 304 .build(); 305 306 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 307 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 308 .get(WifiConfiguration.KeyMgmt.WAPI_CERT)); 309 assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers 310 .get(WifiConfiguration.PairwiseCipher.SMS4)); 311 assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers 312 .get(WifiConfiguration.GroupCipher.SMS4)); 313 assertNull(suggestion.wifiConfiguration.preSharedKey); 314 assertNotNull(suggestion.wifiConfiguration.enterpriseConfig); 315 assertEquals(WifiEnterpriseConfig.Eap.WAPI_CERT, 316 suggestion.wifiConfiguration.enterpriseConfig.getEapMethod()); 317 assertEquals(TEST_WAPI_CERT_SUITE, 318 suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite()); 319 } 320 321 /** 322 * Validate correctness of WifiNetworkSuggestion object created by 323 * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-CERT network 324 * which selects the certificate suite automatically. 325 */ 326 @Test testWifiNetworkSuggestionBuilderForWapiCertAutoNetwork()327 public void testWifiNetworkSuggestionBuilderForWapiCertAutoNetwork() { 328 WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig(); 329 enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.WAPI_CERT); 330 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 331 .setSsid(TEST_SSID) 332 .setWapiEnterpriseConfig(enterpriseConfig) 333 .build(); 334 335 assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID); 336 assertTrue(suggestion.wifiConfiguration.allowedKeyManagement 337 .get(WifiConfiguration.KeyMgmt.WAPI_CERT)); 338 assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers 339 .get(WifiConfiguration.PairwiseCipher.SMS4)); 340 assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers 341 .get(WifiConfiguration.GroupCipher.SMS4)); 342 assertNull(suggestion.wifiConfiguration.preSharedKey); 343 assertNotNull(suggestion.wifiConfiguration.enterpriseConfig); 344 assertEquals(WifiEnterpriseConfig.Eap.WAPI_CERT, 345 suggestion.wifiConfiguration.enterpriseConfig.getEapMethod()); 346 assertEquals("", 347 suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite()); 348 } 349 350 /** 351 * Validate correctness of WifiNetworkSuggestion object created by 352 * {@link WifiNetworkSuggestion.Builder#build()} for Passpoint network which requires 353 * app interaction and metered. 354 */ 355 @Test testWifiNetworkSuggestionBuilderForPasspointNetworkWithReqAppInteractionMetered()356 public void testWifiNetworkSuggestionBuilderForPasspointNetworkWithReqAppInteractionMetered() { 357 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 358 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 359 .setPasspointConfig(passpointConfiguration) 360 .setIsAppInteractionRequired(true) 361 .setIsMetered(true) 362 .build(); 363 assertEquals(TEST_FQDN, suggestion.wifiConfiguration.FQDN); 364 assertTrue(suggestion.isAppInteractionRequired); 365 assertEquals(suggestion.wifiConfiguration.meteredOverride, 366 WifiConfiguration.METERED_OVERRIDE_METERED); 367 assertEquals(suggestion.getPasspointConfig().getMeteredOverride(), 368 WifiConfiguration.METERED_OVERRIDE_METERED); 369 assertTrue(suggestion.isUserAllowedToManuallyConnect); 370 } 371 372 /** 373 * Ensure {@link WifiNetworkSuggestion.Builder#setSsid(String)} throws an exception 374 * when the string is not Unicode. 375 */ 376 @Test(expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderSetSsidWithNonUnicodeString()377 public void testWifiNetworkSuggestionBuilderSetSsidWithNonUnicodeString() { 378 new WifiNetworkSuggestion.Builder() 379 .setSsid("\ud800") 380 .build(); 381 } 382 383 /** 384 * Ensure {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} throws an exception 385 * when the string is not ASCII encodable. 386 */ 387 @Test(expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderSetWpa2PasphraseWithNonAsciiString()388 public void testWifiNetworkSuggestionBuilderSetWpa2PasphraseWithNonAsciiString() { 389 new WifiNetworkSuggestion.Builder() 390 .setSsid(TEST_SSID) 391 .setWpa2Passphrase("salvē") 392 .build(); 393 } 394 395 /** 396 * Ensure {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)}} 397 * throws an exception when the PasspointConfiguration is not valid. 398 */ 399 @Test(expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderSetPasspointConfigWithNonValid()400 public void testWifiNetworkSuggestionBuilderSetPasspointConfigWithNonValid() { 401 PasspointConfiguration passpointConfiguration = new PasspointConfiguration(); 402 new WifiNetworkSuggestion.Builder() 403 .setPasspointConfig(passpointConfiguration) 404 .build(); 405 } 406 407 /** 408 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 409 * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is not set. 410 */ 411 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithNoSsid()412 public void testWifiNetworkSuggestionBuilderWithNoSsid() { 413 new WifiNetworkSuggestion.Builder() 414 .build(); 415 } 416 417 /** 418 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 419 * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is invoked with an invalid value. 420 */ 421 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithInvalidSsid()422 public void testWifiNetworkSuggestionBuilderWithInvalidSsid() { 423 new WifiNetworkSuggestion.Builder() 424 .setSsid("") 425 .build(); 426 } 427 428 /** 429 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 430 * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid 431 * value. 432 */ 433 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid()434 public void testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid() { 435 new WifiNetworkSuggestion.Builder() 436 .setSsid(TEST_SSID) 437 .setBssid(MacAddress.BROADCAST_ADDRESS) 438 .build(); 439 } 440 441 /** 442 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 443 * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid 444 * value. 445 */ 446 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid()447 public void testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid() { 448 new WifiNetworkSuggestion.Builder() 449 .setSsid(TEST_SSID) 450 .setBssid(WifiManager.ALL_ZEROS_MAC_ADDRESS) 451 .build(); 452 } 453 454 /** 455 * Ensure {@link WifiNetworkSuggestion.Builder#setPriority(int)} throws an exception 456 * when the value is negative. 457 */ 458 @Test(expected = IllegalArgumentException.class) testWifiNetworkSuggestionBuilderWithInvalidPriority()459 public void testWifiNetworkSuggestionBuilderWithInvalidPriority() { 460 new WifiNetworkSuggestion.Builder() 461 .setSsid(TEST_SSID) 462 .setPriority(-2) 463 .build(); 464 } 465 466 /** 467 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 468 * when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and 469 * {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} are invoked. 470 */ 471 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothWpa2PasphraseAndWpa3Passphrase()472 public void testWifiNetworkSuggestionBuilderWithBothWpa2PasphraseAndWpa3Passphrase() { 473 new WifiNetworkSuggestion.Builder() 474 .setSsid(TEST_SSID) 475 .setWpa2Passphrase(TEST_PRESHARED_KEY) 476 .setWpa3Passphrase(TEST_PRESHARED_KEY) 477 .build(); 478 } 479 480 /** 481 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 482 * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and 483 * {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are 484 * invoked. 485 */ 486 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnterprise()487 public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnterprise() { 488 new WifiNetworkSuggestion.Builder() 489 .setSsid(TEST_SSID) 490 .setWpa3Passphrase(TEST_PRESHARED_KEY) 491 .setWpa3EnterpriseConfig(new WifiEnterpriseConfig()) 492 .build(); 493 } 494 495 /** 496 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 497 * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and 498 * {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen(boolean)} are invoked. 499 */ 500 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnhancedOpen()501 public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnhancedOpen() { 502 new WifiNetworkSuggestion.Builder() 503 .setSsid(TEST_SSID) 504 .setWpa3Passphrase(TEST_PRESHARED_KEY) 505 .setIsEnhancedOpen(true) 506 .build(); 507 } 508 509 /** 510 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 511 * when both {@link WifiNetworkSuggestion.Builder#setSsid(String)} and 512 * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked. 513 */ 514 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothSsidAndPasspointConfig()515 public void testWifiNetworkSuggestionBuilderWithBothSsidAndPasspointConfig() { 516 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 517 new WifiNetworkSuggestion.Builder() 518 .setSsid(TEST_SSID) 519 .setPasspointConfig(passpointConfiguration) 520 .build(); 521 } 522 523 /** 524 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 525 * when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and 526 * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked. 527 */ 528 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothWpa2PassphraseAndPasspointConfig()529 public void testWifiNetworkSuggestionBuilderWithBothWpa2PassphraseAndPasspointConfig() { 530 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 531 new WifiNetworkSuggestion.Builder() 532 .setWpa2Passphrase(TEST_PRESHARED_KEY) 533 .setPasspointConfig(passpointConfiguration) 534 .build(); 535 } 536 537 /** 538 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 539 * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and 540 * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked. 541 */ 542 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothWpa3PassphraseAndPasspointConfig()543 public void testWifiNetworkSuggestionBuilderWithBothWpa3PassphraseAndPasspointConfig() { 544 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 545 new WifiNetworkSuggestion.Builder() 546 .setWpa3Passphrase(TEST_PRESHARED_KEY) 547 .setPasspointConfig(passpointConfiguration) 548 .build(); 549 } 550 551 /** 552 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 553 * when both {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} 554 * and {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are 555 * invoked. 556 */ 557 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothEnterpriseAndPasspointConfig()558 public void testWifiNetworkSuggestionBuilderWithBothEnterpriseAndPasspointConfig() { 559 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 560 new WifiNetworkSuggestion.Builder() 561 .setWpa3EnterpriseConfig(new WifiEnterpriseConfig()) 562 .setPasspointConfig(passpointConfiguration) 563 .build(); 564 } 565 566 /** 567 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 568 * when both {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen(boolean)} and 569 * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked. 570 */ 571 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothEnhancedOpenAndPasspointConfig()572 public void testWifiNetworkSuggestionBuilderWithBothEnhancedOpenAndPasspointConfig() { 573 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 574 new WifiNetworkSuggestion.Builder() 575 .setIsEnhancedOpen(true) 576 .setPasspointConfig(passpointConfiguration) 577 .build(); 578 } 579 580 /** 581 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 582 * when both {@link WifiNetworkSuggestion.Builder#setIsHiddenSsid(boolean)} and 583 * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked. 584 */ 585 @Test(expected = IllegalStateException.class) testWifiNetworkSuggestionBuilderWithBothHiddenSsidAndPasspointConfig()586 public void testWifiNetworkSuggestionBuilderWithBothHiddenSsidAndPasspointConfig() { 587 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 588 new WifiNetworkSuggestion.Builder() 589 .setIsHiddenSsid(true) 590 .setPasspointConfig(passpointConfiguration) 591 .build(); 592 } 593 594 /** 595 * Check that parcel marshalling/unmarshalling works 596 */ 597 @Test testWifiNetworkSuggestionParcel()598 public void testWifiNetworkSuggestionParcel() { 599 WifiConfiguration configuration = new WifiConfiguration(); 600 configuration.SSID = TEST_SSID; 601 configuration.BSSID = TEST_BSSID; 602 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 603 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion( 604 configuration, null, false, true, true, true); 605 606 Parcel parcelW = Parcel.obtain(); 607 suggestion.writeToParcel(parcelW, 0); 608 byte[] bytes = parcelW.marshall(); 609 parcelW.recycle(); 610 611 Parcel parcelR = Parcel.obtain(); 612 parcelR.unmarshall(bytes, 0, bytes.length); 613 parcelR.setDataPosition(0); 614 WifiNetworkSuggestion parcelSuggestion = 615 WifiNetworkSuggestion.CREATOR.createFromParcel(parcelR); 616 617 // Two suggestion objects are considered equal if they point to the same network (i.e same 618 // SSID + keyMgmt + same UID). |isAppInteractionRequired| & |isUserInteractionRequired| are 619 // not considered for equality and hence needs to be checked for explicitly below. 620 assertEquals(suggestion, parcelSuggestion); 621 assertEquals(suggestion.hashCode(), parcelSuggestion.hashCode()); 622 assertEquals(suggestion.isAppInteractionRequired, 623 parcelSuggestion.isAppInteractionRequired); 624 assertEquals(suggestion.isUserInteractionRequired, 625 parcelSuggestion.isUserInteractionRequired); 626 assertEquals(suggestion.isInitialAutoJoinEnabled, 627 parcelSuggestion.isInitialAutoJoinEnabled); 628 } 629 630 /** 631 * Check that parcel marshalling/unmarshalling works 632 */ 633 @Test testPasspointNetworkSuggestionParcel()634 public void testPasspointNetworkSuggestionParcel() { 635 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 636 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 637 .setPasspointConfig(passpointConfiguration) 638 .build(); 639 640 Parcel parcelW = Parcel.obtain(); 641 suggestion.writeToParcel(parcelW, 0); 642 byte[] bytes = parcelW.marshall(); 643 parcelW.recycle(); 644 645 Parcel parcelR = Parcel.obtain(); 646 parcelR.unmarshall(bytes, 0, bytes.length); 647 parcelR.setDataPosition(0); 648 WifiNetworkSuggestion parcelSuggestion = 649 WifiNetworkSuggestion.CREATOR.createFromParcel(parcelR); 650 651 // Two suggestion objects are considered equal if they point to the same network (i.e same 652 // SSID + keyMgmt + same UID). |isAppInteractionRequired| & |isUserInteractionRequired| are 653 // not considered for equality and hence needs to be checked for explicitly below. 654 assertEquals(suggestion, parcelSuggestion); 655 assertEquals(suggestion.hashCode(), parcelSuggestion.hashCode()); 656 assertEquals(suggestion.isAppInteractionRequired, 657 parcelSuggestion.isAppInteractionRequired); 658 assertEquals(suggestion.isUserInteractionRequired, 659 parcelSuggestion.isUserInteractionRequired); 660 assertEquals(suggestion.isInitialAutoJoinEnabled, 661 parcelSuggestion.isInitialAutoJoinEnabled); 662 } 663 664 /** 665 * Check NetworkSuggestion equals returns {@code true} for 2 network suggestions with the same 666 * SSID, BSSID, key mgmt and UID. 667 */ 668 @Test testWifiNetworkSuggestionEqualsSame()669 public void testWifiNetworkSuggestionEqualsSame() { 670 WifiConfiguration configuration = new WifiConfiguration(); 671 configuration.SSID = TEST_SSID; 672 configuration.BSSID = TEST_BSSID; 673 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 674 WifiNetworkSuggestion suggestion = 675 new WifiNetworkSuggestion(configuration, null, true, false, true, true); 676 677 WifiConfiguration configuration1 = new WifiConfiguration(); 678 configuration1.SSID = TEST_SSID; 679 configuration1.BSSID = TEST_BSSID; 680 configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 681 WifiNetworkSuggestion suggestion1 = 682 new WifiNetworkSuggestion(configuration1, null, false, true, true, true); 683 684 assertEquals(suggestion, suggestion1); 685 assertEquals(suggestion.hashCode(), suggestion1.hashCode()); 686 } 687 688 /** 689 * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same 690 * BSSID, key mgmt and UID, but different SSID. 691 */ 692 @Test testWifiNetworkSuggestionEqualsFailsWhenSsidIsDifferent()693 public void testWifiNetworkSuggestionEqualsFailsWhenSsidIsDifferent() { 694 WifiConfiguration configuration = new WifiConfiguration(); 695 configuration.SSID = TEST_SSID; 696 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 697 WifiNetworkSuggestion suggestion = 698 new WifiNetworkSuggestion(configuration, null, false, false, true, true); 699 700 WifiConfiguration configuration1 = new WifiConfiguration(); 701 configuration1.SSID = TEST_SSID_1; 702 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 703 WifiNetworkSuggestion suggestion1 = 704 new WifiNetworkSuggestion(configuration1, null, false, false, true, true); 705 706 assertNotEquals(suggestion, suggestion1); 707 } 708 709 /** 710 * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same 711 * SSID, key mgmt and UID, but different BSSID. 712 */ 713 @Test testWifiNetworkSuggestionEqualsFailsWhenBssidIsDifferent()714 public void testWifiNetworkSuggestionEqualsFailsWhenBssidIsDifferent() { 715 WifiConfiguration configuration = new WifiConfiguration(); 716 configuration.SSID = TEST_SSID; 717 configuration.BSSID = TEST_BSSID; 718 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 719 WifiNetworkSuggestion suggestion = 720 new WifiNetworkSuggestion(configuration, null, false, false, true, true); 721 722 WifiConfiguration configuration1 = new WifiConfiguration(); 723 configuration1.SSID = TEST_SSID; 724 configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 725 WifiNetworkSuggestion suggestion1 = 726 new WifiNetworkSuggestion(configuration1, null, false, false, true, true); 727 728 assertNotEquals(suggestion, suggestion1); 729 } 730 731 /** 732 * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same 733 * SSID, BSSID and UID, but different key mgmt. 734 */ 735 @Test testWifiNetworkSuggestionEqualsFailsWhenKeyMgmtIsDifferent()736 public void testWifiNetworkSuggestionEqualsFailsWhenKeyMgmtIsDifferent() { 737 WifiConfiguration configuration = new WifiConfiguration(); 738 configuration.SSID = TEST_SSID; 739 configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); 740 WifiNetworkSuggestion suggestion = 741 new WifiNetworkSuggestion(configuration, null, false, false, true, true); 742 743 WifiConfiguration configuration1 = new WifiConfiguration(); 744 configuration1.SSID = TEST_SSID; 745 configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 746 WifiNetworkSuggestion suggestion1 = 747 new WifiNetworkSuggestion(configuration1, null, false, false, true, true); 748 749 assertNotEquals(suggestion, suggestion1); 750 } 751 752 /** 753 * Check NetworkSuggestion equals returns {@code true} for 2 Passpoint network suggestions with 754 * same FQDN. 755 */ 756 @Test testPasspointNetworkSuggestionEqualsSameWithSameFQDN()757 public void testPasspointNetworkSuggestionEqualsSameWithSameFQDN() { 758 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 759 PasspointConfiguration passpointConfiguration1 = PasspointTestUtils.createConfig(); 760 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 761 .setPasspointConfig(passpointConfiguration) 762 .build(); 763 WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() 764 .setPasspointConfig(passpointConfiguration1) 765 .build(); 766 assertEquals(suggestion, suggestion1); 767 assertEquals(suggestion.hashCode(), suggestion1.hashCode()); 768 } 769 770 /** 771 * Check NetworkSuggestion equals returns {@code false} for 2 Passpoint network suggestions with 772 * different FQDN. 773 */ 774 @Test testPasspointNetworkSuggestionNotEqualsSameWithDifferentFQDN()775 public void testPasspointNetworkSuggestionNotEqualsSameWithDifferentFQDN() { 776 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 777 PasspointConfiguration passpointConfiguration1 = PasspointTestUtils.createConfig(); 778 passpointConfiguration1.getHomeSp().setFqdn(TEST_FQDN + 1); 779 780 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 781 .setPasspointConfig(passpointConfiguration) 782 .build(); 783 WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() 784 .setPasspointConfig(passpointConfiguration1) 785 .build(); 786 assertNotEquals(suggestion, suggestion1); 787 } 788 789 /** 790 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 791 * when {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} to 792 * true on a open network suggestion. 793 */ 794 @Test(expected = IllegalStateException.class) testSetCredentialSharedWithUserWithOpenNetwork()795 public void testSetCredentialSharedWithUserWithOpenNetwork() { 796 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 797 .setSsid(TEST_SSID) 798 .setCredentialSharedWithUser(true) 799 .build(); 800 } 801 802 /** 803 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 804 * when {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)} to 805 * false on a open network suggestion. 806 */ 807 @Test(expected = IllegalStateException.class) testSetIsAutoJoinDisabledWithOpenNetwork()808 public void testSetIsAutoJoinDisabledWithOpenNetwork() { 809 new WifiNetworkSuggestion.Builder() 810 .setSsid(TEST_SSID) 811 .setIsInitialAutojoinEnabled(false) 812 .build(); 813 } 814 815 /** 816 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 817 * when set both {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)} 818 * and {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} (boolean)} 819 * to false on a network suggestion. 820 */ 821 @Test(expected = IllegalStateException.class) testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUser()822 public void testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUser() { 823 new WifiNetworkSuggestion.Builder() 824 .setSsid(TEST_SSID) 825 .setWpa2Passphrase(TEST_PRESHARED_KEY) 826 .setCredentialSharedWithUser(false) 827 .setIsInitialAutojoinEnabled(false) 828 .build(); 829 } 830 831 /** 832 * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the 833 * correct value to the WifiConfiguration. 834 */ 835 @Test testSetIsNetworkAsUntrusted()836 public void testSetIsNetworkAsUntrusted() { 837 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 838 .setSsid(TEST_SSID) 839 .setWpa2Passphrase(TEST_PRESHARED_KEY) 840 .setUntrusted(true) 841 .build(); 842 assertTrue(suggestion.isUntrusted()); 843 assertFalse(suggestion.isUserAllowedToManuallyConnect); 844 } 845 846 /** 847 * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the 848 * correct value to the WifiConfiguration. 849 * Also the {@link WifiNetworkSuggestion#isUserAllowedToManuallyConnect} should be false; 850 */ 851 @Test testSetIsNetworkAsUntrustedOnPasspointNetwork()852 public void testSetIsNetworkAsUntrustedOnPasspointNetwork() { 853 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 854 WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() 855 .setPasspointConfig(passpointConfiguration) 856 .setUntrusted(true) 857 .build(); 858 assertTrue(suggestion.isUntrusted()); 859 assertFalse(suggestion.isUserAllowedToManuallyConnect); 860 } 861 862 /** 863 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 864 * when set {@link WifiNetworkSuggestion.Builder#setUntrusted(boolean)} to true and 865 * set {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} to true 866 * together. 867 */ 868 @Test(expected = IllegalStateException.class) testSetCredentialSharedWithUserWithSetIsNetworkAsUntrusted()869 public void testSetCredentialSharedWithUserWithSetIsNetworkAsUntrusted() { 870 new WifiNetworkSuggestion.Builder() 871 .setSsid(TEST_SSID) 872 .setWpa2Passphrase(TEST_PRESHARED_KEY) 873 .setCredentialSharedWithUser(true) 874 .setUntrusted(true) 875 .build(); 876 } 877 878 /** 879 * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception 880 * when set both {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)} 881 * and {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} (boolean)} 882 * to false on a passpoint suggestion. 883 */ 884 @Test(expected = IllegalStateException.class) testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUserForPasspoint()885 public void testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUserForPasspoint() { 886 PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig(); 887 new WifiNetworkSuggestion.Builder() 888 .setPasspointConfig(passpointConfiguration) 889 .setCredentialSharedWithUser(false) 890 .setIsInitialAutojoinEnabled(false) 891 .build(); 892 } 893 } 894