• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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