• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.net.wifi;
18 
19 import static org.junit.Assert.assertArrayEquals;
20 import static org.junit.Assert.assertEquals;
21 import static org.junit.Assert.assertFalse;
22 import static org.junit.Assert.assertNull;
23 import static org.junit.Assert.assertTrue;
24 import static org.mockito.Mockito.validateMockitoUsage;
25 
26 import android.net.wifi.ScanResult.InformationElement;
27 import android.os.Parcel;
28 
29 import androidx.test.filters.SmallTest;
30 
31 import org.junit.After;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.mockito.MockitoAnnotations;
35 
36 /**
37  * Unit tests for {@link android.net.wifi.WifiScanner}.
38  */
39 @SmallTest
40 public class ScanResultTest {
41     public static final String TEST_SSID = "\"test_ssid\"";
42     public static final String TEST_BSSID = "04:ac:fe:45:34:10";
43     public static final String TEST_CAPS = "CCMP";
44     public static final int TEST_LEVEL = -56;
45     public static final int TEST_FREQUENCY = 2412;
46     public static final long TEST_TSF = 04660l;
47     public static final @WifiAnnotations.WifiStandard int TEST_WIFI_STANDARD =
48             ScanResult.WIFI_STANDARD_11AC;
49     public static final String TEST_IFACE_NAME = "test_ifname";
50 
51     /**
52      * Frequency to channel map. This include some frequencies used outside the US.
53      * Representing it using a vector (instead of map) for simplification.
54      */
55     private static final int[] FREQUENCY_TO_CHANNEL_MAP = {
56             2412, WifiScanner.WIFI_BAND_24_GHZ, 1,
57             2417, WifiScanner.WIFI_BAND_24_GHZ, 2,
58             2422, WifiScanner.WIFI_BAND_24_GHZ, 3,
59             2427, WifiScanner.WIFI_BAND_24_GHZ, 4,
60             2432, WifiScanner.WIFI_BAND_24_GHZ, 5,
61             2437, WifiScanner.WIFI_BAND_24_GHZ, 6,
62             2442, WifiScanner.WIFI_BAND_24_GHZ, 7,
63             2447, WifiScanner.WIFI_BAND_24_GHZ, 8,
64             2452, WifiScanner.WIFI_BAND_24_GHZ, 9,
65             2457, WifiScanner.WIFI_BAND_24_GHZ, 10,
66             2462, WifiScanner.WIFI_BAND_24_GHZ, 11,
67             /* 12, 13 are only legitimate outside the US. */
68             2467, WifiScanner.WIFI_BAND_24_GHZ, 12,
69             2472, WifiScanner.WIFI_BAND_24_GHZ, 13,
70             /* 14 is for Japan, DSSS and CCK only. */
71             2484, WifiScanner.WIFI_BAND_24_GHZ, 14,
72             /* 34 valid in Japan. */
73             5170, WifiScanner.WIFI_BAND_5_GHZ, 34,
74             5180, WifiScanner.WIFI_BAND_5_GHZ, 36,
75             5190, WifiScanner.WIFI_BAND_5_GHZ, 38,
76             5200, WifiScanner.WIFI_BAND_5_GHZ, 40,
77             5210, WifiScanner.WIFI_BAND_5_GHZ, 42,
78             5220, WifiScanner.WIFI_BAND_5_GHZ, 44,
79             5230, WifiScanner.WIFI_BAND_5_GHZ, 46,
80             5240, WifiScanner.WIFI_BAND_5_GHZ, 48,
81             5260, WifiScanner.WIFI_BAND_5_GHZ, 52,
82             5280, WifiScanner.WIFI_BAND_5_GHZ, 56,
83             5300, WifiScanner.WIFI_BAND_5_GHZ, 60,
84             5320, WifiScanner.WIFI_BAND_5_GHZ, 64,
85             5500, WifiScanner.WIFI_BAND_5_GHZ, 100,
86             5520, WifiScanner.WIFI_BAND_5_GHZ, 104,
87             5540, WifiScanner.WIFI_BAND_5_GHZ, 108,
88             5560, WifiScanner.WIFI_BAND_5_GHZ, 112,
89             5580, WifiScanner.WIFI_BAND_5_GHZ, 116,
90             /* 120, 124, 128 valid in Europe/Japan. */
91             5600, WifiScanner.WIFI_BAND_5_GHZ, 120,
92             5620, WifiScanner.WIFI_BAND_5_GHZ, 124,
93             5640, WifiScanner.WIFI_BAND_5_GHZ, 128,
94             /* 132+ valid in US. */
95             5660, WifiScanner.WIFI_BAND_5_GHZ, 132,
96             5680, WifiScanner.WIFI_BAND_5_GHZ, 136,
97             5700, WifiScanner.WIFI_BAND_5_GHZ, 140,
98             /* 144 is supported by a subset of WiFi chips. */
99             5720, WifiScanner.WIFI_BAND_5_GHZ, 144,
100             5745, WifiScanner.WIFI_BAND_5_GHZ, 149,
101             5765, WifiScanner.WIFI_BAND_5_GHZ, 153,
102             5785, WifiScanner.WIFI_BAND_5_GHZ, 157,
103             5805, WifiScanner.WIFI_BAND_5_GHZ, 161,
104             5825, WifiScanner.WIFI_BAND_5_GHZ, 165,
105             5845, WifiScanner.WIFI_BAND_5_GHZ, 169,
106             5865, WifiScanner.WIFI_BAND_5_GHZ, 173,
107             /* Now some 6GHz channels */
108             5955, WifiScanner.WIFI_BAND_6_GHZ, 1,
109             5935, WifiScanner.WIFI_BAND_6_GHZ, 2,
110             5970, WifiScanner.WIFI_BAND_6_GHZ, 4,
111             6110, WifiScanner.WIFI_BAND_6_GHZ, 32
112     };
113 
114     /**
115      * Setup before tests.
116      */
117     @Before
setUp()118     public void setUp() throws Exception {
119         MockitoAnnotations.initMocks(this);
120     }
121 
122     /**
123      * Clean up after tests.
124      */
125     @After
cleanup()126     public void cleanup() {
127         validateMockitoUsage();
128     }
129 
130     /**
131      * Verify the logic that determines whether a frequency is PSC.
132      */
133     @Test
testIs6GHzPsc()134     public void testIs6GHzPsc() {
135         int test2G = 2412;
136         int test6GNonPsc = ScanResult.BAND_6_GHZ_PSC_START_MHZ
137                 + ScanResult.BAND_6_GHZ_PSC_STEP_SIZE_MHZ - 20;
138         int test6GPsc = ScanResult.BAND_6_GHZ_PSC_START_MHZ
139                 + ScanResult.BAND_6_GHZ_PSC_STEP_SIZE_MHZ;
140         assertFalse(ScanResult.is6GHzPsc(test2G));
141         assertFalse(ScanResult.is6GHzPsc(test6GNonPsc));
142         assertTrue(ScanResult.is6GHzPsc(test6GPsc));
143     }
144 
145     /**
146      * Verify parcel read/write for ScanResult.
147      */
148     @Test
verifyScanResultParcelWithoutRadioChainInfo()149     public void verifyScanResultParcelWithoutRadioChainInfo() throws Exception {
150         ScanResult writeScanResult = createScanResult();
151         ScanResult readScanResult = parcelReadWrite(writeScanResult);
152         assertScanResultEquals(writeScanResult, readScanResult);
153     }
154 
155     /**
156      * Verify parcel read/write for ScanResult.
157      */
158     @Test
verifyScanResultParcelWithZeroRadioChainInfo()159     public void verifyScanResultParcelWithZeroRadioChainInfo() throws Exception {
160         ScanResult writeScanResult = createScanResult();
161         writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[0];
162         ScanResult readScanResult = parcelReadWrite(writeScanResult);
163         assertNull(readScanResult.radioChainInfos);
164     }
165 
166     /**
167      * Verify parcel read/write for ScanResult.
168      */
169     @Test
verifyScanResultParcelWithRadioChainInfo()170     public void verifyScanResultParcelWithRadioChainInfo() throws Exception {
171         ScanResult writeScanResult = createScanResult();
172         writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
173         writeScanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
174         writeScanResult.radioChainInfos[0].id = 0;
175         writeScanResult.radioChainInfos[0].level = -45;
176         writeScanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
177         writeScanResult.radioChainInfos[1].id = 1;
178         writeScanResult.radioChainInfos[1].level = -54;
179         ScanResult readScanResult = parcelReadWrite(writeScanResult);
180         assertScanResultEquals(writeScanResult, readScanResult);
181     }
182 
183     /**
184      * Verify copy constructor for ScanResult.
185      */
186     @Test
verifyScanResultCopyWithoutRadioChainInfo()187     public void verifyScanResultCopyWithoutRadioChainInfo() throws Exception {
188         ScanResult scanResult = createScanResult();
189         ScanResult copyScanResult = new ScanResult(scanResult);
190         assertScanResultEquals(scanResult, copyScanResult);
191     }
192 
193     /**
194      * Verify copy constructor for ScanResult.
195      */
196     @Test
verifyScanResultCopyWithRadioChainInfo()197     public void verifyScanResultCopyWithRadioChainInfo() throws Exception {
198         ScanResult scanResult = createScanResult();
199         scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
200         scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
201         scanResult.radioChainInfos[0].id = 0;
202         scanResult.radioChainInfos[0].level = -45;
203         scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
204         scanResult.radioChainInfos[1].id = 1;
205         scanResult.radioChainInfos[1].level = -54;
206         ScanResult copyScanResult = new ScanResult(scanResult);
207         assertScanResultEquals(scanResult, copyScanResult);
208     }
209 
210     /**
211      * Verify parcel read/write for ScanResult with Information Element
212      */
213     @Test
verifyScanResultParcelWithInformationElement()214     public void verifyScanResultParcelWithInformationElement() throws Exception {
215         ScanResult writeScanResult = createScanResult();
216         writeScanResult.informationElements = new ScanResult.InformationElement[2];
217         writeScanResult.informationElements[0] = new ScanResult.InformationElement();
218         writeScanResult.informationElements[0].id = InformationElement.EID_HT_OPERATION;
219         writeScanResult.informationElements[0].idExt = 0;
220         writeScanResult.informationElements[0].bytes = new byte[]{0x11, 0x22, 0x33};
221         writeScanResult.informationElements[1] = new ScanResult.InformationElement();
222         writeScanResult.informationElements[1].id = InformationElement.EID_EXTENSION_PRESENT;
223         writeScanResult.informationElements[1].idExt = InformationElement.EID_EXT_HE_OPERATION;
224         writeScanResult.informationElements[1].bytes = new byte[]{0x44, 0x55, 0x66};
225         ScanResult readScanResult = new ScanResult(writeScanResult);
226         assertScanResultEquals(writeScanResult, readScanResult);
227     }
228 
229     /**
230      * Verify toString for ScanResult.
231      */
232     @Test
verifyScanResultToStringWithoutRadioChainInfo()233     public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception {
234         ScanResult scanResult = createScanResult();
235         assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
236                 + "level: -56, frequency: 2412, timestamp: 2480, "
237                 + "distance: 0(cm), distanceSd: 0(cm), "
238                 + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
239                 + "standard: 11ac, "
240                 + "80211mcResponder: is not supported, "
241                 + "Radio Chain Infos: null, interface name: test_ifname", scanResult.toString());
242     }
243 
244     /**
245      * Verify toString for ScanResult.
246      */
247     @Test
verifyScanResultToStringWithRadioChainInfo()248     public void verifyScanResultToStringWithRadioChainInfo() throws Exception {
249         ScanResult scanResult = createScanResult();
250         scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
251         scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
252         scanResult.radioChainInfos[0].id = 0;
253         scanResult.radioChainInfos[0].level = -45;
254         scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
255         scanResult.radioChainInfos[1].id = 1;
256         scanResult.radioChainInfos[1].level = -54;
257         assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
258                 + "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), "
259                 + "distanceSd: 0(cm), "
260                 + "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
261                 + "standard: 11ac, "
262                 + "80211mcResponder: is not supported, "
263                 + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
264                 + "RadioChainInfo: id=1, level=-54], interface name: test_ifname",
265                 scanResult.toString());
266     }
267 
268     /**
269      * verify frequency to channel conversion for all possible frequencies.
270      */
271     @Test
convertFrequencyToChannel()272     public void convertFrequencyToChannel() throws Exception {
273         for (int i = 0; i < FREQUENCY_TO_CHANNEL_MAP.length; i += 3) {
274             assertEquals(FREQUENCY_TO_CHANNEL_MAP[i + 2],
275                     ScanResult.convertFrequencyMhzToChannelIfSupported(
276                     FREQUENCY_TO_CHANNEL_MAP[i]));
277         }
278     }
279 
280     /**
281      * Verify frequency to channel conversion failed for an invalid frequency.
282      */
283     @Test
convertFrequencyToChannelWithInvalidFreq()284     public void convertFrequencyToChannelWithInvalidFreq() throws Exception {
285         assertEquals(-1, ScanResult.convertFrequencyMhzToChannelIfSupported(8000));
286     }
287 
288     /**
289      * Write the provided {@link ScanResult} to a parcel and deserialize it.
290      */
parcelReadWrite(ScanResult writeResult)291     private static ScanResult parcelReadWrite(ScanResult writeResult) throws Exception {
292         Parcel parcel = Parcel.obtain();
293         writeResult.writeToParcel(parcel, 0);
294         parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
295         return ScanResult.CREATOR.createFromParcel(parcel);
296     }
297 
createScanResult()298     private static ScanResult createScanResult() {
299         ScanResult result = new ScanResult();
300         result.wifiSsid = WifiSsid.createFromAsciiEncoded(TEST_SSID);
301         result.BSSID = TEST_BSSID;
302         result.capabilities = TEST_CAPS;
303         result.level = TEST_LEVEL;
304         result.frequency = TEST_FREQUENCY;
305         result.timestamp = TEST_TSF;
306         result.setWifiStandard(TEST_WIFI_STANDARD);
307         result.ifaceName = TEST_IFACE_NAME;
308 
309         return result;
310     }
311 
assertScanResultEquals(ScanResult expected, ScanResult actual)312     private static void assertScanResultEquals(ScanResult expected, ScanResult actual) {
313         assertEquals(expected.SSID, actual.SSID);
314         assertEquals(expected.BSSID, actual.BSSID);
315         assertEquals(expected.capabilities, actual.capabilities);
316         assertEquals(expected.level, actual.level);
317         assertEquals(expected.frequency, actual.frequency);
318         assertEquals(expected.timestamp, actual.timestamp);
319         assertEquals(expected.getWifiStandard(), actual.getWifiStandard());
320         assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos);
321         assertArrayEquals(expected.informationElements, actual.informationElements);
322     }
323 }
324