WifiInfo: Add equals implementation

This is needed for connectivity to compare TransportInfo instances.

Bug: 162602799
Test: atest android.net.wifi
Change-Id: I215b769339f68b76a1b2fa15f66c4527d184b696
Merged-In: I215b769339f68b76a1b2fa15f66c4527d184b696
This commit is contained in:
Roshan Pius
2020-11-23 08:11:08 -08:00
parent 6c5626edfc
commit 3653444d02
2 changed files with 167 additions and 1 deletions

View File

@@ -28,6 +28,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
import com.android.modules.utils.build.SdkLevel;
import com.android.net.module.util.Inet4AddressUtils;
import java.net.Inet4Address;
@@ -35,6 +36,7 @@ import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.EnumMap;
import java.util.Locale;
import java.util.Objects;
/**
* Describes the state of any Wi-Fi connection that is active or
@@ -49,7 +51,6 @@ import java.util.Locale;
* {@link #getPasspointProviderFriendlyName()} will return null.
*/
public class WifiInfo implements TransportInfo, Parcelable {
// TODO(b/162602799): Implement equals/hahscode methods.
private static final String TAG = "WifiInfo";
/**
* This is the map described in the Javadoc comment above. The positions
@@ -1058,4 +1059,88 @@ public class WifiInfo implements TransportInfo, Parcelable {
public @Nullable String getPasspointUniqueId() {
return mPasspointUniqueId;
}
@Override
public boolean equals(Object that) {
if (this == that) return true;
// Potential API behavior change, so don't change behavior on older devices.
if (!SdkLevel.isAtLeastS()) return false;
if (!(that instanceof WifiInfo)) return false;
WifiInfo thatWifiInfo = (WifiInfo) that;
return Objects.equals(mWifiSsid, thatWifiInfo.mWifiSsid)
&& Objects.equals(mBSSID, thatWifiInfo.mBSSID)
&& Objects.equals(mNetworkId, thatWifiInfo.mNetworkId)
&& Objects.equals(mRssi, thatWifiInfo.mRssi)
&& Objects.equals(mSupplicantState, thatWifiInfo.mSupplicantState)
&& Objects.equals(mLinkSpeed, thatWifiInfo.mLinkSpeed)
&& Objects.equals(mTxLinkSpeed, thatWifiInfo.mTxLinkSpeed)
&& Objects.equals(mRxLinkSpeed, thatWifiInfo.mRxLinkSpeed)
&& Objects.equals(mFrequency, thatWifiInfo.mFrequency)
&& Objects.equals(mIpAddress, thatWifiInfo.mIpAddress)
&& Objects.equals(mMacAddress, thatWifiInfo.mMacAddress)
&& Objects.equals(mMeteredHint, thatWifiInfo.mMeteredHint)
&& Objects.equals(mEphemeral, thatWifiInfo.mEphemeral)
&& Objects.equals(mTrusted, thatWifiInfo.mTrusted)
&& Objects.equals(mRequestingPackageName, thatWifiInfo.mRequestingPackageName)
&& Objects.equals(mOsuAp, thatWifiInfo.mOsuAp)
&& Objects.equals(mFqdn, thatWifiInfo.mFqdn)
&& Objects.equals(mProviderFriendlyName, thatWifiInfo.mProviderFriendlyName)
&& Objects.equals(txBad, thatWifiInfo.txBad)
&& Objects.equals(txRetries, thatWifiInfo.txRetries)
&& Objects.equals(txSuccess, thatWifiInfo.txSuccess)
&& Objects.equals(rxSuccess, thatWifiInfo.rxSuccess)
&& Objects.equals(mLostTxPacketsPerSecond, thatWifiInfo.mLostTxPacketsPerSecond)
&& Objects.equals(mTxRetriedTxPacketsPerSecond,
thatWifiInfo.mTxRetriedTxPacketsPerSecond)
&& Objects.equals(mSuccessfulTxPacketsPerSecond,
thatWifiInfo.mSuccessfulTxPacketsPerSecond)
&& Objects.equals(mSuccessfulRxPacketsPerSecond,
thatWifiInfo.mSuccessfulRxPacketsPerSecond)
&& Objects.equals(score, thatWifiInfo.score)
&& Objects.equals(mWifiStandard, thatWifiInfo.mWifiStandard)
&& Objects.equals(mMaxSupportedTxLinkSpeed, thatWifiInfo.mMaxSupportedTxLinkSpeed)
&& Objects.equals(mMaxSupportedRxLinkSpeed, thatWifiInfo.mMaxSupportedRxLinkSpeed)
&& Objects.equals(mPasspointUniqueId, thatWifiInfo.mPasspointUniqueId);
}
@Override
public int hashCode() {
// Potential API behavior change, so don't change behavior on older devices.
if (!SdkLevel.isAtLeastS()) return System.identityHashCode(this);
return Objects.hash(mWifiSsid,
mBSSID,
mNetworkId,
mRssi,
mSupplicantState,
mLinkSpeed,
mTxLinkSpeed,
mRxLinkSpeed,
mFrequency,
mIpAddress,
mMacAddress,
mMeteredHint,
mEphemeral,
mTrusted,
mRequestingPackageName,
mOsuAp,
mFqdn,
mProviderFriendlyName,
txBad,
txRetries,
txSuccess,
rxSuccess,
mLostTxPacketsPerSecond,
mTxRetriedTxPacketsPerSecond,
mSuccessfulTxPacketsPerSecond,
mSuccessfulRxPacketsPerSecond,
score,
mWifiStandard,
mMaxSupportedTxLinkSpeed,
mMaxSupportedRxLinkSpeed,
mPasspointUniqueId);
}
}

View File

@@ -17,6 +17,7 @@
package android.net.wifi;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertTrue;
@@ -25,6 +26,8 @@ import android.os.Parcel;
import androidx.test.filters.SmallTest;
import com.android.modules.utils.build.SdkLevel;
import org.junit.Test;
import java.nio.charset.StandardCharsets;
@@ -148,4 +151,82 @@ public class WifiInfoTest {
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 {
assertNotEquals(info1, info2);
}
info1.setTrusted(false);
// Same behavior pre-S & post-S.
assertNotEquals(info1, info2);
info2.setTrusted(false);
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
assertNotEquals(info1, info2);
}
info1.setSSID(WifiSsid.createFromHex(null));
// Same behavior pre-S & post-S.
assertNotEquals(info1, info2);
info2.setSSID(WifiSsid.createFromHex(null));
if (SdkLevel.isAtLeastS()) {
assertEquals(info1, info2);
} else {
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 {
assertNotEquals(info1.hashCode(), info2.hashCode());
}
info1.setTrusted(false);
// Same behavior pre-S & post-S.
assertNotEquals(info1.hashCode(), info2.hashCode());
info2.setTrusted(false);
if (SdkLevel.isAtLeastS()) {
assertEquals(info1.hashCode(), info2.hashCode());
} else {
assertNotEquals(info1.hashCode(), info2.hashCode());
}
info1.setSSID(WifiSsid.createFromHex(null));
// Same behavior pre-S & post-S.
assertNotEquals(info1.hashCode(), info2.hashCode());
info2.setSSID(WifiSsid.createFromHex(null));
if (SdkLevel.isAtLeastS()) {
assertEquals(info1.hashCode(), info2.hashCode());
} else {
assertNotEquals(info1.hashCode(), info2.hashCode());
}
}
}