blob: f1ec5e829316127f3fe73b2a44f137515ac30c31 [file] [log] [blame]
/*
* Copyright (C) 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.net.wifi;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.mockito.Mockito.validateMockitoUsage;
import android.net.wifi.ScanResult.InformationElement;
import android.os.Parcel;
import androidx.test.filters.SmallTest;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
/**
* Unit tests for {@link android.net.wifi.WifiScanner}.
*/
@SmallTest
public class ScanResultTest {
public static final String TEST_SSID = "\"test_ssid\"";
public static final String TEST_BSSID = "04:ac:fe:45:34:10";
public static final String TEST_CAPS = "CCMP";
public static final int TEST_LEVEL = -56;
public static final int TEST_FREQUENCY = 2412;
public static final long TEST_TSF = 04660l;
public static final @WifiAnnotations.WifiStandard int TEST_WIFI_STANDARD =
ScanResult.WIFI_STANDARD_11AC;
/**
* Frequency to channel map. This include some frequencies used outside the US.
* Representing it using a vector (instead of map) for simplification.
*/
private static final int[] FREQUENCY_TO_CHANNEL_MAP = {
2412, WifiScanner.WIFI_BAND_24_GHZ, 1,
2417, WifiScanner.WIFI_BAND_24_GHZ, 2,
2422, WifiScanner.WIFI_BAND_24_GHZ, 3,
2427, WifiScanner.WIFI_BAND_24_GHZ, 4,
2432, WifiScanner.WIFI_BAND_24_GHZ, 5,
2437, WifiScanner.WIFI_BAND_24_GHZ, 6,
2442, WifiScanner.WIFI_BAND_24_GHZ, 7,
2447, WifiScanner.WIFI_BAND_24_GHZ, 8,
2452, WifiScanner.WIFI_BAND_24_GHZ, 9,
2457, WifiScanner.WIFI_BAND_24_GHZ, 10,
2462, WifiScanner.WIFI_BAND_24_GHZ, 11,
/* 12, 13 are only legitimate outside the US. */
2467, WifiScanner.WIFI_BAND_24_GHZ, 12,
2472, WifiScanner.WIFI_BAND_24_GHZ, 13,
/* 14 is for Japan, DSSS and CCK only. */
2484, WifiScanner.WIFI_BAND_24_GHZ, 14,
/* 34 valid in Japan. */
5170, WifiScanner.WIFI_BAND_5_GHZ, 34,
5180, WifiScanner.WIFI_BAND_5_GHZ, 36,
5190, WifiScanner.WIFI_BAND_5_GHZ, 38,
5200, WifiScanner.WIFI_BAND_5_GHZ, 40,
5210, WifiScanner.WIFI_BAND_5_GHZ, 42,
5220, WifiScanner.WIFI_BAND_5_GHZ, 44,
5230, WifiScanner.WIFI_BAND_5_GHZ, 46,
5240, WifiScanner.WIFI_BAND_5_GHZ, 48,
5260, WifiScanner.WIFI_BAND_5_GHZ, 52,
5280, WifiScanner.WIFI_BAND_5_GHZ, 56,
5300, WifiScanner.WIFI_BAND_5_GHZ, 60,
5320, WifiScanner.WIFI_BAND_5_GHZ, 64,
5500, WifiScanner.WIFI_BAND_5_GHZ, 100,
5520, WifiScanner.WIFI_BAND_5_GHZ, 104,
5540, WifiScanner.WIFI_BAND_5_GHZ, 108,
5560, WifiScanner.WIFI_BAND_5_GHZ, 112,
5580, WifiScanner.WIFI_BAND_5_GHZ, 116,
/* 120, 124, 128 valid in Europe/Japan. */
5600, WifiScanner.WIFI_BAND_5_GHZ, 120,
5620, WifiScanner.WIFI_BAND_5_GHZ, 124,
5640, WifiScanner.WIFI_BAND_5_GHZ, 128,
/* 132+ valid in US. */
5660, WifiScanner.WIFI_BAND_5_GHZ, 132,
5680, WifiScanner.WIFI_BAND_5_GHZ, 136,
5700, WifiScanner.WIFI_BAND_5_GHZ, 140,
/* 144 is supported by a subset of WiFi chips. */
5720, WifiScanner.WIFI_BAND_5_GHZ, 144,
5745, WifiScanner.WIFI_BAND_5_GHZ, 149,
5765, WifiScanner.WIFI_BAND_5_GHZ, 153,
5785, WifiScanner.WIFI_BAND_5_GHZ, 157,
5805, WifiScanner.WIFI_BAND_5_GHZ, 161,
5825, WifiScanner.WIFI_BAND_5_GHZ, 165,
5845, WifiScanner.WIFI_BAND_5_GHZ, 169,
5865, WifiScanner.WIFI_BAND_5_GHZ, 173,
/* Now some 6GHz channels */
5955, WifiScanner.WIFI_BAND_6_GHZ, 1,
5935, WifiScanner.WIFI_BAND_6_GHZ, 2,
5970, WifiScanner.WIFI_BAND_6_GHZ, 4,
6110, WifiScanner.WIFI_BAND_6_GHZ, 32
};
/**
* Setup before tests.
*/
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
}
/**
* Clean up after tests.
*/
@After
public void cleanup() {
validateMockitoUsage();
}
/**
* Verify parcel read/write for ScanResult.
*/
@Test
public void verifyScanResultParcelWithoutRadioChainInfo() throws Exception {
ScanResult writeScanResult = createScanResult();
ScanResult readScanResult = parcelReadWrite(writeScanResult);
assertScanResultEquals(writeScanResult, readScanResult);
}
/**
* Verify parcel read/write for ScanResult.
*/
@Test
public void verifyScanResultParcelWithZeroRadioChainInfo() throws Exception {
ScanResult writeScanResult = createScanResult();
writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[0];
ScanResult readScanResult = parcelReadWrite(writeScanResult);
assertNull(readScanResult.radioChainInfos);
}
/**
* Verify parcel read/write for ScanResult.
*/
@Test
public void verifyScanResultParcelWithRadioChainInfo() throws Exception {
ScanResult writeScanResult = createScanResult();
writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
writeScanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
writeScanResult.radioChainInfos[0].id = 0;
writeScanResult.radioChainInfos[0].level = -45;
writeScanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
writeScanResult.radioChainInfos[1].id = 1;
writeScanResult.radioChainInfos[1].level = -54;
ScanResult readScanResult = parcelReadWrite(writeScanResult);
assertScanResultEquals(writeScanResult, readScanResult);
}
/**
* Verify copy constructor for ScanResult.
*/
@Test
public void verifyScanResultCopyWithoutRadioChainInfo() throws Exception {
ScanResult scanResult = createScanResult();
ScanResult copyScanResult = new ScanResult(scanResult);
assertScanResultEquals(scanResult, copyScanResult);
}
/**
* Verify copy constructor for ScanResult.
*/
@Test
public void verifyScanResultCopyWithRadioChainInfo() throws Exception {
ScanResult scanResult = createScanResult();
scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
scanResult.radioChainInfos[0].id = 0;
scanResult.radioChainInfos[0].level = -45;
scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
scanResult.radioChainInfos[1].id = 1;
scanResult.radioChainInfos[1].level = -54;
ScanResult copyScanResult = new ScanResult(scanResult);
assertScanResultEquals(scanResult, copyScanResult);
}
/**
* Verify parcel read/write for ScanResult with Information Element
*/
@Test
public void verifyScanResultParcelWithInformationElement() throws Exception {
ScanResult writeScanResult = createScanResult();
writeScanResult.informationElements = new ScanResult.InformationElement[2];
writeScanResult.informationElements[0] = new ScanResult.InformationElement();
writeScanResult.informationElements[0].id = InformationElement.EID_HT_OPERATION;
writeScanResult.informationElements[0].idExt = 0;
writeScanResult.informationElements[0].bytes = new byte[]{0x11, 0x22, 0x33};
writeScanResult.informationElements[1] = new ScanResult.InformationElement();
writeScanResult.informationElements[1].id = InformationElement.EID_EXTENSION_PRESENT;
writeScanResult.informationElements[1].idExt = InformationElement.EID_EXT_HE_OPERATION;
writeScanResult.informationElements[1].bytes = new byte[]{0x44, 0x55, 0x66};
ScanResult readScanResult = new ScanResult(writeScanResult);
assertScanResultEquals(writeScanResult, readScanResult);
}
/**
* Verify toString for ScanResult.
*/
@Test
public void verifyScanResultToStringWithoutRadioChainInfo() throws Exception {
ScanResult scanResult = createScanResult();
assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+ "level: -56, frequency: 2412, timestamp: 2480, "
+ "distance: 0(cm), distanceSd: 0(cm), "
+ "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+ "standard: 11ac, "
+ "80211mcResponder: is not supported, "
+ "Radio Chain Infos: null", scanResult.toString());
}
/**
* Verify toString for ScanResult.
*/
@Test
public void verifyScanResultToStringWithRadioChainInfo() throws Exception {
ScanResult scanResult = createScanResult();
scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
scanResult.radioChainInfos[0].id = 0;
scanResult.radioChainInfos[0].level = -45;
scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
scanResult.radioChainInfos[1].id = 1;
scanResult.radioChainInfos[1].level = -54;
assertEquals("SSID: \"test_ssid\", BSSID: 04:ac:fe:45:34:10, capabilities: CCMP, "
+ "level: -56, frequency: 2412, timestamp: 2480, distance: 0(cm), "
+ "distanceSd: 0(cm), "
+ "passpoint: no, ChannelBandwidth: 0, centerFreq0: 0, centerFreq1: 0, "
+ "standard: 11ac, "
+ "80211mcResponder: is not supported, "
+ "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
+ "RadioChainInfo: id=1, level=-54]", scanResult.toString());
}
/**
* verify frequency to channel conversion for all possible frequencies.
*/
@Test
public void convertFrequencyToChannel() throws Exception {
for (int i = 0; i < FREQUENCY_TO_CHANNEL_MAP.length; i += 3) {
assertEquals(FREQUENCY_TO_CHANNEL_MAP[i + 2],
ScanResult.convertFrequencyMhzToChannel(FREQUENCY_TO_CHANNEL_MAP[i]));
}
}
/**
* Verify frequency to channel conversion failed for an invalid frequency.
*/
@Test
public void convertFrequencyToChannelWithInvalidFreq() throws Exception {
assertEquals(-1, ScanResult.convertFrequencyMhzToChannel(8000));
}
/**
* Write the provided {@link ScanResult} to a parcel and deserialize it.
*/
private static ScanResult parcelReadWrite(ScanResult writeResult) throws Exception {
Parcel parcel = Parcel.obtain();
writeResult.writeToParcel(parcel, 0);
parcel.setDataPosition(0); // Rewind data position back to the beginning for read.
return ScanResult.CREATOR.createFromParcel(parcel);
}
private static ScanResult createScanResult() {
ScanResult result = new ScanResult();
result.wifiSsid = WifiSsid.createFromAsciiEncoded(TEST_SSID);
result.BSSID = TEST_BSSID;
result.capabilities = TEST_CAPS;
result.level = TEST_LEVEL;
result.frequency = TEST_FREQUENCY;
result.timestamp = TEST_TSF;
result.setWifiStandard(TEST_WIFI_STANDARD);
return result;
}
private static void assertScanResultEquals(ScanResult expected, ScanResult actual) {
assertEquals(expected.SSID, actual.SSID);
assertEquals(expected.BSSID, actual.BSSID);
assertEquals(expected.capabilities, actual.capabilities);
assertEquals(expected.level, actual.level);
assertEquals(expected.frequency, actual.frequency);
assertEquals(expected.timestamp, actual.timestamp);
assertEquals(expected.getWifiStandard(), actual.getWifiStandard());
assertArrayEquals(expected.radioChainInfos, actual.radioChainInfos);
assertArrayEquals(expected.informationElements, actual.informationElements);
}
}