Unit tests for TopologyImpl Class

Change-Id: I8cb81b46199f9f38183cf2ac0cfebfc0b65cc364
diff --git a/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
new file mode 100644
index 0000000..2501425
--- /dev/null
+++ b/src/test/java/net/onrc/onos/core/topology/TopologyImplTest.java
@@ -0,0 +1,244 @@
+package net.onrc.onos.core.topology;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+
+import net.floodlightcontroller.util.MACAddress;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Unit tests for the TopologyImpl Class in the Topology module.
+ * These test cases check the sanity of getSwitch/removeSwitch,
+ * getLink/removeLink, getDevice/removeDevice, and getPort functions and
+ * verify the data objects inside the global graphDB through a injected network.
+ * The injected network has a ring topology with a large number of switches (configurable), and
+ * each switch is associated with one device and connected to two other switches.
+ */
+public class TopologyImplTest {
+    private TopologyImpl testTopology;
+    private static final Long SWITCH_HOST_PORT = 1L;
+    private static final Long SWITCH_PORT_1 = 2L;
+    private static final Long SWITCH_PORT_2 = 3L;
+
+    // Set the test network size, it should be larger than 3
+    private static final long TEST_SWITCH_NUM = 100L;
+
+    @Before
+    public void setUp() throws Exception {
+        // Create the injected network first
+        testTopology = new TopologyImpl();
+
+        // Create a number of switches and install two ports for each switch
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            SwitchImpl testSwitch = new SwitchImpl(testTopology, switchID);
+            testSwitch.addPort(SWITCH_PORT_1);
+            testSwitch.addPort(SWITCH_PORT_2);
+            testTopology.putSwitch(testSwitch);
+
+            // Create a host for each switch
+            MACAddress devMac = MACAddress.valueOf(switchID);
+            DeviceImpl testHost = new DeviceImpl(testTopology, devMac);
+            testHost.addAttachmentPoint(testSwitch.addPort(SWITCH_HOST_PORT));
+            testTopology.putDevice(testHost);
+        }
+
+        // Create one bidirectional link b/w two switches to construct a ring topology
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            LinkImpl testLinkEast = new LinkImpl(testTopology,
+                    testTopology.getPort(switchID, SWITCH_PORT_2),
+                    testTopology.getPort(switchID % TEST_SWITCH_NUM + 1, SWITCH_PORT_1)
+                    );
+            LinkImpl testLinkWest = new LinkImpl(testTopology,
+                    testTopology.getPort(switchID % TEST_SWITCH_NUM + 1, SWITCH_PORT_1),
+                    testTopology.getPort(switchID, SWITCH_PORT_2)
+                    );
+            testTopology.putLink(testLinkEast);
+            testTopology.putLink(testLinkWest);
+        }
+    }
+
+    @After
+    public void tearDown() throws Exception {
+
+    }
+
+    /**
+     * Test the result of getSwitch function.
+     */
+    @Test
+    public void testGetSwitch() {
+        // Verify the switch is in the graphDB
+        assertNotNull(testTopology.getSwitch(TEST_SWITCH_NUM - 1));
+
+        // Verify there is no such switch in the graphDB
+        assertNull(testTopology.getSwitch(TEST_SWITCH_NUM + 1));
+        long swID = 0;
+        long index = 0;
+        Iterator<Switch> itr =  testTopology.getSwitches().iterator();
+        while (itr.hasNext()) {
+            index++;
+            swID = itr.next().getDpid();
+            assertTrue(swID >= 1 && swID <= TEST_SWITCH_NUM);
+        }
+
+        // Verify the total number of switches
+        assertEquals(TEST_SWITCH_NUM, index);
+    }
+
+    /**
+     * Test the result of getPort function.
+     */
+    @Test
+    public void testGetPort() {
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            // Verify ports are in the graphDB
+            assertNotNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_1));
+            assertNotNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_2));
+
+            // Verify there is no such port in the graphDB
+            assertNull(testTopology.getSwitch(switchID).getPort(SWITCH_PORT_2 + 1));
+        }
+    }
+
+    /**
+     * Test the result of getLink function.
+     */
+    @Test
+    public void testGetLink() {
+        long sw1ID = 1L;
+        long sw2ID = 3L;
+
+        // Verify there is no such link b/w these two switches
+        assertNull((testTopology.getSwitch(sw1ID)).getLinkToNeighbor(sw2ID));
+        long index = 0;
+        Iterator<Link> itr = testTopology.getLinks().iterator();
+        while (itr.hasNext()) {
+            index++;
+            Link objectLink = itr.next();
+            Switch srcSw = (objectLink.getSrcSwitch());
+            Switch dstSw = (objectLink.getDstSwitch());
+            if (srcSw.getDpid() < TEST_SWITCH_NUM && dstSw.getDpid() < TEST_SWITCH_NUM) {
+                // Verify the link relationship
+                assertTrue((srcSw.getDpid() == dstSw.getDpid() - 1
+                        || (srcSw.getDpid() == dstSw.getDpid() + 1)));
+            }
+        }
+
+        // Verify the total number of links
+        assertEquals(TEST_SWITCH_NUM * 2, index);
+    }
+
+    /**
+     * Test the result of getOutgoingLink function.
+     */
+    @Test
+    public void testGetOutgoingLink() {
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            assertNotNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_1));
+            assertNotNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_2));
+
+            // Verify there is no such link in the graphDB
+            assertNull(testTopology.getOutgoingLink(switchID, SWITCH_PORT_1 + 2));
+        }
+    }
+
+    /**
+     * Test the result of getIncomingLink function.
+     */
+    @Test
+    public void testGetIncomingLink() {
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            // Verify the links are in the graphDB
+            assertNotNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_1));
+            assertNotNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_2));
+
+            // Verify there is no such link in the graphDB
+            assertNull(testTopology.getIncomingLink(switchID, SWITCH_PORT_1 + 2));
+        }
+    }
+
+    /**
+     * Test the result of getDeviceByMac function.
+     */
+    @Test
+    public void testGetDeviceByMac() {
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            MACAddress devMac = MACAddress.valueOf(switchID);
+
+            // Verify the device is in the graphDB
+            assertNotNull(testTopology.getDeviceByMac(devMac));
+        }
+    }
+
+    /**
+     * Test the result of removeDevice function.
+     */
+    @Test
+    public void testRemoveDevice() {
+        int devCount = 0;
+        Iterator<Device> itr = testTopology.getDevices().iterator();
+        while (itr.hasNext()) {
+            Device currDev = itr.next();
+            testTopology.removeDevice(currDev);
+            testTopology.getDeviceByMac(currDev.getMacAddress());
+            devCount++;
+        }
+
+        // Verify all hosts have been removed successfully
+        assertEquals(TEST_SWITCH_NUM, devCount);
+    }
+
+    /**
+     * Test the result of removeLink function.
+     */
+    @Test
+    public void testRemoveLink() {
+        long index = 0;
+        Iterator<Link> itr = testTopology.getLinks().iterator();
+        while (itr.hasNext()) {
+            index++;
+            Link objectLink = itr.next();
+            Switch srcSw = (objectLink.getSrcSwitch());
+            Port srcPort = objectLink.getSrcPort();
+            Switch dstSw = (objectLink.getDstSwitch());
+            Port dstPort = objectLink.getDstPort();
+            testTopology.removeLink(objectLink);
+
+            // Verify the link was removed successfully
+            assertNull(testTopology.getLink(srcSw.getDpid(), srcPort.getNumber(),
+                    dstSw.getDpid(), dstPort.getNumber()));
+        }
+
+        // Verify all links have been removed successfully
+        assertEquals(TEST_SWITCH_NUM * 2, index);
+    }
+
+    /**
+     * Test the result of removeSwitch function.
+     */
+    @Test
+    public void testRemoveSwitch() {
+        for (long switchID = 1; switchID <= TEST_SWITCH_NUM; switchID++) {
+            Iterator<Device> itr = testTopology.getSwitch(switchID).getDevices().iterator();
+            while (itr.hasNext()) {
+                testTopology.removeDevice((Device) itr);
+            }
+            testTopology.removeSwitch(switchID);
+
+            // Verify the switch has been removed from the graphDB successfully
+            assertNull(testTopology.getSwitch(switchID));
+        }
+
+        // Verify all switches have been removed successfully
+        Iterator<Switch> itr = testTopology.getSwitches().iterator();
+        assertFalse(itr.hasNext());
+    }
+}