diff --git a/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java b/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java
new file mode 100644
index 0000000..88c2ca9
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/util/LinkTupleTest.java
@@ -0,0 +1,151 @@
+package net.onrc.onos.core.util;
+
+import static net.onrc.onos.core.util.ImmutableClassChecker.assertThatClassIsImmutable;
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+/**
+ * Basic LinkTupleTest.
+ */
+public class LinkTupleTest {
+
+    private static final Dpid SRC_DPID = new Dpid(9);
+    private static final PortNumber SRC_PORT_NUM = new PortNumber((short) 56);
+    private static final Dpid DST_DPID = new Dpid(12);
+    private static final PortNumber DST_PORT_NUM = new PortNumber((short) 81);
+
+    private static final SwitchPort SRC = new SwitchPort(SRC_DPID, SRC_PORT_NUM);
+    private static final SwitchPort DST = new SwitchPort(DST_DPID, DST_PORT_NUM);
+
+
+    private static final LinkTuple L1 = new LinkTuple(SRC, DST);
+    private static final LinkTuple L2 = new LinkTuple(
+            new SwitchPort(new Dpid(1), new PortNumber((short) 65535)),
+            new SwitchPort(new Dpid(2), new PortNumber((short) 65534)));
+
+    /**
+     * Test to confirm class definition is immutable.
+     */
+    @Test
+    public void testImmutable() {
+        assertThatClassIsImmutable(LinkTuple.class);
+    }
+
+    /**
+     * Tests to confirm 2-arg constructor.
+     */
+    @Test
+    public void testLinkTupleSwitchPortSwitchPort() {
+        LinkTuple link = new LinkTuple(SRC, DST);
+        assertEquals(SRC, link.getSrc());
+        assertEquals(SRC_DPID, link.getSrc().getDpid());
+        assertEquals(SRC_PORT_NUM, link.getSrc().getPortNumber());
+        assertEquals(DST, link.getDst());
+        assertEquals(DST_DPID, link.getDst().getDpid());
+        assertEquals(DST_PORT_NUM, link.getDst().getPortNumber());
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleSwitchPortSwitchPortFailsOnNull1() {
+        new LinkTuple(null, DST);
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleSwitchPortSwitchPortFailsOnNull2() {
+        new LinkTuple(SRC, null);
+    }
+
+    /**
+     * Tests to confirm 4-arg constructor.
+     */
+    @Test
+    public void testLinkTupleDpidPortNumberDpidPortNumber() {
+        LinkTuple link = new LinkTuple(SRC_DPID, SRC_PORT_NUM, DST_DPID, DST_PORT_NUM);
+        assertEquals(SRC, link.getSrc());
+        assertEquals(SRC_DPID, link.getSrc().getDpid());
+        assertEquals(SRC_PORT_NUM, link.getSrc().getPortNumber());
+        assertEquals(DST, link.getDst());
+        assertEquals(DST_DPID, link.getDst().getDpid());
+        assertEquals(DST_PORT_NUM, link.getDst().getPortNumber());
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleDpidPortNumberDpidPortNumberFailOnNull1() {
+        new LinkTuple(null, SRC_PORT_NUM, DST_DPID, DST_PORT_NUM);
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleDpidPortNumberDpidPortNumberFailOnNull2() {
+        new LinkTuple(SRC_DPID, null, DST_DPID, DST_PORT_NUM);
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleDpidPortNumberDpidPortNumberFailOnNull3() {
+        new LinkTuple(SRC_DPID, SRC_PORT_NUM, null, DST_PORT_NUM);
+    }
+
+    /**
+     * Tests to confirm constructors input validation.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testLinkTupleDpidPortNumberDpidPortNumberFailOnNull4() {
+        new LinkTuple(SRC_DPID, SRC_PORT_NUM, DST_DPID, null);
+    }
+
+    /**
+     * Tests confirming equals returning true.
+     */
+    @Test
+    public void testEqualsTrue() {
+        LinkTuple link = new LinkTuple(SRC, DST);
+
+        assertTrue(L1.equals(link));
+        assertTrue(link.equals(L1));
+        assertEquals(L1.hashCode(), link.hashCode());
+
+        assertTrue(link.equals(link));
+    }
+
+    /**
+     * Tests confirming equals returning false.
+     */
+    @Test
+    public void testEqualsFalse() {
+        LinkTuple link = new LinkTuple(SRC, DST);
+
+        assertFalse(L2.equals(link));
+        assertFalse(link.equals(L2));
+        assertNotEquals(L2.hashCode(), link.hashCode());
+
+        assertFalse(link.equals(null));
+
+        assertFalse(link.equals(DST));
+    }
+
+    /**
+     * Test to detect string representation change.
+     */
+    @Test
+    public void testToString() {
+        // FIXME when we start handling unsigned integer properly
+        assertEquals("(00:00:00:00:00:00:00:01/-1=>00:00:00:00:00:00:00:02/-2)",
+                     L2.toString());
+    }
+
+}
