Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4efd1ca5 authored by Stephen Chen's avatar Stephen Chen
Browse files

Check contents of Bundle for ScoredNetwork.equals

Bundle just uses object equality, so this improves the equality of
ScoredNetwork by checking the contents of the bundle.

Bug: 34824590
Test: runtest --path
frameworks/base/core/tests/coretests/src/android/net/ScoredNetworkTest.java

Change-Id: I1c39e574d4e1e23e0155467302be5e34076fe9a0
parent 96a91f11
Loading
Loading
Loading
Loading
+23 −6
Original line number Diff line number Diff line
@@ -16,18 +16,14 @@

package android.net;

import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;

import java.lang.Math;
import java.lang.UnsupportedOperationException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Objects;
import java.util.Set;

/**
 * A network identifier along with a score for the quality of that network.
@@ -195,7 +191,28 @@ public class ScoredNetwork implements Parcelable {
        return Objects.equals(networkKey, that.networkKey)
                && Objects.equals(rssiCurve, that.rssiCurve)
                && Objects.equals(meteredHint, that.meteredHint)
                && Objects.equals(attributes, that.attributes);
                && bundleEquals(attributes, that.attributes);
    }

    private boolean bundleEquals(Bundle bundle1, Bundle bundle2) {
        if (bundle1 == bundle2) {
            return true;
        }
        if (bundle1 == null || bundle2 == null) {
            return false;
        }
        if (bundle1.size() != bundle2.size()) {
            return false;
        }
        Set<String> keys = bundle1.keySet();
        for (String key : keys) {
            Object value1 = bundle1.get(key);
            Object value2 = bundle2.get(key);
            if (!Objects.equals(value1, value2)) {
                return false;
            }
        }
        return true;
    }

    @Override
+49 −0
Original line number Diff line number Diff line
@@ -48,6 +48,55 @@ public class ScoredNetworkTest {
    private static final NetworkKey KEY
        = new NetworkKey(new WifiKey("\"ssid\"", "00:00:00:00:00:00"));

    @Test
    public void scoredNetworksWithBothNullAttributeBundle_equal() {
        ScoredNetwork scoredNetwork1 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
        ScoredNetwork scoredNetwork2 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
        assertTrue(scoredNetwork1.equals(scoredNetwork2));
    }

    @Test
    public void scoredNetworksWithOneNullAttributeBundle_notEqual() {
        ScoredNetwork scoredNetwork1 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
        ScoredNetwork scoredNetwork2 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, null /* attributes */);
        assertFalse(scoredNetwork1.equals(scoredNetwork2));
    }

    @Test
    public void scoredNetworksWithDifferentSizedAttributeBundle_notEqual() {
        ScoredNetwork scoredNetwork1 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
        Bundle attr = new Bundle(ATTRIBUTES);
        attr.putBoolean(ScoredNetwork.ATTRIBUTES_KEY_HAS_CAPTIVE_PORTAL, true);
        ScoredNetwork scoredNetwork2 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
        assertFalse(scoredNetwork1.equals(scoredNetwork2));
    }

    @Test
    public void scoredNetworksWithDifferentAttributeValues_notEqual() {
        ScoredNetwork scoredNetwork1 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
        Bundle attr = new Bundle();
        attr.putInt(ScoredNetwork.ATTRIBUTES_KEY_RANKING_SCORE_OFFSET, Integer.MIN_VALUE);
        ScoredNetwork scoredNetwork2 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, attr);
        assertFalse(scoredNetwork1.equals(scoredNetwork2));
    }

    @Test
    public void scoredNetworksWithSameAttributeValuesAndSize_equal() {
        ScoredNetwork scoredNetwork1 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
        ScoredNetwork scoredNetwork2 =
                new ScoredNetwork(KEY, CURVE, false /* meteredHint */, ATTRIBUTES);
        assertTrue(scoredNetwork1.equals(scoredNetwork2));
    }

    @Test
    public void calculateRankingOffsetShouldThrowUnsupportedOperationException() {
        // No curve or ranking score offset set in curve