[ONOS-6142] Add geo coordinate & list ext addresses with unit test
Change-Id: I538009b8a0d86b2d9229eae382c094a66a9b137e
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
index 8e796be..9920108 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispGcAddress.java
@@ -16,12 +16,24 @@
package org.onosproject.drivers.lisp.extensions;
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
- .ExtensionMappingAddressTypes.GEO_COORDINATE_ADDRESS;
+ .ExtensionMappingAddressTypes.GEO_COORDINATE_ADDRESS;
/**
* Implementation of LISP Geo Coordinate (GC) address.
@@ -30,7 +42,166 @@
* physical location information.
*/
public class LispGcAddress extends AbstractExtension
- implements ExtensionMappingAddress {
+ implements ExtensionMappingAddress {
+
+ private static final String NORTH = "north";
+ private static final String LATITUDE_DEGREE = "latitudeDegree";
+ private static final String LATITUDE_MINUTE = "latitudeMinute";
+ private static final String LATITUDE_SECOND = "latitudeSecond";
+ private static final String EAST = "east";
+ private static final String LONGITUDE_DEGREE = "longitudeDegree";
+ private static final String LONGITUDE_MINUTE = "longitudeMinute";
+ private static final String LONGITUDE_SECOND = "longitudeSecond";
+ private static final String ALTITUDE = "altitude";
+ private static final String ADDRESS = "address";
+
+ private boolean north;
+ private short latitudeDegree;
+ private byte latitudeMinute;
+ private byte latitudeSecond;
+ private boolean east;
+ private short longitudeDegree;
+ private byte longitudeMinute;
+ private byte longitudeSecond;
+ private int altitude;
+ private MappingAddress address;
+
+ private final KryoNamespace appKryo = new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(MappingAddress.class)
+ .register(MappingAddress.Type.class)
+ .register(IPMappingAddress.class)
+ .register(ASMappingAddress.class)
+ .register(DNMappingAddress.class)
+ .register(EthMappingAddress.class)
+ .build();
+
+ /**
+ * Default constructor.
+ */
+ public LispGcAddress() {
+ }
+
+ /**
+ * Creates an instance with initialized parameters.
+ *
+ * @param north north flag
+ * @param latitudeDegree latitude degree
+ * @param latitudeMinute latitude minute
+ * @param latitudeSecond latitude second
+ * @param east east flag
+ * @param longitudeDegree longitude degree
+ * @param longitudeMinute longitude minute
+ * @param longitudeSecond longitude second
+ * @param altitude altitude
+ * @param address mapping address
+ */
+ private LispGcAddress(boolean north, short latitudeDegree, byte latitudeMinute,
+ byte latitudeSecond, boolean east, short longitudeDegree,
+ byte longitudeMinute, byte longitudeSecond, int altitude,
+ MappingAddress address) {
+ this.north = north;
+ this.latitudeDegree = latitudeDegree;
+ this.latitudeMinute = latitudeMinute;
+ this.latitudeSecond = latitudeSecond;
+ this.east = east;
+ this.longitudeDegree = longitudeDegree;
+ this.longitudeMinute = longitudeMinute;
+ this.longitudeSecond = longitudeSecond;
+ this.altitude = altitude;
+ this.address = address;
+ }
+
+ /**
+ * Obtains north flag value.
+ *
+ * @return north flag value
+ */
+ public boolean isNorth() {
+ return north;
+ }
+
+ /**
+ * Obtains latitude degree.
+ *
+ * @return latitude degree
+ */
+ public short getLatitudeDegree() {
+ return latitudeDegree;
+ }
+
+ /**
+ * Obtains latitude minute.
+ *
+ * @return latitude minute
+ */
+ public byte getLatitudeMinute() {
+ return latitudeMinute;
+ }
+
+ /**
+ * Obtains latitude second.
+ *
+ * @return latitude second
+ */
+ public byte getLatitudeSecond() {
+ return latitudeSecond;
+ }
+
+ /**
+ * Obtains east flag value.
+ *
+ * @return east flag vlaue
+ */
+ public boolean isEast() {
+ return east;
+ }
+
+ /**
+ * Obtains longitude degree.
+ *
+ * @return longitude degree
+ */
+ public short getLongitudeDegree() {
+ return longitudeDegree;
+ }
+
+ /**
+ * Obtains longitude minute.
+ *
+ * @return longitude minute
+ */
+ public byte getLongitudeMinute() {
+ return longitudeMinute;
+ }
+
+ /**
+ * Obtains longitude second.
+ *
+ * @return longitude second
+ */
+ public byte getLongitudeSecond() {
+ return longitudeSecond;
+ }
+
+ /**
+ * Obtains altitude.
+ *
+ * @return altitude
+ */
+ public int getAltitude() {
+ return altitude;
+ }
+
+ /**
+ * Obtains mapping address.
+ *
+ * @return mapping address
+ */
+ public MappingAddress getAddress() {
+ return address;
+ }
+
@Override
public ExtensionMappingAddressType type() {
return GEO_COORDINATE_ADDRESS.type();
@@ -38,11 +209,218 @@
@Override
public byte[] serialize() {
- return new byte[0];
+ Map<String, Object> parameterMap = Maps.newHashMap();
+
+ parameterMap.put(NORTH, north);
+ parameterMap.put(LATITUDE_DEGREE, latitudeDegree);
+ parameterMap.put(LATITUDE_MINUTE, latitudeMinute);
+ parameterMap.put(LATITUDE_SECOND, latitudeSecond);
+ parameterMap.put(EAST, east);
+ parameterMap.put(LONGITUDE_DEGREE, longitudeDegree);
+ parameterMap.put(LONGITUDE_MINUTE, longitudeMinute);
+ parameterMap.put(LONGITUDE_SECOND, longitudeSecond);
+ parameterMap.put(ALTITUDE, altitude);
+ parameterMap.put(ADDRESS, address);
+
+ return appKryo.serialize(parameterMap);
}
@Override
public void deserialize(byte[] data) {
+ Map<String, Object> parameterMap = appKryo.deserialize(data);
+ this.north = (boolean) parameterMap.get(NORTH);
+ this.latitudeDegree = (short) parameterMap.get(LATITUDE_DEGREE);
+ this.latitudeMinute = (byte) parameterMap.get(LATITUDE_MINUTE);
+ this.latitudeSecond = (byte) parameterMap.get(LATITUDE_SECOND);
+ this.east = (boolean) parameterMap.get(EAST);
+ this.longitudeDegree = (short) parameterMap.get(LONGITUDE_DEGREE);
+ this.longitudeMinute = (byte) parameterMap.get(LONGITUDE_MINUTE);
+ this.longitudeSecond = (byte) parameterMap.get(LONGITUDE_SECOND);
+ this.altitude = (int) parameterMap.get(ALTITUDE);
+ this.address = (MappingAddress) parameterMap.get(ADDRESS);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(north, latitudeDegree, latitudeMinute, latitudeSecond,
+ east, longitudeDegree, longitudeMinute, longitudeSecond,
+ altitude, address);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+
+ if (obj instanceof LispGcAddress) {
+ final LispGcAddress other = (LispGcAddress) obj;
+ return Objects.equals(this.north, other.north) &&
+ Objects.equals(this.latitudeDegree, other.latitudeDegree) &&
+ Objects.equals(this.latitudeMinute, other.latitudeMinute) &&
+ Objects.equals(this.latitudeSecond, other.latitudeSecond) &&
+ Objects.equals(this.east, other.east) &&
+ Objects.equals(this.longitudeDegree, other.longitudeDegree) &&
+ Objects.equals(this.longitudeMinute, other.longitudeMinute) &&
+ Objects.equals(this.longitudeSecond, other.longitudeSecond) &&
+ Objects.equals(this.altitude, other.altitude) &&
+ Objects.equals(this.address, other.address);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this)
+ .add("north", north)
+ .add("latitude degree", latitudeDegree)
+ .add("latitude minute", latitudeMinute)
+ .add("latitude second", latitudeSecond)
+ .add("east", east)
+ .add("longitude degree", longitudeDegree)
+ .add("longitude minute", longitudeMinute)
+ .add("longitude second", longitudeSecond)
+ .add("altitude", altitude)
+ .add("address", address)
+ .toString();
+ }
+
+ /**
+ * A builder for building LispGcAddress.
+ */
+ public static final class Builder {
+ private boolean north;
+ private short latitudeDegree;
+ private byte latitudeMinute;
+ private byte latitudeSecond;
+ private boolean east;
+ private short longitudeDegree;
+ private byte longitudeMinute;
+ private byte longitudeSecond;
+ private int altitude;
+ private MappingAddress address;
+
+ /**
+ * Sets north flag value.
+ *
+ * @param north north flag value
+ * @return Builder object
+ */
+ public Builder withIsNorth(boolean north) {
+ this.north = north;
+ return this;
+ }
+
+ /**
+ * Sets latitude degree.
+ *
+ * @param latitudeDegree latitude degree
+ * @return Builder object
+ */
+ public Builder withLatitudeDegree(short latitudeDegree) {
+ this.latitudeDegree = latitudeDegree;
+ return this;
+ }
+
+ /**
+ * Sets latitude minute.
+ *
+ * @param latitudeMinute latitude minute
+ * @return Builder object
+ */
+ public Builder withLatitudeMinute(byte latitudeMinute) {
+ this.latitudeMinute = latitudeMinute;
+ return this;
+ }
+
+ /**
+ * Sets latitude second.
+ *
+ * @param latitudeSecond latitude second
+ * @return Builder object
+ */
+ public Builder withLatitudeSecond(byte latitudeSecond) {
+ this.latitudeSecond = latitudeSecond;
+ return this;
+ }
+
+ /**
+ * Sets east flag value.
+ *
+ * @param east east flag
+ * @return Builder object
+ */
+ public Builder withIsEast(boolean east) {
+ this.east = east;
+ return this;
+ }
+
+ /**
+ * Sets longitude degree.
+ *
+ * @param longitudeDegree longitude degree
+ * @return Builder object
+ */
+ public Builder withLongitudeDegree(short longitudeDegree) {
+ this.longitudeDegree = longitudeDegree;
+ return this;
+ }
+
+ /**
+ * Sets longitude minute.
+ *
+ * @param longitudeMinute longitude minute
+ * @return Builder object
+ */
+ public Builder withLongitudeMinute(byte longitudeMinute) {
+ this.longitudeMinute = longitudeMinute;
+ return this;
+ }
+
+ /**
+ * Sets longitude second.
+ *
+ * @param longitudeSecond longitude second
+ * @return Builder object
+ */
+ public Builder withLongitudeSecond(byte longitudeSecond) {
+ this.longitudeSecond = longitudeSecond;
+ return this;
+ }
+
+ /**
+ * Sets altitude.
+ *
+ * @param altitude altitude
+ * @return Builder object
+ */
+ public Builder withAltitude(int altitude) {
+ this.altitude = altitude;
+ return this;
+ }
+
+ /**
+ * Sets mapping address.
+ *
+ * @param address mapping addres
+ * @return Builder object
+ */
+ public Builder withAddress(MappingAddress address) {
+ this.address = address;
+ return this;
+ }
+
+ /**
+ * Builds LispGcAddress instance.
+ *
+ * @return LispGcAddress instance
+ */
+ public LispGcAddress build() {
+
+ return new LispGcAddress(north, latitudeDegree,
+ latitudeMinute, latitudeSecond, east, longitudeDegree,
+ longitudeMinute, longitudeSecond, altitude, address);
+ }
}
}
diff --git a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
index 77beeee..bba2c17 100644
--- a/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
+++ b/drivers/lisp/src/main/java/org/onosproject/drivers/lisp/extensions/LispListAddress.java
@@ -16,10 +16,22 @@
package org.onosproject.drivers.lisp.extensions;
+import com.google.common.collect.Maps;
+import org.onlab.util.KryoNamespace;
+import org.onosproject.mapping.addresses.ASMappingAddress;
+import org.onosproject.mapping.addresses.DNMappingAddress;
+import org.onosproject.mapping.addresses.EthMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddress;
import org.onosproject.mapping.addresses.ExtensionMappingAddressType;
+import org.onosproject.mapping.addresses.IPMappingAddress;
+import org.onosproject.mapping.addresses.MappingAddress;
import org.onosproject.net.flow.AbstractExtension;
+import org.onosproject.store.serializers.KryoNamespaces;
+import java.util.Map;
+import java.util.Objects;
+
+import static com.google.common.base.MoreObjects.toStringHelper;
import static org.onosproject.mapping.addresses.ExtensionMappingAddressType
.ExtensionMappingAddressTypes.LIST_ADDRESS;
@@ -31,6 +43,58 @@
*/
public class LispListAddress extends AbstractExtension
implements ExtensionMappingAddress {
+
+ private static final String IPV4 = "ipv4";
+ private static final String IPV6 = "ipv6";
+
+ private MappingAddress ipv4;
+ private MappingAddress ipv6;
+
+ private final KryoNamespace appKryo = new KryoNamespace.Builder()
+ .register(KryoNamespaces.API)
+ .register(MappingAddress.class)
+ .register(MappingAddress.Type.class)
+ .register(IPMappingAddress.class)
+ .register(ASMappingAddress.class)
+ .register(DNMappingAddress.class)
+ .register(EthMappingAddress.class)
+ .build();
+
+ /**
+ * Default constructor.
+ */
+ public LispListAddress() {
+ }
+
+ /**
+ * Creates an instance with initialized parameters.
+ *
+ * @param ipv4 IPv4 address
+ * @param ipv6 IPv6 address
+ */
+ private LispListAddress(MappingAddress ipv4, MappingAddress ipv6) {
+ this.ipv4 = ipv4;
+ this.ipv6 = ipv6;
+ }
+
+ /**
+ * Obtains IPv4 address.
+ *
+ * @return IPv4 address
+ */
+ public MappingAddress getIpv4() {
+ return ipv4;
+ }
+
+ /**
+ * Obtains IPv6 address.
+ *
+ * @return IPv6 address
+ */
+ public MappingAddress getIpv6() {
+ return ipv6;
+ }
+
@Override
public ExtensionMappingAddressType type() {
return LIST_ADDRESS.type();
@@ -38,11 +102,86 @@
@Override
public byte[] serialize() {
- return new byte[0];
+
+ Map<String, Object> parameterMap = Maps.newHashMap();
+
+ parameterMap.put(IPV4, ipv4);
+ parameterMap.put(IPV6, ipv6);
+
+ return appKryo.serialize(parameterMap);
}
@Override
public void deserialize(byte[] data) {
+ Map<String, Object> parameterMap = appKryo.deserialize(data);
+
+ this.ipv4 = (MappingAddress) parameterMap.get(IPV4);
+ this.ipv6 = (MappingAddress) parameterMap.get(IPV6);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(ipv4, ipv6);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj instanceof LispListAddress) {
+ LispListAddress that = (LispListAddress) obj;
+ return Objects.equals(ipv4, that.ipv4) &&
+ Objects.equals(ipv6, that.ipv6);
+ }
+ return false;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(type().toString())
+ .add("ipv4", ipv4)
+ .add("ipv6", ipv6)
+ .toString();
+ }
+
+ /**
+ * A builder for building LispListAddress.
+ */
+ public static final class Builder {
+ private MappingAddress ipv4;
+ private MappingAddress ipv6;
+
+ /**
+ * Sets IPv4 address.
+ *
+ * @param ipv4 IPv4 address
+ * @return Builder object
+ */
+ public Builder withIpv4(MappingAddress ipv4) {
+ this.ipv4 = ipv4;
+ return this;
+ }
+
+ /**
+ * Sets IPv6 address.
+ *
+ * @param ipv6 IPv6 address
+ * @return Builder object
+ */
+ public Builder withIpv6(MappingAddress ipv6) {
+ this.ipv6 = ipv6;
+ return this;
+ }
+
+ /**
+ * Builds LispListAddress instance.
+ *
+ * @return LispListAddress instance
+ */
+ public LispListAddress build() {
+ return new LispListAddress(ipv4, ipv6);
+ }
}
}
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispGcAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispGcAddressTest.java
new file mode 100644
index 0000000..bf18878
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispGcAddressTest.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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 org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispGcAddress extension class.
+ */
+public class LispGcAddressTest {
+
+ private static final IpPrefix IP_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+ private static final IpPrefix IP_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+ private static final boolean NORTH_VALUE_1 = true;
+ private static final boolean EAST_VALUE_1 = false;
+ private static final short UNIQUE_SHORT_VALUE_1 = 1;
+ private static final byte UNIQUE_BYTE_VALUE_1 = 1;
+ private static final int UNIQUE_INT_VALUE_1 = 1;
+
+ private static final boolean NORTH_VALUE_2 = false;
+ private static final boolean EAST_VALUE_2 = true;
+ private static final short UNIQUE_SHORT_VALUE_2 = 2;
+ private static final byte UNIQUE_BYTE_VALUE_2 = 2;
+ private static final int UNIQUE_INT_VALUE_2 = 2;
+
+ private LispGcAddress address1;
+ private LispGcAddress sameAsAddress1;
+ private LispGcAddress address2;
+
+ @Before
+ public void setUp() {
+
+ MappingAddress ma1 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ address1 = new LispGcAddress.Builder()
+ .withIsNorth(NORTH_VALUE_1)
+ .withLatitudeDegree(UNIQUE_SHORT_VALUE_1)
+ .withLatitudeMinute(UNIQUE_BYTE_VALUE_1)
+ .withLatitudeSecond(UNIQUE_BYTE_VALUE_1)
+ .withIsEast(EAST_VALUE_1)
+ .withLongitudeDegree(UNIQUE_SHORT_VALUE_1)
+ .withLongitudeMinute(UNIQUE_BYTE_VALUE_1)
+ .withLongitudeSecond(UNIQUE_BYTE_VALUE_1)
+ .withAltitude(UNIQUE_INT_VALUE_1)
+ .withAddress(ma1)
+ .build();
+
+ sameAsAddress1 = new LispGcAddress.Builder()
+ .withIsNorth(NORTH_VALUE_1)
+ .withLatitudeDegree(UNIQUE_SHORT_VALUE_1)
+ .withLatitudeMinute(UNIQUE_BYTE_VALUE_1)
+ .withLatitudeSecond(UNIQUE_BYTE_VALUE_1)
+ .withIsEast(EAST_VALUE_1)
+ .withLongitudeDegree(UNIQUE_SHORT_VALUE_1)
+ .withLongitudeMinute(UNIQUE_BYTE_VALUE_1)
+ .withLongitudeSecond(UNIQUE_BYTE_VALUE_1)
+ .withAltitude(UNIQUE_INT_VALUE_1)
+ .withAddress(ma1)
+ .build();
+
+ MappingAddress ma2 = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_2);
+
+ address2 = new LispGcAddress.Builder()
+ .withIsNorth(NORTH_VALUE_2)
+ .withLatitudeDegree(UNIQUE_SHORT_VALUE_2)
+ .withLatitudeMinute(UNIQUE_BYTE_VALUE_2)
+ .withLatitudeSecond(UNIQUE_BYTE_VALUE_2)
+ .withIsEast(EAST_VALUE_2)
+ .withLongitudeDegree(UNIQUE_SHORT_VALUE_2)
+ .withLongitudeMinute(UNIQUE_BYTE_VALUE_2)
+ .withLongitudeSecond(UNIQUE_BYTE_VALUE_2)
+ .withAltitude(UNIQUE_INT_VALUE_2)
+ .withAddress(ma2)
+ .build();
+
+ }
+
+ @Test
+ public void testEquality() {
+ new EqualsTester()
+ .addEqualityGroup(address1, sameAsAddress1)
+ .addEqualityGroup(address2).testEquals();
+ }
+
+ @Test
+ public void testConstruction() {
+ LispGcAddress address = address1;
+
+ MappingAddress ma = MappingAddresses.ipv4MappingAddress(IP_ADDRESS_1);
+
+ assertThat(address.isNorth(), is(NORTH_VALUE_1));
+ assertThat(address.getLatitudeDegree(), is(UNIQUE_SHORT_VALUE_1));
+ assertThat(address.getLatitudeMinute(), is(UNIQUE_BYTE_VALUE_1));
+ assertThat(address.getLatitudeSecond(), is(UNIQUE_BYTE_VALUE_1));
+ assertThat(address.isEast(), is(EAST_VALUE_1));
+ assertThat(address.getLongitudeDegree(), is(UNIQUE_SHORT_VALUE_1));
+ assertThat(address.getLongitudeMinute(), is(UNIQUE_BYTE_VALUE_1));
+ assertThat(address.getLongitudeSecond(), is(UNIQUE_BYTE_VALUE_1));
+ assertThat(address.getAltitude(), is(UNIQUE_INT_VALUE_1));
+ assertThat(address.getAddress(), is(ma));
+ }
+
+ @Test
+ public void testSerialization() {
+ LispGcAddress other = new LispGcAddress();
+ other.deserialize(address1.serialize());
+
+ new EqualsTester()
+ .addEqualityGroup(address1, other)
+ .testEquals();
+ }
+}
diff --git a/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispListAddressTest.java b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispListAddressTest.java
new file mode 100644
index 0000000..29cd5cc
--- /dev/null
+++ b/drivers/lisp/src/test/java/org/onosproject/drivers/lisp/extensions/LispListAddressTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017-present Open Networking Laboratory
+ *
+ * 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 org.onosproject.drivers.lisp.extensions;
+
+import com.google.common.testing.EqualsTester;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.IpPrefix;
+import org.onosproject.mapping.addresses.MappingAddress;
+import org.onosproject.mapping.addresses.MappingAddresses;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+
+/**
+ * Unit tests for LispListAddress extension class.
+ */
+public class LispListAddressTest {
+
+ private static final IpPrefix IPV4_ADDRESS_1 = IpPrefix.valueOf("1.2.3.4/24");
+ private static final IpPrefix IPV4_ADDRESS_2 = IpPrefix.valueOf("5.6.7.8/24");
+
+ private static final IpPrefix IPV6_ADDRESS_1 = IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8886/96");
+ private static final IpPrefix IPV6_ADDRESS_2 = IpPrefix.valueOf("2222:3333:4444:5555:6666:7777:8888:9999/96");
+
+ private LispListAddress address1;
+ private LispListAddress sameAsAddress1;
+ private LispListAddress address2;
+
+ @Before
+ public void setUp() {
+
+ MappingAddress ipv4Addr1 = MappingAddresses.ipv4MappingAddress(IPV4_ADDRESS_1);
+ MappingAddress ipv6Addr1 = MappingAddresses.ipv6MappingAddress(IPV6_ADDRESS_1);
+
+ address1 = new LispListAddress.Builder()
+ .withIpv4(ipv4Addr1)
+ .withIpv6(ipv6Addr1)
+ .build();
+
+ sameAsAddress1 = new LispListAddress.Builder()
+ .withIpv4(ipv4Addr1)
+ .withIpv6(ipv6Addr1)
+ .build();
+
+ MappingAddress ipv4Addr2 = MappingAddresses.ipv4MappingAddress(IPV4_ADDRESS_2);
+ MappingAddress ipv6Addr2 = MappingAddresses.ipv6MappingAddress(IPV6_ADDRESS_2);
+
+ address2 = new LispListAddress.Builder()
+ .withIpv4(ipv4Addr2)
+ .withIpv6(ipv6Addr2)
+ .build();
+ }
+
+ @Test
+ public void testEquality() {
+ new EqualsTester()
+ .addEqualityGroup(address1, sameAsAddress1)
+ .addEqualityGroup(address2).testEquals();
+ }
+
+ @Test
+ public void testConstruction() {
+ LispListAddress address = address1;
+
+ MappingAddress ipv4 = MappingAddresses.ipv4MappingAddress(IPV4_ADDRESS_1);
+ MappingAddress ipv6 = MappingAddresses.ipv6MappingAddress(IPV6_ADDRESS_1);
+
+ assertThat(address.getIpv4(), is(ipv4));
+ assertThat(address.getIpv6(), is(ipv6));
+ }
+
+ @Test
+ public void testSerialization() {
+ LispListAddress other = new LispListAddress();
+ other.deserialize(address1.serialize());
+
+ new EqualsTester()
+ .addEqualityGroup(address1, other)
+ .testEquals();
+ }
+}