Add unit tests for LISP address serializer and deserializer

Change-Id: I56538221f3951d18c1feb9343d87cbb46c3ed04d
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
index 1d88008..c7e72c5 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAfiAddress.java
@@ -126,6 +126,10 @@
 
         @Override
         public void writeTo(ByteBuf byteBuf, LispAfiAddress address) throws LispWriterException {
+
+            // AFI code
+            byteBuf.writeShort(address.getAfi().getIanaCode());
+
             switch (address.getAfi()) {
                 case IP:
                     new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpv4Address) address);
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
index 284ebe4..56ff2f2 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispAppDataLcafAddress.java
@@ -21,6 +21,7 @@
 import org.onosproject.lisp.msg.exceptions.LispWriterException;
 
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
@@ -352,7 +353,7 @@
         }
 
         /**
-         * A utility function that obtains the partial int value from byte arrays.
+         * An utility function that obtains the partial int value from byte arrays.
          *
          * @param bytes an array of bytes
          * @return converted integer
@@ -378,8 +379,8 @@
 
             LispLcafAddress.serializeCommon(byteBuf, address);
 
-            // TODO: need to handle TOS
-
+            byte[] tos = getPartialByteArray(address.getIpTos());
+            byteBuf.writeBytes(tos);
             byteBuf.writeByte(address.getProtocol());
             byteBuf.writeShort(address.getLocalPortLow());
             byteBuf.writeShort(address.getLocalPortHigh());
@@ -389,5 +390,17 @@
             AfiAddressWriter writer = new LispAfiAddress.AfiAddressWriter();
             writer.writeTo(byteBuf, address.getAddress());
         }
+
+        /**
+         * An utility function that obtains byte array from partial int value.
+         *
+         * @param value integer value
+         * @return an array of bytes
+         */
+        public static byte[] getPartialByteArray(int value) {
+            ByteBuffer buffer = ByteBuffer.allocate(4);
+            byte[] array = buffer.putInt(value).array();
+            return Arrays.copyOfRange(array, 1, 4);
+        }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
index 77f1c08..d4be998 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispDistinguishedNameAddress.java
@@ -84,10 +84,10 @@
         public LispDistinguishedNameAddress readFrom(ByteBuf byteBuf) throws LispParseError {
 
             StringBuilder sb = new StringBuilder();
-            byte character = byteBuf.readByte();
-            while (character != 0) {
-                sb.append((char) character);
+            byte character;
+            while (byteBuf.readerIndex() < byteBuf.writerIndex()) {
                 character = byteBuf.readByte();
+                sb.append((char) character);
             }
 
             return new LispDistinguishedNameAddress(sb.toString());
@@ -105,7 +105,7 @@
             String distinguishedName = address.getDistinguishedName();
             byte[] nameBytes = distinguishedName.getBytes();
             for (int i = 0; i < nameBytes.length; i++) {
-                byteBuf.writeChar(nameBytes[i]);
+                byteBuf.writeByte(nameBytes[i]);
             }
         }
     }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
index ed3ad43..2017174 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispIpv6Address.java
@@ -35,7 +35,7 @@
      * @param address IP address
      */
     public LispIpv6Address(IpAddress address) {
-        super(address, AddressFamilyIdentifierEnum.IP);
+        super(address, AddressFamilyIdentifierEnum.IP6);
         checkArgument(address.isIp6());
     }
 
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
index 3552b45..68834db 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispListLcafAddress.java
@@ -128,8 +128,10 @@
 
             LispLcafAddress lcafAddress = LispLcafAddress.deserializeCommon(byteBuf);
 
-            LispAfiAddress ipv4 = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
-            LispAfiAddress ipv6 = new LispAfiAddress.AfiAddressReader().readFrom(byteBuf);
+            AfiAddressReader reader = new AfiAddressReader();
+
+            LispAfiAddress ipv4 = reader.readFrom(byteBuf);
+            LispAfiAddress ipv6 = reader.readFrom(byteBuf);
 
             return new LispListLcafAddress(lcafAddress.getReserved1(), lcafAddress.getReserved2(),
                                            lcafAddress.getFlag(), ImmutableList.of(ipv4, ipv6));
@@ -141,6 +143,9 @@
      */
     public static class ListLcafAddressWriter implements LispAddressWriter<LispListLcafAddress> {
 
+        private static final int IPV4_ADDRESS_INDEX = 0;
+        private static final int IPV6_ADDRESS_INDEX = 1;
+
         @Override
         public void writeTo(ByteBuf byteBuf, LispListLcafAddress address) throws LispWriterException {
 
@@ -149,8 +154,16 @@
             LispIpv4Address.Ipv4AddressWriter v4Writer = new LispIpv4Address.Ipv4AddressWriter();
             LispIpv6Address.Ipv6AddressWriter v6Writer = new LispIpv6Address.Ipv6AddressWriter();
 
-            v4Writer.writeTo(byteBuf, (LispIpv4Address) address.getAddresses().get(0));
-            v6Writer.writeTo(byteBuf, (LispIpv6Address) address.getAddresses().get(1));
+            LispAfiAddress ipv4 = address.getAddresses().get(IPV4_ADDRESS_INDEX);
+            LispAfiAddress ipv6 = address.getAddresses().get(IPV6_ADDRESS_INDEX);
+
+            // IPv4 address
+            byteBuf.writeShort(ipv4.getAfi().getIanaCode());
+            v4Writer.writeTo(byteBuf, (LispIpv4Address) ipv4);
+
+            // IPv6 address
+            byteBuf.writeShort(ipv6.getAfi().getIanaCode());
+            v6Writer.writeTo(byteBuf, (LispIpv6Address) ipv6);
         }
     }
 }
diff --git a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
index 8405695..c6a84cc 100644
--- a/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
+++ b/protocols/lisp/msg/src/main/java/org/onosproject/lisp/msg/types/LispSegmentLcafAddress.java
@@ -227,7 +227,8 @@
             LispLcafAddress.serializeCommon(byteBuf, address);
 
             byteBuf.writeInt(address.getInstanceId());
-            new LispIpAddress.IpAddressWriter().writeTo(byteBuf, (LispIpAddress) address.getAddress());
+
+            new LispAfiAddress.AfiAddressWriter().writeTo(byteBuf, address.getAddress());
         }
     }
 }