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