/* * 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 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 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 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 generateIes() { List 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; } }