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