• 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 android.net.wifi.ScanResult.WIFI_BAND_5_GHZ;
20 import static android.os.PatternMatcher.PATTERN_LITERAL;
21 import static android.os.PatternMatcher.PATTERN_PREFIX;
22 import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
23 
24 import static org.junit.Assert.assertArrayEquals;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertThrows;
30 import static org.junit.Assert.assertTrue;
31 import static org.junit.Assume.assumeTrue;
32 
33 import android.net.MacAddress;
34 import android.net.MatchAllNetworkSpecifier;
35 import android.net.NetworkSpecifier;
36 import android.os.Parcel;
37 import android.os.PatternMatcher;
38 import android.util.Pair;
39 
40 import androidx.test.filters.SmallTest;
41 
42 import com.android.modules.utils.build.SdkLevel;
43 
44 import org.junit.Test;
45 
46 import java.security.cert.X509Certificate;
47 
48 /**
49  * Unit tests for {@link android.net.wifi.WifiNetworkSpecifier}.
50  */
51 @SmallTest
52 public class WifiNetworkSpecifierTest {
53     private static final String TEST_SSID = "Test123";
54     private static final String TEST_BSSID_OUI_BASE_ADDRESS = "12:12:12:00:00:00";
55     private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
56     private static final String TEST_BSSID = "12:12:12:12:12:12";
57     private static final String TEST_PRESHARED_KEY = "\"Test123\"";
58     private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch";
59 
60     /**
61      * Validate correctness of WifiNetworkSpecifier object created by
62      * {@link WifiNetworkSpecifier.Builder#build()} for open network with SSID pattern.
63      */
64     @Test
testWifiNetworkSpecifierBuilderForOpenNetworkWithSsidPattern()65     public void testWifiNetworkSpecifierBuilderForOpenNetworkWithSsidPattern() {
66         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
67                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
68                 .build();
69 
70         assertTrue(specifier instanceof WifiNetworkSpecifier);
71         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
72 
73         assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
74         assertEquals(PATTERN_PREFIX, wifiNetworkSpecifier.ssidPatternMatcher.getType());
75         assertEquals(WifiManager.ALL_ZEROS_MAC_ADDRESS,
76                 wifiNetworkSpecifier.bssidPatternMatcher.first);
77         assertEquals(WifiManager.ALL_ZEROS_MAC_ADDRESS,
78                 wifiNetworkSpecifier.bssidPatternMatcher.second);
79         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
80                 .get(WifiConfiguration.KeyMgmt.NONE));
81     }
82 
83     /**
84      * Validate correctness of WifiNetworkSpecifier object created by
85      * {@link WifiNetworkSpecifier.Builder#build()} for WPA_PSK network with BSSID
86      * pattern.
87      */
88     @Test
testWifiNetworkSpecifierBuilderForWpa2PskNetworkWithBssidPattern()89     public void testWifiNetworkSpecifierBuilderForWpa2PskNetworkWithBssidPattern() {
90         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
91                 .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
92                         MacAddress.fromString(TEST_BSSID_OUI_MASK))
93                 .setWpa2Passphrase(TEST_PRESHARED_KEY)
94                 .build();
95 
96         assertTrue(specifier instanceof WifiNetworkSpecifier);
97         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
98 
99         assertEquals(".*", wifiNetworkSpecifier.ssidPatternMatcher.getPath());
100         assertEquals(PATTERN_SIMPLE_GLOB, wifiNetworkSpecifier.ssidPatternMatcher.getType());
101         assertEquals(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
102                 wifiNetworkSpecifier.bssidPatternMatcher.first);
103         assertEquals(MacAddress.fromString(TEST_BSSID_OUI_MASK),
104                 wifiNetworkSpecifier.bssidPatternMatcher.second);
105         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
106                 .get(WifiConfiguration.KeyMgmt.WPA_PSK));
107         assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
108                 wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
109     }
110 
111     /**
112      * Validate correctness of WifiNetworkSpecifier object created by
113      * {@link WifiNetworkSpecifier.Builder#build()} for WPA_EAP network with
114      * SSID and BSSID pattern.
115      */
116     @Test
testWifiNetworkSpecifierBuilderForWpa2EapHiddenNetworkWithSsidAndBssid()117     public void testWifiNetworkSpecifierBuilderForWpa2EapHiddenNetworkWithSsidAndBssid() {
118         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
119         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
120         enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
121 
122         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
123                 .setSsid(TEST_SSID)
124                 .setBssid(MacAddress.fromString(TEST_BSSID))
125                 .setWpa2EnterpriseConfig(enterpriseConfig)
126                 .setIsHiddenSsid(true)
127                 .build();
128 
129         assertTrue(specifier instanceof WifiNetworkSpecifier);
130         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
131 
132         assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
133         assertEquals(PATTERN_LITERAL, wifiNetworkSpecifier.ssidPatternMatcher.getType());
134         assertEquals(MacAddress.fromString(TEST_BSSID),
135                 wifiNetworkSpecifier.bssidPatternMatcher.first);
136         assertEquals(MacAddress.BROADCAST_ADDRESS,
137                 wifiNetworkSpecifier.bssidPatternMatcher.second);
138         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
139                 .get(WifiConfiguration.KeyMgmt.WPA_EAP));
140         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
141                 .get(WifiConfiguration.KeyMgmt.IEEE8021X));
142         assertTrue(wifiNetworkSpecifier.wifiConfiguration.hiddenSSID);
143         assertEquals(enterpriseConfig.getEapMethod(),
144                 wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getEapMethod());
145         assertEquals(enterpriseConfig.getPhase2Method(),
146                 wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method());
147     }
148 
149     /**
150      * Validate correctness of WifiNetworkSpecifier object created by
151      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise network.
152      */
153     @Test
testWifiNetworkSpecifierBuilderForWpa3EapNetwork()154     public void testWifiNetworkSpecifierBuilderForWpa3EapNetwork() {
155         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
156         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
157         enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
158         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
159 
160         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
161                 .setSsid(TEST_SSID)
162                 .setWpa3EnterpriseConfig(enterpriseConfig)
163                 .build();
164 
165         assertTrue(specifier instanceof WifiNetworkSpecifier);
166         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
167 
168         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
169         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
170                 .get(WifiConfiguration.KeyMgmt.IEEE8021X));
171         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
172                 .get(WifiConfiguration.KeyMgmt.WPA_EAP));
173         assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
174                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
175         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
176                 .get(WifiConfiguration.GroupCipher.CCMP));
177         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
178         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
179         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
180     }
181 
182     /**
183      * Validate correctness of WifiNetworkSpecifier object created by
184      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise network.
185      */
186     @Test
testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithStandardApi()187     public void testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithStandardApi() {
188         assumeTrue(SdkLevel.isAtLeastS());
189         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
190         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
191         enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
192         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
193 
194         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
195                 .setSsid(TEST_SSID)
196                 .setWpa3EnterpriseStandardModeConfig(enterpriseConfig)
197                 .build();
198 
199         assertTrue(specifier instanceof WifiNetworkSpecifier);
200         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
201 
202         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
203         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
204                 .get(WifiConfiguration.KeyMgmt.IEEE8021X));
205         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
206                 .get(WifiConfiguration.KeyMgmt.WPA_EAP));
207         assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
208                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
209         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
210                 .get(WifiConfiguration.GroupCipher.CCMP));
211         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
212         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
213         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
214     }
215 
216     /**
217      * Validate correctness of WifiNetworkSpecifier object created by
218      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise network
219      * with 192-bit RSA certificates.
220      */
221     @Test
testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithSuiteBRsaCerts()222     public void testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithSuiteBRsaCerts() {
223         assumeTrue(SdkLevel.isAtLeastS());
224         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
225         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
226         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
227         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
228                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
229 
230         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
231 
232         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
233                 .setSsid(TEST_SSID)
234                 .setWpa3EnterpriseStandardModeConfig(enterpriseConfig)
235                 .build();
236 
237         assertTrue(specifier instanceof WifiNetworkSpecifier);
238         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
239 
240         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
241         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
242                 .get(WifiConfiguration.KeyMgmt.IEEE8021X));
243         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
244                 .get(WifiConfiguration.KeyMgmt.WPA_EAP));
245         assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
246                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
247         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
248                 .get(WifiConfiguration.GroupCipher.CCMP));
249         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
250         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
251         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
252     }
253 
254     /**
255      * Validate correctness of WifiNetworkSpecifier object created by
256      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise network
257      * with 192-bit ECC certificates.
258      */
259     @Test
testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithSuiteBEccCerts()260     public void testWifiNetworkSpecifierBuilderForWpa3EapNetworkWithSuiteBEccCerts() {
261         assumeTrue(SdkLevel.isAtLeastS());
262         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
263         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
264         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
265         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
266                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
267 
268         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
269 
270         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
271                 .setSsid(TEST_SSID)
272                 .setWpa3EnterpriseStandardModeConfig(enterpriseConfig)
273                 .build();
274 
275         assertTrue(specifier instanceof WifiNetworkSpecifier);
276         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
277 
278         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
279         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
280                 .get(WifiConfiguration.KeyMgmt.IEEE8021X));
281         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
282                 .get(WifiConfiguration.KeyMgmt.WPA_EAP));
283         assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
284                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
285         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
286                 .get(WifiConfiguration.GroupCipher.CCMP));
287         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
288         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
289         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
290     }
291 
292     /**
293      * Validate correctness of WifiNetworkSpecifier object created by
294      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
295      */
296     @Test
testWifiNetworkSpecifierBuilderForWpa3SuiteBRsaEapNetwork()297     public void testWifiNetworkSpecifierBuilderForWpa3SuiteBRsaEapNetwork() {
298         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
299         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
300         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
301         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
302                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
303 
304         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
305 
306         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
307                 .setSsid(TEST_SSID)
308                 .setWpa3EnterpriseConfig(enterpriseConfig)
309                 .build();
310 
311         assertTrue(specifier instanceof WifiNetworkSpecifier);
312         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
313 
314         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
315         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
316                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
317         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
318                 .get(WifiConfiguration.GroupCipher.GCMP_256));
319         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
320                 .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
321         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
322         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
323         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
324     }
325 
326     /**
327      * Validate correctness of WifiNetworkSpecifier object created by
328      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
329      */
330     @Test
testWifiNetworkSpecifierBuilderForWpa3SuiteBEccEapNetwork()331     public void testWifiNetworkSpecifierBuilderForWpa3SuiteBEccEapNetwork() {
332         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
333         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
334         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
335         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
336                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
337 
338         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
339 
340         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
341                 .setSsid(TEST_SSID)
342                 .setWpa3EnterpriseConfig(enterpriseConfig)
343                 .build();
344 
345         assertTrue(specifier instanceof WifiNetworkSpecifier);
346         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
347 
348         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
349         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
350                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
351         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
352                 .get(WifiConfiguration.GroupCipher.GCMP_256));
353         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
354                 .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
355         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
356         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
357         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
358     }
359 
360     /**
361      * Validate correctness of WifiNetworkSpecifier object created by
362      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
363      */
364     @Test
testWifiNetworkSpecifierBuilderForWpa3SuiteBRsaEapNetworkWith192BitApi()365     public void testWifiNetworkSpecifierBuilderForWpa3SuiteBRsaEapNetworkWith192BitApi() {
366         assumeTrue(SdkLevel.isAtLeastS());
367         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
368         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
369         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
370         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
371                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
372 
373         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
374 
375         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
376                 .setSsid(TEST_SSID)
377                 .setWpa3Enterprise192BitModeConfig(enterpriseConfig)
378                 .build();
379 
380         assertTrue(specifier instanceof WifiNetworkSpecifier);
381         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
382 
383         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
384         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
385                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
386         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
387                 .get(WifiConfiguration.GroupCipher.GCMP_256));
388         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
389                 .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
390         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
391         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
392         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
393     }
394 
395     /**
396      * Validate correctness of WifiNetworkSpecifier object created by
397      * {@link WifiNetworkSpecifier.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
398      */
399     @Test
testWifiNetworkSpecifierBuilderForWpa3SuiteBEccEapNetworkWith192BitApi()400     public void testWifiNetworkSpecifierBuilderForWpa3SuiteBEccEapNetworkWith192BitApi() {
401         assumeTrue(SdkLevel.isAtLeastS());
402         WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
403         enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
404         enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
405         enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
406                 new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
407 
408         enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
409 
410         NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
411                 .setSsid(TEST_SSID)
412                 .setWpa3Enterprise192BitModeConfig(enterpriseConfig)
413                 .build();
414 
415         assertTrue(specifier instanceof WifiNetworkSpecifier);
416         WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
417 
418         assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
419         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
420                 .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
421         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
422                 .get(WifiConfiguration.GroupCipher.GCMP_256));
423         assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
424                 .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
425         assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
426         assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
427         assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
428     }
429 
430     /**
431      * Ensure {@link WifiNetworkSpecifier.Builder#setSsid(String)} throws an exception
432      * when the string is not Unicode.
433      */
434     @Test(expected = IllegalArgumentException.class)
testWifiNetworkSpecifierBuilderSetSsidWithNonUnicodeString()435     public void testWifiNetworkSpecifierBuilderSetSsidWithNonUnicodeString() {
436         new WifiNetworkSpecifier.Builder()
437                 .setSsid("\ud800")
438                 .build();
439     }
440 
441     /**
442      * Ensure {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} throws an exception
443      * when the string is not ASCII encodable.
444      */
445     @Test(expected = IllegalArgumentException.class)
testWifiNetworkSpecifierSetWpa2PasphraseWithNonAsciiString()446     public void testWifiNetworkSpecifierSetWpa2PasphraseWithNonAsciiString() {
447         new WifiNetworkSpecifier.Builder()
448                 .setSsid(TEST_SSID)
449                 .setWpa2Passphrase("salvē")
450                 .build();
451     }
452 
453     /**
454      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
455      * when neither SSID nor BSSID patterns were set.
456      */
457     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithNoSsidAndBssidPattern()458     public void testWifiNetworkSpecifierBuilderWithNoSsidAndBssidPattern() {
459         new WifiNetworkSpecifier.Builder().build();
460     }
461 
462     /**
463      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
464      * when match-all SSID pattern is set.
465      */
466     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern1()467     public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern1() {
468         new WifiNetworkSpecifier.Builder()
469                 .setSsidPattern(new PatternMatcher(".*", PATTERN_SIMPLE_GLOB))
470                 .build();
471     }
472 
473     /**
474      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
475      * when match-all SSID pattern is set.
476      */
477     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern2()478     public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern2() {
479         new WifiNetworkSpecifier.Builder()
480                 .setSsidPattern(new PatternMatcher(".*", PatternMatcher.PATTERN_ADVANCED_GLOB))
481                 .build();
482     }
483 
484     /**
485      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
486      * when match-all SSID pattern is set.
487      */
488     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern3()489     public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern3() {
490         new WifiNetworkSpecifier.Builder()
491                 .setSsidPattern(new PatternMatcher("", PATTERN_PREFIX))
492                 .build();
493     }
494 
495     /**
496      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
497      * when match-all BSSID pattern is set.
498      */
499     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchAllBssidPattern()500     public void testWifiNetworkSpecifierBuilderWithMatchAllBssidPattern() {
501         new WifiNetworkSpecifier.Builder()
502                 .setBssidPattern(WifiManager.ALL_ZEROS_MAC_ADDRESS,
503                         WifiManager.ALL_ZEROS_MAC_ADDRESS)
504                 .build();
505     }
506 
507     /**
508      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
509      * when match-none SSID pattern is set.
510      */
511     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern1()512     public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern1() {
513         new WifiNetworkSpecifier.Builder()
514                 .setSsidPattern(new PatternMatcher("", PatternMatcher.PATTERN_LITERAL))
515                 .build();
516     }
517 
518     /**
519      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
520      * when match-none SSID pattern is set.
521      */
522     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern2()523     public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern2() {
524         new WifiNetworkSpecifier.Builder()
525                 .setSsid("")
526                 .build();
527     }
528 
529     /**
530      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
531      * when match-none BSSID pattern is set.
532      */
533     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern1()534     public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern1() {
535         new WifiNetworkSpecifier.Builder()
536                 .setBssidPattern(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS)
537                 .build();
538     }
539 
540     /**
541      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
542      * when match-none BSSID pattern is set.
543      */
544     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern2()545     public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern2() {
546         new WifiNetworkSpecifier.Builder()
547                 .setBssid(MacAddress.BROADCAST_ADDRESS)
548                 .build();
549     }
550 
551     /**
552      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
553      * when match-none BSSID pattern is set.
554      */
555     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern3()556     public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern3() {
557         new WifiNetworkSpecifier.Builder()
558                 .setBssid(WifiManager.ALL_ZEROS_MAC_ADDRESS)
559                 .build();
560     }
561 
562     /**
563      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
564      * when SSID pattern is set for hidden network.
565      */
566     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithBssidMatchPatternForHiddenNetwork()567     public void testWifiNetworkSpecifierBuilderWithBssidMatchPatternForHiddenNetwork() {
568         new WifiNetworkSpecifier.Builder()
569                 .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
570                         MacAddress.fromString(TEST_BSSID_OUI_MASK))
571                 .setIsHiddenSsid(true)
572                 .build();
573     }
574 
575     /**
576      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
577      * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
578      * {@link WifiNetworkSpecifier.Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)} are
579      * invoked.
580      */
581     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndEnterpriseConfig()582     public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndEnterpriseConfig() {
583         new WifiNetworkSpecifier.Builder()
584                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
585                 .setWpa2Passphrase(TEST_PRESHARED_KEY)
586                 .setWpa2EnterpriseConfig(new WifiEnterpriseConfig())
587                 .build();
588     }
589 
590     /**
591      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
592      * when SSID pattern is set for hidden network.
593      */
594     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithSsidMatchPatternForHiddenNetwork()595     public void testWifiNetworkSpecifierBuilderWithSsidMatchPatternForHiddenNetwork() {
596         new WifiNetworkSpecifier.Builder()
597                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
598                 .setIsHiddenSsid(true)
599                 .build();
600     }
601 
602     /**
603      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
604      * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
605      * {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} are invoked.
606      */
607     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndWpa3Passphrase()608     public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
609         new WifiNetworkSpecifier.Builder()
610                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
611                 .setWpa2Passphrase(TEST_PRESHARED_KEY)
612                 .setWpa3Passphrase(TEST_PRESHARED_KEY)
613                 .build();
614     }
615 
616     /**
617      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
618      * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
619      * {@link WifiNetworkSpecifier.Builder
620      * #setWpa3EnterpriseStandardModeConfig(WifiEnterpriseConfig)}
621      * are invoked.
622      */
623     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnterprise()624     public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnterprise() {
625         assumeTrue(SdkLevel.isAtLeastS());
626         new WifiNetworkSpecifier.Builder()
627                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
628                 .setWpa3Passphrase(TEST_PRESHARED_KEY)
629                 .setWpa3EnterpriseStandardModeConfig(new WifiEnterpriseConfig())
630                 .build();
631     }
632 
633     /**
634      * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
635      * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
636      * {@link WifiNetworkSpecifier.Builder#setIsEnhancedOpen(boolean)} are invoked.
637      */
638     @Test(expected = IllegalStateException.class)
testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnhancedOpen()639     public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
640         new WifiNetworkSpecifier.Builder()
641                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
642                 .setWpa3Passphrase(TEST_PRESHARED_KEY)
643                 .setIsEnhancedOpen(true)
644                 .build();
645     }
646 
647     /**
648      * Validate that parcel marshalling/unmarshalling works
649      */
650     @Test
testWifiNetworkSpecifierParcel()651     public void testWifiNetworkSpecifierParcel() {
652         WifiConfiguration wifiConfiguration = new WifiConfiguration();
653         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
654         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
655         WifiNetworkSpecifier specifier =
656                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
657                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
658                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
659                         WIFI_BAND_5_GHZ,
660                         wifiConfiguration, new int[0]);
661 
662         Parcel parcelW = Parcel.obtain();
663         specifier.writeToParcel(parcelW, 0);
664         byte[] bytes = parcelW.marshall();
665         parcelW.recycle();
666 
667         Parcel parcelR = Parcel.obtain();
668         parcelR.unmarshall(bytes, 0, bytes.length);
669         parcelR.setDataPosition(0);
670         WifiNetworkSpecifier parcelSpecifier =
671                 WifiNetworkSpecifier.CREATOR.createFromParcel(parcelR);
672 
673         assertEquals(specifier, parcelSpecifier);
674     }
675 
676     /**
677      * Validate NetworkSpecifier matching.
678      * a) Create a network specifier for WPA_PSK network
679      * b) Ensure that the specifier does not match {@code null} and {@link MatchAllNetworkSpecifier}
680      * specifiers.
681      */
682     @Test
testWifiNetworkSpecifierDoesNotSatisfyNullAndAllMatch()683     public void testWifiNetworkSpecifierDoesNotSatisfyNullAndAllMatch() {
684         WifiConfiguration wifiConfiguration = new WifiConfiguration();
685         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
686         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
687         WifiNetworkSpecifier specifier =
688                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
689                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
690                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
691                         ScanResult.UNSPECIFIED,  /* band */
692                         wifiConfiguration, new int[0]);
693 
694         assertFalse(specifier.canBeSatisfiedBy(null));
695         assertFalse(specifier.canBeSatisfiedBy(new MatchAllNetworkSpecifier()));
696     }
697 
698     /**
699      * Validate NetworkSpecifier matching.
700      * a) Create network specifier 1 for WPA_PSK network
701      * b) Create network specifier 2 with the same params as specifier 1.
702      * c) Ensure that the specifier 2 is satisfied by specifier 1.
703      */
704     @Test
testWifiNetworkSpecifierSatisfiesSame()705     public void testWifiNetworkSpecifierSatisfiesSame() {
706         WifiConfiguration wifiConfiguration = new WifiConfiguration();
707         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
708         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
709 
710         WifiNetworkSpecifier specifier1 =
711                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
712                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
713                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
714                         WIFI_BAND_5_GHZ,
715                         wifiConfiguration, new int[0]);
716 
717         WifiNetworkSpecifier specifier2 =
718                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
719                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
720                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
721                         WIFI_BAND_5_GHZ,
722                         wifiConfiguration, new int[0]);
723 
724         assertTrue(specifier2.canBeSatisfiedBy(specifier1));
725     }
726 
727     /**
728      * Validate NetworkSpecifier matching.
729      * a) Create network specifier 1 for WPA_PSK network
730      * b) Create network specifier 2 with different key mgmt params.
731      * c) Ensure that the specifier 2 is not satisfied by specifier 1.
732      */
733     @Test
testWifiNetworkSpecifierDoesNotSatisfyWhenKeyMgmtDifferent()734     public void testWifiNetworkSpecifierDoesNotSatisfyWhenKeyMgmtDifferent() {
735         WifiConfiguration wifiConfiguration1 = new WifiConfiguration();
736         wifiConfiguration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
737         wifiConfiguration1.preSharedKey = TEST_PRESHARED_KEY;
738 
739         WifiNetworkSpecifier specifier1 =
740                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
741                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
742                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
743                         ScanResult.WIFI_BAND_24_GHZ,
744                         wifiConfiguration1, new int[0]);
745 
746         WifiConfiguration wifiConfiguration2 = new WifiConfiguration();
747         wifiConfiguration2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
748         WifiNetworkSpecifier specifier2 =
749                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
750                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
751                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
752                         ScanResult.WIFI_BAND_24_GHZ,
753                         wifiConfiguration2, new int[0]);
754 
755         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
756     }
757 
758     /**
759      * Validate NetworkSpecifier matching.
760      * a) Create network specifier 1 for WPA_PSK network
761      * b) Create network specifier 2 with different SSID pattern.
762      * c) Ensure that the specifier 2 is not satisfied by specifier 1.
763      */
764     @Test
testWifiNetworkSpecifierDoesNotSatisfyWhenSsidDifferent()765     public void testWifiNetworkSpecifierDoesNotSatisfyWhenSsidDifferent() {
766         WifiConfiguration wifiConfiguration = new WifiConfiguration();
767         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
768         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
769 
770         WifiNetworkSpecifier specifier1 =
771                 new WifiNetworkSpecifier(new PatternMatcher("", PATTERN_LITERAL),
772                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
773                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
774                         WIFI_BAND_5_GHZ,
775                         wifiConfiguration, new int[0]);
776 
777         WifiNetworkSpecifier specifier2 =
778                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
779                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
780                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
781                         WIFI_BAND_5_GHZ,
782                         wifiConfiguration, new int[0]);
783 
784         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
785     }
786 
787     /**
788      * Validate NetworkSpecifier matching.
789      * a) Create network specifier 1 for WPA_PSK network
790      * b) Create network specifier 2 with different BSSID pattern.
791      * c) Ensure that the specifier 2 is not satisfied by specifier 1.
792      */
793     @Test
testWifiNetworkSpecifierDoesNotSatisfyWhenBssidDifferent()794     public void testWifiNetworkSpecifierDoesNotSatisfyWhenBssidDifferent() {
795         WifiConfiguration wifiConfiguration = new WifiConfiguration();
796         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
797         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
798 
799         WifiNetworkSpecifier specifier1 =
800                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
801                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
802                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
803                         ScanResult.WIFI_BAND_24_GHZ,
804                         wifiConfiguration, new int[0]);
805 
806         WifiNetworkSpecifier specifier2 =
807                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
808                         Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS,
809                                 WifiManager.ALL_ZEROS_MAC_ADDRESS),
810                         ScanResult.WIFI_BAND_24_GHZ,
811                         wifiConfiguration, new int[0]);
812 
813         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
814     }
815 
816     /**
817      * Validate NetworkSpecifier band matching.
818      */
819     @Test
testWifiNetworkSpecifierBandMatching()820     public void testWifiNetworkSpecifierBandMatching() {
821         WifiConfiguration wifiConfiguration = new WifiConfiguration();
822         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
823         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
824 
825         WifiNetworkSpecifier specifier1 =
826                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
827                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
828                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
829                         ScanResult.WIFI_BAND_24_GHZ,
830                         wifiConfiguration, new int[0]);
831 
832         WifiNetworkSpecifier specifier2 =
833                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
834                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
835                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
836                         ScanResult.WIFI_BAND_24_GHZ,
837                         wifiConfiguration, new int[0]);
838 
839         // Same band matches.
840         assertTrue(specifier2.canBeSatisfiedBy(specifier1));
841         assertTrue(specifier1.canBeSatisfiedBy(specifier2));
842 
843         specifier2 =
844                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
845                         Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS,
846                                 WifiManager.ALL_ZEROS_MAC_ADDRESS),
847                         WIFI_BAND_5_GHZ,
848                         wifiConfiguration, new int[0]);
849 
850         // Different band does not match.
851         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
852         assertFalse(specifier1.canBeSatisfiedBy(specifier2));
853 
854         specifier1 =
855                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
856                         Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS,
857                                 WifiManager.ALL_ZEROS_MAC_ADDRESS),
858                         ScanResult.UNSPECIFIED,
859                         wifiConfiguration, new int[0]);
860 
861         // An UNSPECIFIED band does not match a specified band, because a WifiNetworkSpecifier
862         // satisfies another only if they are equal.
863         assertFalse(specifier2.canBeSatisfiedBy(specifier1));
864         assertFalse(specifier1.canBeSatisfiedBy(specifier2));
865     }
866 
867     /**
868      * Test WifiNetworkSpecifier redaction.
869      */
870     @Test
testRedact()871     public void testRedact() {
872         WifiConfiguration wifiConfiguration = new WifiConfiguration();
873         wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
874         wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
875 
876         WifiNetworkSpecifier specifier =
877                 new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
878                         Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
879                                 MacAddress.fromString(TEST_BSSID_OUI_MASK)),
880                         WIFI_BAND_5_GHZ,
881                         wifiConfiguration, new int[0]);
882 
883         final NetworkSpecifier redacted = specifier.redact();
884         if (SdkLevel.isAtLeastS()) {
885             assertEquals(
886                     new WifiNetworkSpecifier.Builder().setBand(WIFI_BAND_5_GHZ).build(),
887                     redacted);
888         } else {
889             assertTrue(redacted == specifier);
890         }
891     }
892 
893     @Test
testSetPreferredChannel()894     public void testSetPreferredChannel() {
895         WifiNetworkSpecifier.Builder builder = new WifiNetworkSpecifier.Builder()
896                 .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX));
897         assertThrows(IllegalArgumentException.class, () -> builder
898                 .setPreferredChannelsFrequenciesMhz(new int[]{0}));
899         WifiNetworkSpecifier networkSpecifier = builder
900                 .setPreferredChannelsFrequenciesMhz(new int[]{5180}).build();
901         assertArrayEquals(new int[]{5180}, networkSpecifier.getPreferredChannelFrequenciesMhz());
902         builder.setBand(WIFI_BAND_5_GHZ);
903         assertThrows(IllegalStateException.class, builder::build);
904     }
905 }
906