[ONOS-3222] Implement toString method for each Packet class

Change-Id: I17d72338d4202117d08b3dca9463be35a87a0c1e
diff --git a/utils/misc/src/test/java/org/onlab/packet/ArpTest.java b/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
index 6224624..c057176 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ArpTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -45,7 +46,7 @@
     @Before
     public void setUp() {
         ByteBuffer bb = ByteBuffer.allocate(ARP.INITIAL_HEADER_LENGTH +
-                        2 * hwAddressLength + 2 * protoAddressLength);
+                2 * hwAddressLength + 2 * protoAddressLength);
         bb.putShort(ARP.HW_TYPE_ETHERNET);
         bb.putShort(ARP.PROTO_TYPE_IP);
         bb.put(hwAddressLength);
@@ -70,6 +71,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, byteHeader);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         ARP arp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
@@ -85,4 +89,19 @@
         assertTrue(Arrays.equals(targetMac.toBytes(), arp.getTargetHardwareAddress()));
         assertTrue(Arrays.equals(targetIp.toOctets(), arp.getTargetProtocolAddress()));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringArp() throws Exception {
+        ARP arp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
+        String str = arp.toString();
+        assertTrue(StringUtils.contains(str, "hardwareAddressLength=" + hwAddressLength));
+        assertTrue(StringUtils.contains(str, "protocolAddressLength=" + protoAddressLength));
+        assertTrue(StringUtils.contains(str, "senderHardwareAddress=" + Arrays.toString(srcMac.toBytes())));
+        assertTrue(StringUtils.contains(str, "senderProtocolAddress=" + Arrays.toString(srcIp.toOctets())));
+        assertTrue(StringUtils.contains(str, "targetHardwareAddress=" + Arrays.toString(targetMac.toBytes())));
+        assertTrue(StringUtils.contains(str, "targetProtocolAddress=" + Arrays.toString(targetIp.toOctets())));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java b/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
index aac8141..085adf9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/DhcpTest.java
@@ -17,6 +17,7 @@
 package org.onlab.packet;
 
 import com.google.common.base.Charsets;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -111,6 +112,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, byteHeader);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         DHCP dhcp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
