[ONOS-700][ONOS-1801]refactor tunnel subsystem api.
1.use more abstract and more flexible entity[TunnelPoint] to represent
for source or destination point of tunnel,instead of Label
2.suport for muti-producer
3.use Order entity to record tunnel-order relationship
4.modify Tunnel entity to add more properties.
5.rename Label and LabelId to OpticalTunnelPoint and OpticalLogicId in
order to keep code style consistently,at the same time
OpticalTunnelPoint implements TunnelPoint
6.add junit test

Change-Id: I371afcef5501e468a43758c5982e7a93b443b114
diff --git a/core/api/src/test/java/org/onosproject/net/tunnel/DefaultTunnelTest.java b/core/api/src/test/java/org/onosproject/net/tunnel/DefaultTunnelTest.java
new file mode 100644
index 0000000..7ea5be2
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/tunnel/DefaultTunnelTest.java
@@ -0,0 +1,47 @@
+package org.onosproject.net.tunnel;
+
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.DefaultGroupId;
+import org.onosproject.net.provider.ProviderId;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test of the default tunnel model entity.
+ */
+public class DefaultTunnelTest {
+    /**
+     * Checks that the Order class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(DefaultTunnel.class);
+    }
+
+    @Test
+    public void testEquality() {
+        TunnelEndPoint src = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                .valueOf(23423));
+        TunnelEndPoint dst = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                .valueOf(32421));
+        DefaultGroupId groupId = new DefaultGroupId(92034);
+        TunnelName tunnelName = TunnelName.tunnelName("TunnelName");
+        TunnelId tunnelId = TunnelId.valueOf(41654654);
+        ProviderId producerName1 = new ProviderId("producer1", "13");
+        ProviderId producerName2 = new ProviderId("producer2", "13");
+        Tunnel p1 = new DefaultTunnel(producerName1, src, dst, Tunnel.Type.VXLAN,
+                                      Tunnel.State.ACTIVE, groupId, tunnelId,
+                                      tunnelName);
+        Tunnel p2 = new DefaultTunnel(producerName1, src, dst, Tunnel.Type.VXLAN,
+                                      Tunnel.State.ACTIVE, groupId, tunnelId,
+                                      tunnelName);
+        Tunnel p3 = new DefaultTunnel(producerName2, src, dst, Tunnel.Type.OCH,
+                                      Tunnel.State.ACTIVE, groupId, tunnelId,
+                                      tunnelName);
+        new EqualsTester().addEqualityGroup(p1, p2).addEqualityGroup(p3)
+                .testEquals();
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/tunnel/TunnelEventTest.java b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelEventTest.java
new file mode 100644
index 0000000..06a1f09
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelEventTest.java
@@ -0,0 +1,46 @@
+package org.onosproject.net.tunnel;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.DefaultGroupId;
+import org.onosproject.net.provider.ProviderId;
+
+/**
+ * Test of a tunnel event.
+ */
+public class TunnelEventTest {
+    /**
+     * Checks that the Order class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(TunnelEvent.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testConstructor() {
+        TunnelEndPoint src = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                .valueOf(23423));
+        TunnelEndPoint dst = IpTunnelEndPoint.ipTunnelPoint(IpAddress
+                .valueOf(32421));
+        DefaultGroupId groupId = new DefaultGroupId(92034);
+        TunnelName tunnelName = TunnelName.tunnelName("TunnelName");
+        TunnelId tunnelId = TunnelId.valueOf(41654654);
+        ProviderId producerName1 = new ProviderId("producer1", "13");
+        Tunnel p1 = new DefaultTunnel(producerName1, src, dst, Tunnel.Type.VXLAN,
+                                      Tunnel.State.ACTIVE, groupId, tunnelId,
+                                      tunnelName);
+        TunnelEvent e1 = new TunnelEvent(TunnelEvent.Type.TUNNEL_ADDED, p1);
+        assertThat(e1, is(notNullValue()));
+        assertThat(e1.type(), is(TunnelEvent.Type.TUNNEL_ADDED));
+        assertThat(e1.subject(), is(p1));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/tunnel/TunnelIdTest.java b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelIdTest.java
new file mode 100644
index 0000000..aeba1e6
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelIdTest.java
@@ -0,0 +1,50 @@
+package org.onosproject.net.tunnel;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Unit tests for tunnel id class.
+ */
+public class TunnelIdTest {
+
+    final TunnelId tunnelId1 = TunnelId.valueOf(1);
+    final TunnelId sameAstunnelId1 = TunnelId.valueOf(1);
+    final TunnelId tunnelId2 = TunnelId.valueOf(2);
+
+    /**
+     * Checks that the TunnelId class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(TunnelId.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester()
+                .addEqualityGroup(tunnelId1, sameAstunnelId1)
+                .addEqualityGroup(tunnelId2)
+                .testEquals();
+    }
+
+    /**
+     * Checks the construction of a FlowId object.
+     */
+    @Test
+    public void testConstruction() {
+        final long tunnelIdValue = 7777L;
+        final TunnelId tunnelId = TunnelId.valueOf(tunnelIdValue);
+        assertThat(tunnelId, is(notNullValue()));
+        assertThat(tunnelId.id(), is(tunnelIdValue));
+    }
+}
diff --git a/core/api/src/test/java/org/onosproject/net/tunnel/TunnelNameTest.java b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelNameTest.java
new file mode 100644
index 0000000..87421db
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelNameTest.java
@@ -0,0 +1,48 @@
+package org.onosproject.net.tunnel;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import org.junit.Test;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Unit tests for tunnel name class.
+ */
+public class TunnelNameTest {
+    final TunnelName name1 = TunnelName.tunnelName("name1");
+    final TunnelName sameAsName1 = TunnelName.tunnelName("name1");
+    final TunnelName name2 = TunnelName.tunnelName("name2");
+
+    /**
+     * Checks that the TunnelName class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(TunnelName.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquals() {
+        new EqualsTester().addEqualityGroup(name1, sameAsName1)
+                .addEqualityGroup(name2).testEquals();
+    }
+
+    /**
+     * Checks the construction of a OpenFlowGroupId object.
+     */
+    @Test
+    public void testConstruction() {
+        final String nameValue = "name3";
+        final TunnelName name = TunnelName.tunnelName(nameValue);
+        assertThat(name, is(notNullValue()));
+        assertThat(name.value(), is(nameValue));
+    }
+
+}
diff --git a/core/api/src/test/java/org/onosproject/net/tunnel/TunnelSubscriptionTest.java b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelSubscriptionTest.java
new file mode 100644
index 0000000..682796a
--- /dev/null
+++ b/core/api/src/test/java/org/onosproject/net/tunnel/TunnelSubscriptionTest.java
@@ -0,0 +1,43 @@
+package org.onosproject.net.tunnel;
+
+import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
+
+import org.junit.Test;
+import org.onlab.packet.IpAddress;
+import org.onosproject.core.ApplicationId;
+import org.onosproject.core.DefaultApplicationId;
+
+import com.google.common.testing.EqualsTester;
+
+/**
+ * Test of order model entity.
+ */
+public class TunnelSubscriptionTest {
+    /**
+     * Checks that the Order class is immutable.
+     */
+    @Test
+    public void testImmutability() {
+        assertThatClassIsImmutable(TunnelSubscription.class);
+    }
+
+    /**
+     * Checks the operation of equals(), hashCode() and toString() methods.
+     */
+    @Test
+    public void testEquality() {
+        TunnelEndPoint src = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(23423));
+        TunnelEndPoint dst = IpTunnelEndPoint.ipTunnelPoint(IpAddress.valueOf(32421));
+        ApplicationId appId = new DefaultApplicationId(243, "test");
+        ApplicationId appId2 = new DefaultApplicationId(2431, "test1");
+        TunnelId tunnelId = TunnelId.valueOf(41654654);
+        TunnelSubscription p1 = new TunnelSubscription(appId, src, dst, tunnelId, Tunnel.Type.VXLAN,
+                             null);
+        TunnelSubscription p2 = new TunnelSubscription(appId, src, dst, tunnelId, Tunnel.Type.VXLAN,
+                             null);
+        TunnelSubscription p3 = new TunnelSubscription(appId2, src, dst, tunnelId, Tunnel.Type.VXLAN,
+                             null);
+        new EqualsTester().addEqualityGroup(p1, p2).addEqualityGroup(p3)
+                .testEquals();
+    }
+}