HostTracker Bundle Separation
[controller.git] / opendaylight / hosttracker_new / implementation / src / test / java / org / opendaylight / controller / hosttracker / internal / DeviceUniqueIndexTest.java
diff --git a/opendaylight/hosttracker_new/implementation/src/test/java/org/opendaylight/controller/hosttracker/internal/DeviceUniqueIndexTest.java b/opendaylight/hosttracker_new/implementation/src/test/java/org/opendaylight/controller/hosttracker/internal/DeviceUniqueIndexTest.java
new file mode 100644 (file)
index 0000000..a2a1004
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (c) 2012 Big Switch Networks, Inc.
+ *
+ * Licensed under the Eclipse Public License, Version 1.0 (the
+ * "License"); you may not use this file except in compliance with the
+ * License. You may obtain a copy of the License at
+ *
+ *      http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package org.opendaylight.controller.hosttracker.internal;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+
+import org.junit.Test;
+import org.opendaylight.controller.hosttracker.Entity;
+import org.opendaylight.controller.hosttracker.IDeviceService.DeviceField;
+import org.opendaylight.controller.sal.core.Node;
+import org.opendaylight.controller.sal.core.NodeConnector;
+import org.opendaylight.controller.sal.core.NodeConnector.NodeConnectorIDType;
+
+/**
+ *
+ * @author gregor
+ *
+ */
+public class DeviceUniqueIndexTest extends TestCase {
+    protected Entity e1a;
+    protected Entity e1b;
+    protected Device d1;
+    protected Entity e2;
+    protected Entity e2alt;
+    protected Entity e3;
+    protected Entity e3_ip;
+    protected Entity e4;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        Node n1 = new Node(Node.NodeIDType.OPENFLOW, Long.valueOf(1L));
+        NodeConnector n1_1 = new NodeConnector(NodeConnectorIDType.OPENFLOW,
+                Short.valueOf((short) 1), n1);
+        e1a = new Entity(1L, (short) 1, 1, n1_1, new Date());
+        e1b = new Entity(1L, (short) 2, 1, n1_1, new Date());
+        List<Entity> d1Entities = new ArrayList<Entity>(2);
+        d1Entities.add(e1a);
+        d1Entities.add(e1b);
+        d1 = new Device(null, Long.valueOf(1), null, null, null, d1Entities,
+                null);
+
+        Node n2 = new Node(Node.NodeIDType.OPENFLOW, Long.valueOf(2L));
+        NodeConnector n2_2 = new NodeConnector(NodeConnectorIDType.OPENFLOW,
+                Short.valueOf((short) 2), n2);
+        Node n3 = new Node(Node.NodeIDType.OPENFLOW, Long.valueOf(3L));
+        NodeConnector n3_3 = new NodeConnector(NodeConnectorIDType.OPENFLOW,
+                Short.valueOf((short) 3), n3);
+
+        // e2 and e2 alt match in MAC and VLAN
+        e2 = new Entity(2L, (short) 2, 2, n2_2, new Date());
+        e2alt = new Entity(2, (short) 2, null, null, null);
+
+        // IP is null
+        e3 = new Entity(3L, (short) 3, null, n3_3, new Date());
+        e3_ip = new Entity(3L, (short) 3, 3, n3_3, new Date());
+
+        // IP and switch and port are null
+        e4 = new Entity(4L, (short) 4, null, null, new Date());
+    }
+
+    /*
+     * Checks that the iterator it returns the elements in the Set expected
+     * Doesn't check how often an element is returned as long it's at least once
+     */
+    protected void verifyIterator(Set<Long> expected, Iterator<Long> it) {
+        HashSet<Long> actual = new HashSet<Long>();
+        while (it.hasNext()) {
+            actual.add(it.next());
+        }
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testDeviceUniqueIndex() {
+        DeviceUniqueIndex idx1 = new DeviceUniqueIndex(EnumSet.of(
+                DeviceField.MAC, DeviceField.VLAN));
+
+        idx1.updateIndex(d1, d1.getDeviceKey());
+        idx1.updateIndex(e2, 2L);
+
+        // -------------
+        // Test findByEntity lookups
+        assertEquals(Long.valueOf(1L), idx1.findByEntity(e1a));
+        assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
+        assertEquals(Long.valueOf(2L), idx1.findByEntity(e2));
+        // we didn't add e2alt but since they key fields are the same we
+        // should find it
+        assertEquals(Long.valueOf(2L), idx1.findByEntity(e2alt));
+        assertEquals(null, idx1.findByEntity(e3));
+        assertEquals(null, idx1.findByEntity(e4));
+
+        // -------------
+        // Test getAll()
+        HashSet<Long> expectedKeys = new HashSet<Long>();
+        expectedKeys.add(1L);
+        expectedKeys.add(2L);
+        verifyIterator(expectedKeys, idx1.getAll());
+
+        // -------------
+        // Test queryByEntity()
+        verifyIterator(Collections.<Long> singleton(1L),
+                idx1.queryByEntity(e1a));
+        verifyIterator(Collections.<Long> singleton(1L),
+                idx1.queryByEntity(e1b));
+        verifyIterator(Collections.<Long> singleton(2L), idx1.queryByEntity(e2));
+        verifyIterator(Collections.<Long> singleton(2L),
+                idx1.queryByEntity(e2alt));
+        assertEquals(false, idx1.queryByEntity(e3).hasNext());
+        assertEquals(false, idx1.queryByEntity(e3).hasNext());
+
+        // -------------
+        // Test removal
+        idx1.removeEntity(e1a, 42L); // No-op. e1a isn't mapped to this key
+        assertEquals(Long.valueOf(1L), idx1.findByEntity(e1a));
+        idx1.removeEntity(e1a, 1L);
+        assertEquals(null, idx1.findByEntity(e1a));
+        assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
+        assertEquals(Long.valueOf(2L), idx1.findByEntity(e2));
+        idx1.removeEntity(e2);
+        assertEquals(null, idx1.findByEntity(e2));
+        assertEquals(Long.valueOf(1L), idx1.findByEntity(e1b));
+
+        // -------------
+        // Test null keys
+        DeviceUniqueIndex idx2 = new DeviceUniqueIndex(EnumSet.of(
+                DeviceField.IPV4, DeviceField.SWITCHPORT));
+        // only one key field is null
+        idx2.updateIndex(e3, 3L);
+        assertEquals(Long.valueOf(3L), idx2.findByEntity(e3));
+        assertEquals(null, idx2.findByEntity(e3_ip));
+        // all key fields are null
+        idx2.updateIndex(e4, 4L);
+        assertEquals(null, idx2.findByEntity(e4));
+        Device d4 = new Device(null, 4L, null, null, null,
+                Collections.<Entity> singleton(e4), null);
+        idx2.updateIndex(d4, 4L);
+        assertEquals(null, idx2.findByEntity(e4));
+
+        // -------------
+        // entity already exists with different deviceKey
+        DeviceUniqueIndex idx3 = new DeviceUniqueIndex(EnumSet.of(
+                DeviceField.MAC, DeviceField.VLAN));
+        idx3.updateIndex(e1a, 42L);
+        assertEquals(false, idx3.updateIndex(d1, 1L));
+        // TODO: shouldn't this fail as well so that the behavior
+        // is consistent?
+        idx3.updateIndex(e1a, 1L);
+        // anyways. We can now add d1 ;-)
+        assertEquals(true, idx3.updateIndex(d1, 1L));
+    }
+}