@@ -134,4 +138,28 @@
         assertEquals(hostNameOption, dhcp.options.get(0));
     }
 
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringDhcp() throws Exception {
+        DHCP dhcp = deserializer.deserialize(byteHeader, 0, byteHeader.length);
+        String str = dhcp.toString();
+
+        assertTrue(StringUtils.contains(str, "opCode=" + opCode));
+        assertTrue(StringUtils.contains(str, "hardwareType=" + hardwareType));
+        assertTrue(StringUtils.contains(str, "hardwareAddressLength=" + hardwareAddressLength));
+        assertTrue(StringUtils.contains(str, "hops=" + hops));
+        assertTrue(StringUtils.contains(str, "transactionId=" + transactionId));
+        assertTrue(StringUtils.contains(str, "seconds=" + seconds));
+        assertTrue(StringUtils.contains(str, "flags=" + flags));
+        assertTrue(StringUtils.contains(str, "clientIPAddress=" + clientIpAddress));
+        assertTrue(StringUtils.contains(str, "yourIPAddress=" + yourIpAddress));
+        assertTrue(StringUtils.contains(str, "serverIPAddress=" + serverIpAddress));
+        assertTrue(StringUtils.contains(str, "gatewayIPAddress=" + gatewayIpAddress));
+        assertTrue(StringUtils.contains(str, "clientHardwareAddress=" + Arrays.toString(clientHardwareAddress)));
+        assertTrue(StringUtils.contains(str, "serverName=" + serverName));
+        assertTrue(StringUtils.contains(str, "bootFileName=" + bootFileName));
+        // TODO: add option unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java b/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
index 39ddc24..8616b48 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ICMP6Test.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -107,4 +108,17 @@
         assertTrue(icmp61.equals(icmp61));
         assertFalse(icmp61.equals(icmp62));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIcmp6() throws Exception {
+        ICMP6 icmp6 = ICMP6.deserializer().deserialize(bytePacket, 0, bytePacket.length);
+        String str = icmp6.toString();
+
+        assertTrue(StringUtils.contains(str, "icmpType=" + ICMP6.ECHO_REQUEST));
+        assertTrue(StringUtils.contains(str, "icmpCode=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x82bc));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java b/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
index 8514aa5..e836dc4 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ICMPTest.java
@@ -16,12 +16,14 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for the ICMP class.
@@ -59,6 +61,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, headerBytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         ICMP icmp = deserializer.deserialize(headerBytes, 0, headerBytes.length);
@@ -67,4 +72,17 @@
         assertEquals(icmpCode, icmp.getIcmpCode());
         assertEquals(checksum, icmp.getChecksum());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIcmp() throws Exception {
+        ICMP icmp = deserializer.deserialize(headerBytes, 0, headerBytes.length);
+        String str = icmp.toString();
+
+        assertTrue(StringUtils.contains(str, "icmpType=" + icmpType));
+        assertTrue(StringUtils.contains(str, "icmpCode=" + icmpCode));
+        assertTrue(StringUtils.contains(str, "checksum=" + checksum));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java b/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
index a25f721..7634bbf 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IGMPTest.java
@@ -93,4 +93,12 @@
         IGMP igmp = deserializer.deserialize(data, 0, data.length);
         assertTrue(igmp.equals(igmpMembership));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIgmp() throws Exception {
+        // TODO: add toString unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java b/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
index 1bacf2a..8412701 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IPv4Test.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -78,6 +79,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, headerBytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         IPv4 ipv4 = deserializer.deserialize(headerBytes, 0, headerBytes.length);
@@ -96,4 +100,26 @@
         assertEquals(destinationAddress, ipv4.getDestinationAddress());
         assertTrue(ipv4.isTruncated());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIPv4() throws Exception {
+        IPv4 ipv4 = deserializer.deserialize(headerBytes, 0, headerBytes.length);
+        String str = ipv4.toString();
+
+        assertTrue(StringUtils.contains(str, "version=" + version));
+        assertTrue(StringUtils.contains(str, "headerLength=" + headerLength));
+        assertTrue(StringUtils.contains(str, "diffServ=" + diffServ));
+        assertTrue(StringUtils.contains(str, "totalLength=" + totalLength));
+        assertTrue(StringUtils.contains(str, "identification=" + identification));
+        assertTrue(StringUtils.contains(str, "flags=" + flags));
+        assertTrue(StringUtils.contains(str, "fragmentOffset=" + fragmentOffset));
+        assertTrue(StringUtils.contains(str, "ttl=" + ttl));
+        assertTrue(StringUtils.contains(str, "protocol=" + protocol));
+        assertTrue(StringUtils.contains(str, "checksum=" + checksum));
+        assertTrue(StringUtils.contains(str, "sourceAddress=" + sourceAddress));
+        assertTrue(StringUtils.contains(str, "destinationAddress=" + destinationAddress));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java b/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
index 720a4d2..84e2644 100644
--- a/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
+++ b/utils/misc/src/test/java/org/onlab/packet/IPv6Test.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -151,4 +152,20 @@
         assertTrue(packet1.equals(packet1));
         assertFalse(packet1.equals(packet2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringIPv6() throws Exception {
+        IPv6 ipv6 = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ipv6.toString();
+
+        assertTrue(StringUtils.contains(str, "version=" + (byte) 6));
+        assertTrue(StringUtils.contains(str, "trafficClass=" + (byte) 0x93));
+        assertTrue(StringUtils.contains(str, "flowLabel=" + 0x13579));
+        assertTrue(StringUtils.contains(str, "nextHeader=" + IPv6.PROTOCOL_UDP));
+        assertTrue(StringUtils.contains(str, "hopLimit=" + (byte) 32));
+        // TODO: test IPv6 source and destination address
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/LLCTest.java b/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
index 39bb72f..8154148 100644
--- a/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/LLCTest.java
@@ -16,12 +16,14 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.nio.ByteBuffer;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for LLC class.
@@ -59,6 +61,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         LLC llc = deserializer.deserialize(bytes, 0, bytes.length);
@@ -67,4 +72,17 @@
         assertEquals(ssap, llc.getSsap());
         assertEquals(ctrl, llc.getCtrl());
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringLLC() throws Exception {
+        LLC llc = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = llc.toString();
+
+        assertTrue(StringUtils.contains(str, "dsap=" + dsap));
+        assertTrue(StringUtils.contains(str, "ssap=" + ssap));
+        assertTrue(StringUtils.contains(str, "ctrl=" + ctrl));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java b/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
index 95b0b04..154dee7 100644
--- a/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/LLDPTest.java
@@ -89,6 +89,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         LLDP lldp = deserializer.deserialize(bytes, 0, bytes.length);
@@ -112,4 +115,15 @@
         assertEquals(optionalTlvSize, optionalTlv.getLength());
         assertTrue(Arrays.equals(optionalTlvValue, optionalTlv.getValue()));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringLLDP() throws Exception {
+        LLDP lldp = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = lldp.toString();
+
+        // TODO: need to add LLDP toString unit test
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/MplsTest.java b/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
index 2ab8ff9..b08b2e9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/MplsTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -23,6 +24,7 @@
 import java.util.HashMap;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * Unit tests for MPLS class.
@@ -62,6 +64,9 @@
         PacketTestUtils.testDeserializeTruncated(deserializer, bytes);
     }
 
+    /**
+     * Tests deserialize and getters.
+     */
     @Test
     public void testDeserialize() throws Exception {
         MPLS mpls = deserializer.deserialize(bytes, 0, bytes.length);
@@ -71,4 +76,18 @@
         assertEquals(ttl, mpls.ttl);
         assertEquals(protocol, mpls.protocol);
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringMpls() throws Exception {
+        MPLS mpls = deserializer.deserialize(bytes, 0, bytes.length);
+        String str = mpls.toString();
+
+        assertTrue(StringUtils.contains(str, "label=" + label));
+        assertTrue(StringUtils.contains(str, "bos=" + bos));
+        assertTrue(StringUtils.contains(str, "ttl=" + ttl));
+        assertTrue(StringUtils.contains(str, "protocol=" + protocol));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java b/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
index 209b1d2..3fcd6b5 100644
--- a/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
+++ b/utils/misc/src/test/java/org/onlab/packet/PacketTestUtils.java
@@ -61,7 +61,7 @@
      * deserialize the packet.
      *
      * @param deserializer deserializer function to test
-     * @param header byte array of a full-size packet
+     * @param header       byte array of a full-size packet
      */
     public static void testDeserializeTruncated(Deserializer deserializer,
                                                 byte[] header) {
@@ -82,9 +82,9 @@
      * DeserializationException is not thrown by the deserializer function.
      *
      * @param deserializer deserializer function to test
-     * @param bytes input byte array
-     * @param offset input offset
-     * @param length input length
+     * @param bytes        input byte array
+     * @param offset       input offset
+     * @param length       input length
      */
     public static void expectDeserializationException(Deserializer deserializer,
                                                       byte[] bytes, int offset, int length) {
diff --git a/utils/misc/src/test/java/org/onlab/packet/TCPTest.java b/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
index faab5c2..1d6814b 100644
--- a/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/TCPTest.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -160,4 +161,23 @@
         assertTrue(tcp1.equals(tcp1));
         assertFalse(tcp1.equals(tcp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringTcp() throws Exception {
+        TCP tcp = deserializer.deserialize(bytePacketTCP4, 0, bytePacketTCP4.length);
+        String str = tcp.toString();
+
+        assertTrue(StringUtils.contains(str, "sourcePort=" + 0x50));
+        assertTrue(StringUtils.contains(str, "destinationPort=" + 0x60));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0x10));
+        assertTrue(StringUtils.contains(str, "acknowledge=" + 0x20));
+        assertTrue(StringUtils.contains(str, "dataOffset=" + (byte) 0x5));
+        assertTrue(StringUtils.contains(str, "flags=" + (short) 0x2));
+        assertTrue(StringUtils.contains(str, "windowSize=" + (short) 0x1000));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x1bae));
+        assertTrue(StringUtils.contains(str, "urgentPointer=" + (short) 0x1));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/UDPTest.java b/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
index ba453f6..4b83897 100644
--- a/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/UDPTest.java
@@ -18,6 +18,7 @@
 
 package org.onlab.packet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -131,4 +132,18 @@
         assertTrue(udp1.equals(udp1));
         assertFalse(udp1.equals(udp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringUdp() throws Exception {
+        UDP udp = deserializer.deserialize(bytePacketUDP4, 0, bytePacketUDP4.length);
+        String str = udp.toString();
+
+        assertTrue(StringUtils.contains(str, "sourcePort=" + 0x50));
+        assertTrue(StringUtils.contains(str, "destinationPort=" + 0x60));
+        assertTrue(StringUtils.contains(str, "length=" + (short) 8));
+        assertTrue(StringUtils.contains(str, "checksum=" + (short) 0x7bda));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
index 39ab910..5ca7ea4 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/AuthenticationTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -23,11 +24,10 @@
 import org.onlab.packet.Deserializer;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link Authentication}.
@@ -118,4 +118,19 @@
         assertTrue(auth1.equals(auth1));
         assertFalse(auth1.equals(auth2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringAuthentication() throws Exception {
+        Authentication auth = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = auth.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "payloadLength=" + (byte) 0x02));
+        assertTrue(StringUtils.contains(str, "securityParamIndex=" + 0x13572468));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0xffff00));
+        assertTrue(StringUtils.contains(str, "integrityCheck=" + Arrays.toString(icv)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
index bb91e9e..17ada1e 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/BaseOptionsTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -24,11 +25,10 @@
 import org.onlab.packet.IPv6;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link BaseOptions}.
@@ -112,4 +112,17 @@
         assertTrue(baseopt1.equals(baseopt1));
         assertFalse(baseopt1.equals(baseopt2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringBaseOptions() throws Exception {
+        BaseOptions baseopt = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = baseopt.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "headerExtLength=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "options=" + Arrays.toString(options)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
index e0e9919..d8e2f34 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/EncapSecurityPayloadTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -101,4 +102,16 @@
         assertTrue(esp1.equals(esp1));
         assertFalse(esp1.equals(esp2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringESP() throws Exception {
+        EncapSecurityPayload esp = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = esp.toString();
+
+        assertTrue(StringUtils.contains(str, "securityParamIndex=" + 0x13572468));
+        assertTrue(StringUtils.contains(str, "sequence=" + 0xffff00));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
index f2d5e48..7e5dc15 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/FragmentTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -110,4 +111,18 @@
         assertTrue(frag1.equals(frag1));
         assertFalse(frag1.equals(frag2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringFragment() throws Exception {
+        Fragment frag = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = frag.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "fragmentOffset=" + (short) 0x1f));
+        assertTrue(StringUtils.contains(str, "moreFragment=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "identification=" + 0x1357));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java b/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
index a03bacc..293c9d7 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ipv6/RoutingTest.java
@@ -16,6 +16,7 @@
 
 package org.onlab.packet.ipv6;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -24,11 +25,10 @@
 import org.onlab.packet.Deserializer;
 import org.onlab.packet.UDP;
 
+import java.util.Arrays;
+
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link Routing}.
@@ -125,4 +125,19 @@
         assertTrue(routing1.equals(routing1));
         assertFalse(routing1.equals(routing2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRouting() throws Exception {
+        Routing routing = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = routing.toString();
+
+        assertTrue(StringUtils.contains(str, "nextHeader=" + (byte) 0x11));
+        assertTrue(StringUtils.contains(str, "headerExtLength=" + (byte) 0x02));
+        assertTrue(StringUtils.contains(str, "routingType=" + (byte) 0x00));
+        assertTrue(StringUtils.contains(str, "segmentsLeft=" + (byte) 0x03));
+        assertTrue(StringUtils.contains(str, "routingData=" + Arrays.toString(routingData)));
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
index d537251..6b03ca9 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborAdvertisementTest.java
@@ -15,6 +15,7 @@
  */
 package org.onlab.packet.ndp;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.packet.DeserializationException;
@@ -25,10 +26,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link NeighborAdvertisement}.
@@ -137,4 +135,18 @@
         assertTrue(na1.equals(na1));
         assertFalse(na1.equals(na2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringNA() throws Exception {
+        NeighborAdvertisement na = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = na.toString();
+
+        assertTrue(StringUtils.contains(str, "routerFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "solicitedFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "overrideFlag=" + (byte) 1));
+        // TODO: need to handle TARGET_ADDRESS
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
index 03e57f5e..6f8c9da 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/NeighborSolicitationTest.java
@@ -25,10 +25,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link NeighborSolicitation}.
@@ -131,4 +128,15 @@
         assertTrue(ns1.equals(ns1));
         assertFalse(ns1.equals(ns2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringNS() throws Exception {
+        NeighborSolicitation ns = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ns.toString();
+
+        // TODO: need to handle TARGET_ADDRESS and Options
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
index 3115714..e70da7c 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RedirectTest.java
@@ -144,4 +144,15 @@
         assertTrue(rd1.equals(rd1));
         assertFalse(rd1.equals(rd2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRedirect() throws Exception {
+        Redirect rd = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = rd.toString();
+
+        // TODO: need to handle TARGET_ADDRESS and DESTINATION_ADDRESS
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
index ede1574..014f36e 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterAdvertisementTest.java
@@ -15,6 +15,7 @@
  */
 package org.onlab.packet.ndp;
 
+import org.apache.commons.lang3.StringUtils;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.onlab.packet.DeserializationException;
@@ -137,4 +138,22 @@
         assertTrue(ra1.equals(ra1));
         assertFalse(ra1.equals(ra2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRA() throws Exception {
+        RouterAdvertisement ra = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = ra.toString();
+
+        assertTrue(StringUtils.contains(str, "currentHopLimit=" + (byte) 3));
+        assertTrue(StringUtils.contains(str, "mFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "oFlag=" + (byte) 1));
+        assertTrue(StringUtils.contains(str, "routerLifetime=" + (short) 0x258));
+        assertTrue(StringUtils.contains(str, "reachableTime=" + 0x3e8));
+        assertTrue(StringUtils.contains(str, "retransmitTimer=" + 0x1f4));
+
+        // TODO: need to handle options
+    }
 }
diff --git a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
index e3b5686..b562f38 100644
--- a/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
+++ b/utils/misc/src/test/java/org/onlab/packet/ndp/RouterSolicitationTest.java
@@ -24,10 +24,7 @@
 import java.nio.ByteBuffer;
 
 import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 
 /**
  * Tests for class {@link RouterSolicitation}.
@@ -111,4 +108,15 @@
         assertTrue(rs1.equals(rs1));
         assertFalse(rs1.equals(rs2));
     }
+
+    /**
+     * Tests toString.
+     */
+    @Test
+    public void testToStringRS() throws Exception {
+        RouterSolicitation rs = deserializer.deserialize(bytePacket, 0, bytePacket.length);
+        String str = rs.toString();
+
+        // TODO: need to handle Options
+    }
 }