Packet class unit tests

Added unit tests for DefaultInboundPacket, DefaultOutboundPacket,
and DefaultPacketContext.

Made DefaultInboundPacket and DefaultOutboundPacket proper immutable classes

Added equals() and hashCode() to DefaultOutboundPacket

Change-Id: Ibb1199a5282743ccaf0844c0b7ccfcc4cb13f52e
diff --git a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
index 01ecf96..624f0d8 100644
--- a/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
+++ b/core/api/src/main/java/org/onlab/onos/net/packet/DefaultOutboundPacket.java
@@ -16,6 +16,7 @@
 package org.onlab.onos.net.packet;
 
 import java.nio.ByteBuffer;
+import java.util.Objects;
 
 import org.onlab.onos.net.DeviceId;
 import org.onlab.onos.net.flow.TrafficTreatment;
@@ -25,7 +26,7 @@
 /**
  * Default implementation of an immutable outbound packet.
  */
-public class DefaultOutboundPacket implements OutboundPacket {
+public final class DefaultOutboundPacket implements OutboundPacket {
     private final DeviceId sendThrough;
     private final TrafficTreatment treatment;
     private final ByteBuffer data;
@@ -61,6 +62,24 @@
     }
 
     @Override
+    public int hashCode() {
+        return Objects.hash(sendThrough, treatment, data);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof OutboundPacket) {
+            final DefaultOutboundPacket other = (DefaultOutboundPacket) obj;
+            return Objects.equals(this.sendThrough, other.sendThrough) &&
+                    Objects.equals(this.treatment, other.treatment) &&
+                    Objects.equals(this.data, other.data);
+        }
+        return false;
+    }
+    @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
                 .add("sendThrough", sendThrough)