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

Commit 4e900091 authored by John Wang's avatar John Wang
Browse files

Make LinkProperties comparable.

Add equals() and hashcode() to LinkProperties and related fields.

Bug:3501569
Change-Id: Ifa737a67c16867ac43cf76bf618a483e612a189e
parent 826af857
Loading
Loading
Loading
Loading
+8 −0
Original line number Original line Diff line number Diff line
@@ -78,6 +78,14 @@ public class LinkAddress implements Parcelable {
            this.prefixLength == linkAddress.prefixLength;
            this.prefixLength == linkAddress.prefixLength;
    }
    }


    @Override
    /*
     * generate hashcode based on significant fields
     */
    public int hashCode() {
        return ((null == address) ? 0 : address.hashCode()) + prefixLength;
    }

    /**
    /**
     * Returns the InetAddress for this address.
     * Returns the InetAddress for this address.
     */
     */
+63 −4
Original line number Original line Diff line number Diff line
@@ -19,11 +19,9 @@ package android.net;
import android.net.ProxyProperties;
import android.net.ProxyProperties;
import android.os.Parcelable;
import android.os.Parcelable;
import android.os.Parcel;
import android.os.Parcel;
import android.util.Log;
import android.text.TextUtils;


import java.net.InetAddress;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collection;
@@ -141,7 +139,7 @@ public class LinkProperties implements Parcelable {
        String ifaceName = (mIfaceName == null ? "" : "InterfaceName: " + mIfaceName + " ");
        String ifaceName = (mIfaceName == null ? "" : "InterfaceName: " + mIfaceName + " ");


        String linkAddresses = "LinkAddresses: [";
        String linkAddresses = "LinkAddresses: [";
        for (LinkAddress addr : mLinkAddresses) linkAddresses += addr.toString();
        for (LinkAddress addr : mLinkAddresses) linkAddresses += addr.toString() + ",";
        linkAddresses += "] ";
        linkAddresses += "] ";


        String dns = "DnsAddresses: [";
        String dns = "DnsAddresses: [";
@@ -156,6 +154,67 @@ public class LinkProperties implements Parcelable {
        return ifaceName + linkAddresses + gateways + dns + proxy;
        return ifaceName + linkAddresses + gateways + dns + proxy;
    }
    }



    @Override
    /**
     * Compares this {@code LinkProperties} instance against the target
     * LinkProperties in {@code obj}. Two LinkPropertieses are equal if
     * all their fields are equal in values.
     *
     * For collection fields, such as mDnses, containsAll() is used to check
     * if two collections contains the same elements, independent of order.
     * There are two thoughts regarding containsAll()
     * 1. Duplicated elements. eg, (A, B, B) and (A, A, B) are equal.
     * 2. Worst case performance is O(n^2).
     *
     * @param obj the object to be tested for equality.
     * @return {@code true} if both objects are equal, {@code false} otherwise.
     */
    public boolean equals(Object obj) {
        if (this == obj) return true;

        if (!(obj instanceof LinkProperties)) return false;

        boolean sameAddresses;
        boolean sameDnses;
        boolean sameGateways;

        LinkProperties target = (LinkProperties) obj;

        Collection<InetAddress> targetAddresses = target.getAddresses();
        Collection<InetAddress> sourceAddresses = getAddresses();
        sameAddresses = (sourceAddresses.size() == targetAddresses.size()) ?
                sourceAddresses.containsAll(targetAddresses) : false;

        Collection<InetAddress> targetDnses = target.getDnses();
        sameDnses = (mDnses.size() == targetDnses.size()) ?
                mDnses.containsAll(targetDnses) : false;

        Collection<InetAddress> targetGateways = target.getGateways();
        sameGateways = (mGateways.size() == targetGateways.size()) ?
                mGateways.containsAll(targetGateways) : false;

        return
            sameAddresses && sameDnses && sameGateways
            && TextUtils.equals(getInterfaceName(), target.getInterfaceName())
            && (getHttpProxy() == null ? target.getHttpProxy() == null :
                getHttpProxy().equals(target.getHttpProxy()));
    }

    @Override
    /**
     * generate hashcode based on significant fields
     * Equal objects must produce the same hash code, while unequal objects
     * may have the same hash codes.
     */
    public int hashCode() {
        return ((null == mIfaceName) ? 0 : mIfaceName.hashCode()
                + mLinkAddresses.size() * 31
                + mDnses.size() * 37
                + mGateways.size() * 41
                + ((null == mHttpProxy) ? 0 : mHttpProxy.hashCode()));
    }

    /**
    /**
     * Implement the Parcelable interface.
     * Implement the Parcelable interface.
     * @hide
     * @hide
+10 −0
Original line number Original line Diff line number Diff line
@@ -163,6 +163,16 @@ public class ProxyProperties implements Parcelable {
        return 0;
        return 0;
    }
    }


    @Override
    /*
     * generate hashcode based on significant fields
     */
    public int hashCode() {
        return ((null == mHost) ? 0 : mHost.hashCode())
        + ((null == mExclusionList) ? 0 : mExclusionList.hashCode())
        + mPort;
    }

    /**
    /**
     * Implement the Parcelable interface.
     * Implement the Parcelable interface.
     * @hide
     * @hide
+199 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2010 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;

import android.net.LinkProperties;
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;

import java.net.InetAddress;

public class LinkPropertiesTest extends TestCase {
    private static String ADDRV4 = "75.208.6.1";
    private static String ADDRV6 = "2001:0db8:85a3:0000:0000:8a2e:0370:7334";
    private static String DNS1 = "75.208.7.1";
    private static String DNS2 = "69.78.7.1";
    private static String GATEWAY1 = "75.208.8.1";
    private static String GATEWAY2 = "69.78.8.1";
    private static String NAME = "qmi0";

    @SmallTest
    public void testEqualsNull() {
        LinkProperties source = new LinkProperties();
        LinkProperties target = new LinkProperties();

        assertFalse(source == target);
        assertTrue(source.equals(target));
        assertTrue(source.hashCode() == target.hashCode());
    }

    @SmallTest
    public void testEqualsSameOrder() {
        try {
            LinkProperties source = new LinkProperties();
            source.setInterfaceName(NAME);
            // set 2 link addresses
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            // set 2 dnses
            source.addDns(NetworkUtils.numericToInetAddress(DNS1));
            source.addDns(NetworkUtils.numericToInetAddress(DNS2));
            // set 2 gateways
            source.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            source.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));

            LinkProperties target = new LinkProperties();

            // All fields are same
            target.setInterfaceName(NAME);
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));

            assertTrue(source.equals(target));
            assertTrue(source.hashCode() == target.hashCode());

            target.clear();
            // change Interface Name
            target.setInterfaceName("qmi1");
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));
            assertFalse(source.equals(target));

            target.clear();
            target.setInterfaceName(NAME);
            // change link addresses
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress("75.208.6.2"), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));
            assertFalse(source.equals(target));

            target.clear();
            target.setInterfaceName(NAME);
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            // change dnses
            target.addDns(NetworkUtils.numericToInetAddress("75.208.7.2"));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));
            assertFalse(source.equals(target));

            target.clear();
            target.setInterfaceName(NAME);
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            // change gateway
            target.addGateway(NetworkUtils.numericToInetAddress("75.208.8.2"));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));
            assertFalse(source.equals(target));

        } catch (Exception e) {
            throw new RuntimeException(e.toString());
            //fail();
        }
    }

    @SmallTest
    public void testEqualsDifferentOrder() {
        try {
            LinkProperties source = new LinkProperties();
            source.setInterfaceName(NAME);
            // set 2 link addresses
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            // set 2 dnses
            source.addDns(NetworkUtils.numericToInetAddress(DNS1));
            source.addDns(NetworkUtils.numericToInetAddress(DNS2));
            // set 2 gateways
            source.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));
            source.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));

            LinkProperties target = new LinkProperties();
            // Exchange order
            target.setInterfaceName(NAME);
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addDns(NetworkUtils.numericToInetAddress(DNS2));
            target.addDns(NetworkUtils.numericToInetAddress(DNS1));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY2));
            target.addGateway(NetworkUtils.numericToInetAddress(GATEWAY1));

            assertTrue(source.equals(target));
            assertTrue(source.hashCode() == target.hashCode());
        } catch (Exception e) {
            fail();
        }
    }

    @SmallTest
    public void testEqualsDuplicated() {
        try {
            LinkProperties source = new LinkProperties();
            // set 3 link addresses, eg, [A, A, B]
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            source.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));

            LinkProperties target = new LinkProperties();
            // set 3 link addresses, eg, [A, B, B]
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV4), 32));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));
            target.addLinkAddress(new LinkAddress(
                    NetworkUtils.numericToInetAddress(ADDRV6), 128));

            assertTrue(source.equals(target));
            assertTrue(source.hashCode() == target.hashCode());
        } catch (Exception e) {
            fail();
        }
    }

}