blob: 7b72fc7651a0bb9dc7f2903570b4ed549b323119 [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.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import android.net.NetworkCapabilities;
import android.os.Parcel;
import android.telephony.SubscriptionManager;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
* Unit tests for {@link android.net.wifi.WifiInfo}.
*/
@SmallTest
public class WifiInfoTest {
private static final long TEST_TX_SUCCESS = 1;
private static final long TEST_TX_RETRIES = 2;
private static final long TEST_TX_BAD = 3;
private static final long TEST_RX_SUCCESS = 4;
private static final String TEST_PACKAGE_NAME = "com.test.example";
private static final String TEST_FQDN = "test.com";
private static final String TEST_PROVIDER_NAME = "test";
private static final int TEST_WIFI_STANDARD = ScanResult.WIFI_STANDARD_11AC;
private static final int TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS = 866;
private static final int TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS = 1200;
private static final String TEST_SSID = "Test123";
private static final String TEST_BSSID = "12:12:12:12:12:12";
private static final int TEST_RSSI = -60;
private static final int TEST_NETWORK_ID = 5;
private static final int TEST_NETWORK_ID2 = 6;
private static final int TEST_SUB_ID = 1;
private WifiInfo makeWifiInfoForNoRedactions(
List<ScanResult.InformationElement> informationElements) {
WifiInfo info = new WifiInfo();
info.txSuccess = TEST_TX_SUCCESS;
info.txRetries = TEST_TX_RETRIES;
info.txBad = TEST_TX_BAD;
info.rxSuccess = TEST_RX_SUCCESS;
info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
info.setBSSID(TEST_BSSID);
info.setNetworkId(TEST_NETWORK_ID);
info.setTrusted(true);
info.setOemPaid(true);
info.setOemPrivate(true);
info.setCarrierMerged(true);
info.setOsuAp(true);
info.setFQDN(TEST_FQDN);
info.setProviderFriendlyName(TEST_PROVIDER_NAME);
info.setRequestingPackageName(TEST_PACKAGE_NAME);
info.setWifiStandard(TEST_WIFI_STANDARD);
info.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
info.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
info.setSubscriptionId(TEST_SUB_ID);
info.setInformationElements(informationElements);
info.setIsPrimary(true);
info.setMacAddress(TEST_BSSID);
return info;
}
private void assertNoRedaction(WifiInfo info,
List<ScanResult.InformationElement> informationElements) {
assertEquals(TEST_TX_SUCCESS, info.txSuccess);
assertEquals(TEST_TX_RETRIES, info.txRetries);
assertEquals(TEST_TX_BAD, info.txBad);
assertEquals(TEST_RX_SUCCESS, info.rxSuccess);
assertEquals("\"" + TEST_SSID + "\"", info.getSSID());
assertEquals(TEST_BSSID, info.getBSSID());
assertEquals(TEST_NETWORK_ID, info.getNetworkId());
assertTrue(info.isTrusted());
assertTrue(info.isOsuAp());
assertTrue(info.isPasspointAp());
assertEquals(TEST_PACKAGE_NAME, info.getRequestingPackageName());
assertEquals(TEST_FQDN, info.getPasspointFqdn());
assertEquals(TEST_PROVIDER_NAME, info.getPasspointProviderFriendlyName());
assertEquals(TEST_WIFI_STANDARD, info.getWifiStandard());
assertEquals(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS, info.getMaxSupportedTxLinkSpeedMbps());
assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS, info.getMaxSupportedRxLinkSpeedMbps());
assertEquals(TEST_BSSID, info.getMacAddress());
assertEquals(2, info.getInformationElements().size());
assertEquals(informationElements.get(0).id,
info.getInformationElements().get(0).id);
assertEquals(informationElements.get(0).idExt,
info.getInformationElements().get(0).idExt);
assertArrayEquals(informationElements.get(0).bytes,
info.getInformationElements().get(0).bytes);
assertEquals(informationElements.get(1).id,
info.getInformationElements().get(1).id);
assertEquals(informationElements.get(1).idExt,
info.getInformationElements().get(1).idExt);
assertArrayEquals(informationElements.get(1).bytes,
info.getInformationElements().get(1).bytes);
if (SdkLevel.isAtLeastS()) {
assertTrue(info.isOemPaid());
assertTrue(info.isOemPrivate());
assertTrue(info.isCarrierMerged());
assertEquals(TEST_SUB_ID, info.getSubscriptionId());
assertTrue(info.isPrimary());
}
}
/**
* Verify redaction of WifiInfo with REDACT_NONE.
*/
@Test
public void testWifiInfoRedactNoRedactions() throws Exception {
List<ScanResult.InformationElement> informationElements = generateIes();
WifiInfo writeWifiInfo = makeWifiInfoForNoRedactions(informationElements);
// Make a copy which allows parcelling of location sensitive data.
WifiInfo redactedWifiInfo = writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_NONE);
Parcel parcel = Parcel.obtain();
redactedWifiInfo.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertNoRedaction(redactedWifiInfo, informationElements);
assertNoRedaction(readWifiInfo, informationElements);
if (SdkLevel.isAtLeastS()) {
// equals() was only introduced in S.
assertEquals(readWifiInfo, redactedWifiInfo);
}
}
private WifiInfo makeWifiInfoForLocationSensitiveRedaction() {
WifiInfo info = new WifiInfo();
info.txSuccess = TEST_TX_SUCCESS;
info.txRetries = TEST_TX_RETRIES;
info.txBad = TEST_TX_BAD;
info.rxSuccess = TEST_RX_SUCCESS;
info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
info.setBSSID(TEST_BSSID);
info.setNetworkId(TEST_NETWORK_ID);
info.setTrusted(true);
info.setOemPaid(true);
info.setOemPrivate(true);
info.setCarrierMerged(true);
info.setOsuAp(true);
info.setFQDN(TEST_FQDN);
info.setProviderFriendlyName(TEST_PROVIDER_NAME);
info.setRequestingPackageName(TEST_PACKAGE_NAME);
info.setWifiStandard(TEST_WIFI_STANDARD);
info.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
info.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
info.setSubscriptionId(TEST_SUB_ID);
info.setInformationElements(generateIes());
info.setIsPrimary(true);
info.setMacAddress(TEST_BSSID);
return info;
}
private void assertLocationSensitiveRedaction(WifiInfo info) {
assertNotNull(info);
assertEquals(TEST_TX_SUCCESS, info.txSuccess);
assertEquals(TEST_TX_RETRIES, info.txRetries);
assertEquals(TEST_TX_BAD, info.txBad);
assertEquals(TEST_RX_SUCCESS, info.rxSuccess);
assertEquals(WifiManager.UNKNOWN_SSID, info.getSSID());
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, info.getBSSID());
assertEquals(WifiConfiguration.INVALID_NETWORK_ID, info.getNetworkId());
assertTrue(info.isTrusted());
assertTrue(info.isOsuAp());
assertFalse(info.isPasspointAp()); // fqdn & friendly name is masked.
assertEquals(TEST_PACKAGE_NAME, info.getRequestingPackageName());
assertNull(info.getPasspointFqdn());
assertNull(info.getPasspointProviderFriendlyName());
assertEquals(TEST_WIFI_STANDARD, info.getWifiStandard());
assertEquals(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS, info.getMaxSupportedTxLinkSpeedMbps());
assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS, info.getMaxSupportedRxLinkSpeedMbps());
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, info.getMacAddress());
assertNull(info.getInformationElements());
if (SdkLevel.isAtLeastS()) {
assertTrue(info.isOemPaid());
assertTrue(info.isOemPrivate());
assertTrue(info.isCarrierMerged());
assertEquals(TEST_SUB_ID, info.getSubscriptionId());
assertTrue(info.isPrimary());
}
}
/**
* Verify redaction of WifiInfo with REDACT_FOR_ACCESS_FINE_LOCATION.
*/
@Test
public void testWifiInfoRedactLocationSensitiveInfo() throws Exception {
WifiInfo writeWifiInfo = makeWifiInfoForLocationSensitiveRedaction();
WifiInfo redactedWifiInfo =
writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_FOR_ACCESS_FINE_LOCATION);
Parcel parcel = Parcel.obtain();
redactedWifiInfo.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertLocationSensitiveRedaction(redactedWifiInfo);
assertLocationSensitiveRedaction(readWifiInfo);
if (SdkLevel.isAtLeastS()) {
// equals() was only introduced in S.
assertEquals(redactedWifiInfo, readWifiInfo);
}
}
/**
* Verify redaction of WifiInfo with REDACT_FOR_LOCAL_MAC_ADDRESS.
*/
@Test
public void testWifiInfoRedactLocalMacAddressInfo() throws Exception {
WifiInfo writeWifiInfo = new WifiInfo();
writeWifiInfo.setMacAddress(TEST_BSSID);
WifiInfo redactedWifiInfo =
writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_FOR_LOCAL_MAC_ADDRESS);
Parcel parcel = Parcel.obtain();
redactedWifiInfo.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertNotNull(redactedWifiInfo);
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, redactedWifiInfo.getMacAddress());
assertNotNull(readWifiInfo);
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, readWifiInfo.getMacAddress());
if (SdkLevel.isAtLeastS()) {
// equals() was only introduced in S.
assertEquals(redactedWifiInfo, readWifiInfo);
}
}
private void assertIsPrimaryThrowsSecurityException(WifiInfo info) {
try {
// Should generate a security exception if caller does not have network settings
// permission.
info.isPrimary();
fail();
} catch (SecurityException e) { /* pass */ }
}
/**
* Verify redaction of WifiInfo with REDACT_FOR_NETWORK_SETTINGS.
*/
@Test
public void testWifiInfoRedactNetworkSettingsInfo() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
WifiInfo writeWifiInfo = new WifiInfo();
writeWifiInfo.setIsPrimary(true);
WifiInfo redactedWifiInfo =
writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS);
Parcel parcel = Parcel.obtain();
redactedWifiInfo.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertNotNull(redactedWifiInfo);
assertIsPrimaryThrowsSecurityException(redactedWifiInfo);
assertNotNull(readWifiInfo);
assertIsPrimaryThrowsSecurityException(readWifiInfo);
if (SdkLevel.isAtLeastS()) {
// equals() was only introduced in S.
assertEquals(redactedWifiInfo, readWifiInfo);
}
}
@Test
public void testWifiInfoGetApplicableRedactions() throws Exception {
long redactions = new WifiInfo().getApplicableRedactions();
assertEquals(NetworkCapabilities.REDACT_FOR_ACCESS_FINE_LOCATION
| NetworkCapabilities.REDACT_FOR_LOCAL_MAC_ADDRESS
| NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS, redactions);
}
private WifiInfo makeWifiInfoForLocationSensitiveAndLocalMacAddressRedaction() {
WifiInfo info = new WifiInfo();
info.setSSID(WifiSsid.createFromAsciiEncoded(TEST_SSID));
info.setBSSID(TEST_BSSID);
info.setNetworkId(TEST_NETWORK_ID);
info.setFQDN(TEST_FQDN);
info.setProviderFriendlyName(TEST_PROVIDER_NAME);
info.setInformationElements(generateIes());
info.setMacAddress(TEST_BSSID);
return info;
}
private void assertLocationSensitiveAndLocalMacAddressRedaction(WifiInfo info) {
assertNotNull(info);
assertEquals(WifiManager.UNKNOWN_SSID, info.getSSID());
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, info.getBSSID());
assertEquals(WifiConfiguration.INVALID_NETWORK_ID, info.getNetworkId());
assertNull(info.getPasspointFqdn());
assertNull(info.getPasspointProviderFriendlyName());
assertEquals(WifiInfo.DEFAULT_MAC_ADDRESS, info.getMacAddress());
assertNull(info.getInformationElements());
}
@Test
public void testWifiInfoRedactLocationAndLocalMacAddressSensitiveInfo()
throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
WifiInfo writeWifiInfo = makeWifiInfoForLocationSensitiveAndLocalMacAddressRedaction();
WifiInfo redactedWifiInfo =
writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_FOR_ACCESS_FINE_LOCATION
| NetworkCapabilities.REDACT_FOR_LOCAL_MAC_ADDRESS);
Parcel parcel = Parcel.obtain();
redactedWifiInfo.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertLocationSensitiveAndLocalMacAddressRedaction(redactedWifiInfo);
assertLocationSensitiveAndLocalMacAddressRedaction(readWifiInfo);
if (SdkLevel.isAtLeastS()) {
// equals() was only introduced in S.
assertEquals(redactedWifiInfo, readWifiInfo);
}
}
/**
* Verify parcel write/read with null information elements.
*/
@Test
public void testWifiInfoParcelWriteReadWithNullInfoElements() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
WifiInfo writeWifiInfo = new WifiInfo();
writeWifiInfo.setInformationElements(null);
// Make a copy which allows parcelling of location sensitive data.
WifiInfo writeWifiInfoCopy = writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_NONE);
Parcel parcel = Parcel.obtain();
writeWifiInfoCopy.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertNull(readWifiInfo.getInformationElements());
}
/**
* Verify parcel write/read with empty information elements.
*/
@Test
public void testWifiInfoParcelWriteReadWithEmptyInfoElements() throws Exception {
assumeTrue(SdkLevel.isAtLeastS());
WifiInfo writeWifiInfo = new WifiInfo();
writeWifiInfo.setInformationElements(new ArrayList<>());
// Make a copy which allows parcelling of location sensitive data.
WifiInfo writeWifiInfoCopy = writeWifiInfo.makeCopy(NetworkCapabilities.REDACT_NONE);
Parcel parcel = Parcel.obtain();
writeWifiInfoCopy.writeToParcel(parcel, 0);
// Rewind the pointer to the head of the parcel.
parcel.setDataPosition(0);
WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
assertTrue(readWifiInfo.getInformationElements().isEmpty());
}
@Test
public void testWifiInfoCopyConstructor() throws Exception {
WifiInfo writeWifiInfo = new WifiInfo();
writeWifiInfo.txSuccess = TEST_TX_SUCCESS;
writeWifiInfo.txRetries = TEST_TX_RETRIES;
writeWifiInfo.txBad = TEST_TX_BAD;
writeWifiInfo.rxSuccess = TEST_RX_SUCCESS;
writeWifiInfo.setTrusted(true);
writeWifiInfo.setOemPaid(true);
writeWifiInfo.setOemPrivate(true);
writeWifiInfo.setCarrierMerged(true);
writeWifiInfo.setOsuAp(true);
writeWifiInfo.setFQDN(TEST_FQDN);
writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
writeWifiInfo.setRequestingPackageName(TEST_PACKAGE_NAME);
writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
writeWifiInfo.setSubscriptionId(TEST_SUB_ID);
writeWifiInfo.setIsPrimary(true);
WifiInfo readWifiInfo = new WifiInfo(writeWifiInfo);
assertEquals(TEST_TX_SUCCESS, readWifiInfo.txSuccess);
assertEquals(TEST_TX_RETRIES, readWifiInfo.txRetries);
assertEquals(TEST_TX_BAD, readWifiInfo.txBad);
assertEquals(TEST_RX_SUCCESS, readWifiInfo.rxSuccess);
assertTrue(readWifiInfo.isTrusted());
assertTrue(readWifiInfo.isOsuAp());
assertTrue(readWifiInfo.isPasspointAp());
assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
assertEquals(TEST_FQDN, readWifiInfo.getPasspointFqdn());
assertEquals(TEST_PROVIDER_NAME, readWifiInfo.getPasspointProviderFriendlyName());
assertEquals(TEST_WIFI_STANDARD, readWifiInfo.getWifiStandard());
assertEquals(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS,
readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
if (SdkLevel.isAtLeastS()) {
assertTrue(readWifiInfo.isOemPaid());
assertTrue(readWifiInfo.isOemPrivate());
assertTrue(readWifiInfo.isCarrierMerged());
assertEquals(TEST_SUB_ID, readWifiInfo.getSubscriptionId());
assertTrue(readWifiInfo.isPrimary());
}
}
/**
* Verify values after reset()
*/
@Test
public void testWifiInfoResetValue() throws Exception {
WifiInfo wifiInfo = new WifiInfo();
wifiInfo.reset();
assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getMaxSupportedTxLinkSpeedMbps());
assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getMaxSupportedRxLinkSpeedMbps());
assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getTxLinkSpeedMbps());
assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getRxLinkSpeedMbps());
assertEquals(WifiInfo.INVALID_RSSI, wifiInfo.getRssi());
assertEquals(WifiManager.UNKNOWN_SSID, wifiInfo.getSSID());
assertEquals(null, wifiInfo.getBSSID());
assertEquals(-1, wifiInfo.getNetworkId());
if (SdkLevel.isAtLeastS()) {
assertFalse(wifiInfo.isOemPaid());
assertFalse(wifiInfo.isOemPrivate());
assertFalse(wifiInfo.isCarrierMerged());
assertEquals(SubscriptionManager.INVALID_SUBSCRIPTION_ID, wifiInfo.getSubscriptionId());
assertFalse(wifiInfo.isPrimary());
}
}
/**
* Test that the WifiInfo Builder returns the same values that was set, and that
* calling build multiple times returns different instances.
*/
@Test
public void testWifiInfoBuilder() throws Exception {
WifiInfo.Builder builder = new WifiInfo.Builder()
.setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
.setBssid(TEST_BSSID)
.setRssi(TEST_RSSI)
.setNetworkId(TEST_NETWORK_ID);
WifiInfo info1 = builder.build();
assertEquals("\"" + TEST_SSID + "\"", info1.getSSID());
assertEquals(TEST_BSSID, info1.getBSSID());
assertEquals(TEST_RSSI, info1.getRssi());
assertEquals(TEST_NETWORK_ID, info1.getNetworkId());
WifiInfo info2 = builder
.setNetworkId(TEST_NETWORK_ID2)
.build();
// different instances
assertNotSame(info1, info2);
// assert that info1 didn't change
assertEquals("\"" + TEST_SSID + "\"", info1.getSSID());
assertEquals(TEST_BSSID, info1.getBSSID());
assertEquals(TEST_RSSI, info1.getRssi());
assertEquals(TEST_NETWORK_ID, info1.getNetworkId());
// assert that info2 changed
assertEquals("\"" + TEST_SSID + "\"", info2.getSSID());
assertEquals(TEST_BSSID, info2.getBSSID());
assertEquals(TEST_RSSI, info2.getRssi());
assertEquals(TEST_NETWORK_ID2, info2.getNetworkId());
}
@Test
public void testWifiInfoEquals() throws Exception {
WifiInfo.Builder builder = new WifiInfo.Builder()
.setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
.setBssid(TEST_BSSID)
.setRssi(TEST_RSSI)
.setNetworkId(TEST_NETWORK_ID);
WifiInfo info1 = builder.build();
WifiInfo info2 = builder.build();
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
// On R devices, reference equality.
assertNotEquals(info1, info2);
}
info1.setSubscriptionId(TEST_SUB_ID);
assertNotEquals(info1, info2);
info2.setSubscriptionId(TEST_SUB_ID);
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
// On R devices, reference equality.
assertNotEquals(info1, info2);
}
info1.setSSID(WifiSsid.createFromHex(null));
assertNotEquals(info1, info2);
info2.setSSID(WifiSsid.createFromHex(null));
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
// On R devices, reference equality.
assertNotEquals(info1, info2);
}
}
@Test
public void testWifiInfoEqualsWithInfoElements() throws Exception {
WifiInfo.Builder builder = new WifiInfo.Builder()
.setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
.setBssid(TEST_BSSID)
.setRssi(TEST_RSSI)
.setNetworkId(TEST_NETWORK_ID);
WifiInfo info1 = builder.build();
WifiInfo info2 = builder.build();
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
// On R devices, reference equality.
assertNotEquals(info1, info2);
}
info1.setInformationElements(generateIes());
info2.setInformationElements(generateIes());
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
// On R devices, reference equality.
assertNotEquals(info1, info2);
}
}
@Test
public void testWifiInfoHashcode() throws Exception {
WifiInfo.Builder builder = new WifiInfo.Builder()
.setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
.setBssid(TEST_BSSID)
.setRssi(TEST_RSSI)
.setNetworkId(TEST_NETWORK_ID);
WifiInfo info1 = builder.build();
WifiInfo info2 = builder.build();
if (SdkLevel.isAtLeastS()) {
assertEquals(info1.hashCode(), info2.hashCode());
} else {
// On R devices, system generated hashcode.
assertNotEquals(info1.hashCode(), info2.hashCode());
}
info1.setSubscriptionId(TEST_SUB_ID);
assertNotEquals(info1.hashCode(), info2.hashCode());
info2.setSubscriptionId(TEST_SUB_ID);
if (SdkLevel.isAtLeastS()) {
assertEquals(info1.hashCode(), info2.hashCode());
} else {
// On R devices, system generated hashcode.
assertNotEquals(info1.hashCode(), info2.hashCode());
}
info1.setSSID(WifiSsid.createFromHex(null));
assertNotEquals(info1.hashCode(), info2.hashCode());
info2.setSSID(WifiSsid.createFromHex(null));
if (SdkLevel.isAtLeastS()) {
assertEquals(info1.hashCode(), info2.hashCode());
} else {
// On R devices, system generated hashcode.
assertNotEquals(info1.hashCode(), info2.hashCode());
}
}
@Test
public void testWifiInfoCurrentSecurityType() throws Exception {
WifiInfo.Builder builder = new WifiInfo.Builder()
.setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
.setBssid(TEST_BSSID)
.setRssi(TEST_RSSI)
.setNetworkId(TEST_NETWORK_ID)
.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_SAE);
WifiInfo info = new WifiInfo();
assertEquals(WifiInfo.SECURITY_TYPE_UNKNOWN, info.getCurrentSecurityType());
info = builder.build();
assertEquals(WifiInfo.SECURITY_TYPE_SAE, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_OPEN).build();
assertEquals(WifiInfo.SECURITY_TYPE_OPEN, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_WEP).build();
assertEquals(WifiInfo.SECURITY_TYPE_WEP, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_PSK).build();
assertEquals(WifiInfo.SECURITY_TYPE_PSK, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_EAP).build();
assertEquals(WifiInfo.SECURITY_TYPE_EAP, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_OWE).build();
assertEquals(WifiInfo.SECURITY_TYPE_OWE, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_WAPI_PSK).build();
assertEquals(WifiInfo.SECURITY_TYPE_WAPI_PSK, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_WAPI_CERT).build();
assertEquals(WifiInfo.SECURITY_TYPE_WAPI_CERT, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(
WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE).build();
assertEquals(WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(
WifiConfiguration.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT).build();
assertEquals(WifiInfo.SECURITY_TYPE_EAP_WPA3_ENTERPRISE_192_BIT,
info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(
WifiConfiguration.SECURITY_TYPE_PASSPOINT_R1_R2).build();
assertEquals(WifiInfo.SECURITY_TYPE_PASSPOINT_R1_R2, info.getCurrentSecurityType());
info = builder.setCurrentSecurityType(WifiConfiguration.SECURITY_TYPE_PASSPOINT_R3).build();
assertEquals(WifiInfo.SECURITY_TYPE_PASSPOINT_R3, info.getCurrentSecurityType());
info.clearCurrentSecurityType();
assertEquals(WifiInfo.SECURITY_TYPE_UNKNOWN, info.getCurrentSecurityType());
}
private static List<ScanResult.InformationElement> generateIes() {
List<ScanResult.InformationElement> informationElements = new ArrayList<>();
ScanResult.InformationElement informationElement = new ScanResult.InformationElement();
informationElement.id = ScanResult.InformationElement.EID_HT_OPERATION;
informationElement.idExt = 0;
informationElement.bytes = new byte[]{0x11, 0x22, 0x33};
informationElements.add(informationElement);
informationElement = new ScanResult.InformationElement();
informationElement.id = ScanResult.InformationElement.EID_EXTENSION_PRESENT;
informationElement.idExt = ScanResult.InformationElement.EID_EXT_HE_OPERATION;
informationElement.bytes = new byte[]{0x44, 0x55, 0x66};
informationElements.add(informationElement);
return informationElements;
}
}