Add unit tests in OpenstackNetworkingUtil class

Change-Id: Iadae6a52b22b7e36e4149fa0838bd245f2e5a96d
diff --git a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
index be4f6d1..eb323ef 100644
--- a/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
+++ b/apps/openstacknetworking/app/src/test/java/org/onosproject/openstacknetworking/util/OpenstackNetworkingUtilTest.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.openstacknetworking.util;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -36,15 +37,26 @@
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.device.DeviceServiceAdapter;
 import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.api.OpenstackNetworkService;
+import org.onosproject.openstacknetworking.api.OpenstackRouterAdminService;
 import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
+import org.onosproject.openstacknetworking.impl.OpenstackNetworkServiceAdapter;
+import org.onosproject.openstacknetworking.impl.OpenstackRouterServiceAdapter;
+import org.onosproject.openstacknetworking.impl.TestRouterInterface;
 import org.onosproject.openstacknetworking.web.OpenstackFloatingIpWebResourceTest;
 import org.onosproject.openstacknetworking.web.OpenstackNetworkWebResourceTest;
+import org.onosproject.openstacknode.api.DefaultOpenstackAuth;
+import org.onosproject.openstacknode.api.DefaultOpenstackNode;
 import org.onosproject.openstacknode.api.NodeState;
+import org.onosproject.openstacknode.api.OpenstackAuth;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeTest;
 import org.openstack4j.model.network.NetFloatingIP;
+import org.openstack4j.model.network.Network;
 import org.openstack4j.model.network.Port;
+import org.openstack4j.model.network.RouterInterface;
 import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
+import org.openstack4j.openstack.networking.domain.NeutronNetwork;
 import org.openstack4j.openstack.networking.domain.NeutronPort;
 
 import java.io.IOException;
@@ -59,7 +71,19 @@
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.addRouterIface;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.associatedFloatingIp;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.checkArpMode;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getConnectedClient;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByInstancePort;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getIntfNameFromPciAddress;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.isAssociatedWithVM;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.jsonToModelEntity;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.modelEntityToJson;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.prettyJson;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.routerInterfacesEquals;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.swapStaleLocation;
 
 public final class OpenstackNetworkingUtilTest {
 
@@ -73,6 +97,9 @@
     private InstancePort instancePort1;
     private InstancePort instancePort2;
     private InstancePort instancePort3;
+    private Map<String, RouterInterface> routerInterfaceMap = Maps.newHashMap();
+    private OpenstackNode openstackControlNodeV2;
+    private OpenstackNode openstackControlNodeV3;
 
     @Before
     public void setUp() {
@@ -117,12 +144,31 @@
                 .getResourceAsStream("openstack-floatingip3.json");
 
         floatingIp1 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
         floatingIp2 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
         floatingIp3 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
+                jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
 
+        InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port.json");
+
+        InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov1.json");
+        InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov2.json");
+        InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
+                .getResourceAsStream("openstack-port-sriov3.json");
+
+        openstackPort = (Port)
+                jsonToModelEntity(portJsonStream, NeutronPort.class);
+
+        openstackSriovPort1 = (Port)
+                jsonToModelEntity(sriovPortJsonStream1, NeutronPort.class);
+        openstackSriovPort2 = (Port)
+                jsonToModelEntity(sriovPortJsonStream2, NeutronPort.class);
+        openstackSriovPort3 = (Port)
+                jsonToModelEntity(sriovPortJsonStream3, NeutronPort.class);
     }
 
     @After
@@ -135,16 +181,15 @@
     @Test
     public void testFloatingIp() throws IOException {
         ObjectNode floatingIpNode =
-                OpenstackNetworkingUtil.modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
+                modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
         InputStream is = IOUtils.toInputStream(floatingIpNode.toString(), StandardCharsets.UTF_8.name());
         NetFloatingIP floatingIp2 = (NetFloatingIP)
-                OpenstackNetworkingUtil.jsonToModelEntity(is, NeutronFloatingIP.class);
+                jsonToModelEntity(is, NeutronFloatingIP.class);
         new EqualsTester().addEqualityGroup(floatingIp1, floatingIp2).testEquals();
     }
 
     /**
      * Tests the associatedFloatingIp method.
-     * @throws NullPointerException
      */
     @Test
     public void testAsscoatedFloatingIp() throws NullPointerException {
@@ -153,14 +198,37 @@
         testSet.add(floatingIp2);
         testSet.add(floatingIp3);
 
-        NetFloatingIP floatingIp1 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort1, testSet);
-        NetFloatingIP floatingIp2 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort2, testSet);
+        NetFloatingIP floatingIp1 = associatedFloatingIp(instancePort1, testSet);
+        NetFloatingIP floatingIp2 = associatedFloatingIp(instancePort2, testSet);
 
         assertEquals(floatingIp1, this.floatingIp1);
         assertEquals(floatingIp2, null);
     }
 
     /**
+     * Tests the isAssociatedWithVM method.
+     */
+    @Test
+    public void testIsAssociatedWithVM() {
+        OpenstackNetworkService service = new TestOpenstackNetworkService();
+        NetFloatingIP floatingIp4 = new NeutronFloatingIP().toBuilder().portId("portId4").build();
+
+        assertFalse(isAssociatedWithVM(service, floatingIp4));
+        assertFalse(isAssociatedWithVM(service, floatingIp3));
+        assertTrue(isAssociatedWithVM(service, floatingIp1));
+    }
+
+    /**
+     * Tests the isAssociatedWithVM method in case IllegalStateException is occurred.
+     */
+    @Test(expected = IllegalStateException.class)
+    public void testIsAssociatedWithVMexceptionCase() {
+        OpenstackNetworkService service = new TestOpenstackNetworkService();
+        isAssociatedWithVM(service, floatingIp2);
+    }
+
+
+    /**
      * Tests the getGwByInstancePort method.
      */
     @Test
@@ -173,9 +241,11 @@
 
         int expectedGwIndex = 2;
 
-        OpenstackNode gw = OpenstackNetworkingUtil.getGwByInstancePort(gws, instancePort1);
+        OpenstackNode gw = getGwByInstancePort(gws, instancePort1);
 
         assertEquals(genGateway(expectedGwIndex), gw);
+
+        assertNull(getGwByInstancePort(gws, null));
     }
 
     /**
@@ -222,33 +292,13 @@
     @Test
     public void testGetIntfNameFromPciAddress() {
 
-        InputStream portJsonStream = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port.json");
-
-        InputStream sriovPortJsonStream1 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov1.json");
-        InputStream sriovPortJsonStream2 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov2.json");
-        InputStream sriovPortJsonStream3 = OpenstackNetworkWebResourceTest.class
-                .getResourceAsStream("openstack-port-sriov3.json");
-
-        openstackPort = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(portJsonStream, NeutronPort.class);
-
-        openstackSriovPort1 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream1, NeutronPort.class);
-        openstackSriovPort2 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream2, NeutronPort.class);
-        openstackSriovPort3 = (Port)
-                OpenstackNetworkingUtil.jsonToModelEntity(sriovPortJsonStream3, NeutronPort.class);
-
         String expectedIntfName1 = "enp5s8";
         String expectedIntfName2 = "enp5s8f3";
 
-        assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackPort));
-        assertEquals(expectedIntfName1, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort1));
-        assertEquals(expectedIntfName2, OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort2));
-        assertNull(OpenstackNetworkingUtil.getIntfNameFromPciAddress(openstackSriovPort3));
+        assertNull(getIntfNameFromPciAddress(openstackPort));
+        assertEquals(expectedIntfName1, getIntfNameFromPciAddress(openstackSriovPort1));
+        assertEquals(expectedIntfName2, getIntfNameFromPciAddress(openstackSriovPort2));
+        assertNull(getIntfNameFromPciAddress(openstackSriovPort3));
     }
 
     /**
@@ -256,7 +306,7 @@
      */
     @Test
     public void testSwapStaleLocation() {
-        InstancePort swappedInstancePort =  OpenstackNetworkingUtil.swapStaleLocation(instancePort3);
+        InstancePort swappedInstancePort =  swapStaleLocation(instancePort3);
 
         assertEquals(instancePort3.oldDeviceId(), swappedInstancePort.deviceId());
         assertEquals(instancePort3.oldPortNumber(), swappedInstancePort.portNumber());
@@ -279,8 +329,38 @@
                 "port4", deviceService));
     }
 
-    private OpenstackNode genGateway(int index) {
+    /**
+     * Tests addRouterIface method.
+     */
+    @Test
+    public void testAddRouterIface() {
+        OpenstackRouterAdminService service = new TestOpenstackRouterAdminService();
 
+        addRouterIface(openstackPort, service);
+        RouterInterface initialRouterInterface = new TestRouterInterface(openstackPort.getDeviceId(),
+                openstackPort.getFixedIps().stream().findAny().get().getSubnetId(),
+                openstackPort.getId(),
+                openstackPort.getTenantId());
+
+        assertTrue(routerInterfacesEquals(initialRouterInterface, service.routerInterface(openstackPort.getId())));
+
+        addRouterIface(openstackSriovPort1, service);
+        RouterInterface updatedInitialRouterInterface = new TestRouterInterface(openstackSriovPort1.getDeviceId(),
+                openstackSriovPort1.getFixedIps().stream().findAny().get().getSubnetId(),
+                openstackSriovPort1.getId(),
+                openstackSriovPort1.getTenantId());
+
+        assertTrue(routerInterfacesEquals(
+                updatedInitialRouterInterface, service.routerInterface(openstackSriovPort1.getId())));
+    }
+
+    /**
+     * Util for generating dummy gateway node.
+     *
+     * @param index dummy gateway number
+     * @return dummy gateway node
+     */
+    public OpenstackNode genGateway(int index) {
         Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
 
         String hostname = "gateway-" + index;
@@ -289,6 +369,75 @@
         String uplinkPort = "eth0";
         return InternalOpenstackNodeTest.createNode(hostname,
                 OpenstackNode.NodeType.GATEWAY, intgBrg, ip, uplinkPort, state);
+    }
+
+    /**
+     * Tests the testPrettyJson method.
+     */
+    @Test
+    public void testPrettyJson() {
+        String string = prettyJson(new ObjectMapper(), "{\"json\":\"json\"}");
+        String prettyJsonString = "{\n  \"json\" : \"json\"\n}";
+        assertEquals(string, prettyJsonString);
+
+        assertNull(prettyJson(new ObjectMapper(), "{\"json\":\"json\""));
+        assertNull(prettyJson(new ObjectMapper(), "{\"json\"\"json\"}"));
+    }
+
+    /**
+     * Tests the checkArpMode method.
+     */
+    @Test
+    public void testCheckArpMode() {
+        assertFalse(checkArpMode(null));
+        assertTrue(checkArpMode("proxy"));
+        assertTrue(checkArpMode("broadcast"));
+    }
+
+    /**
+     * Tests the getConnectedClient method.
+     */
+    @Test(expected = Exception.class)
+    public void testGetConnectedClient() {
+        OpenstackNode.Builder osNodeBuilderV2 = DefaultOpenstackNode.builder();
+        OpenstackAuth.Builder osNodeAuthBuilderV2 = DefaultOpenstackAuth.builder()
+                .version("v2.0")
+                .port(35357)
+                .protocol(OpenstackAuth.Protocol.HTTP)
+                .project("admin")
+                .username("admin")
+                .password("password")
+                .perspective(OpenstackAuth.Perspective.PUBLIC);
+
+        openstackControlNodeV2 = osNodeBuilderV2.hostname("controllerv2")
+                .type(OpenstackNode.NodeType.CONTROLLER)
+                .managementIp(IpAddress.valueOf("1.1.1.1"))
+                .endPoint("1.1.1.1")
+                .authentication(osNodeAuthBuilderV2.build())
+                .state(NodeState.COMPLETE)
+                .build();
+
+
+        OpenstackNode.Builder osNodeBuilderV3 = DefaultOpenstackNode.builder();
+        OpenstackAuth.Builder osNodeAuthBuilderV3 = DefaultOpenstackAuth.builder()
+                .version("v2")
+                .port(80)
+                .protocol(OpenstackAuth.Protocol.HTTP)
+                .project("admin")
+                .username("admin")
+                .password("password")
+                .perspective(OpenstackAuth.Perspective.PUBLIC);
+
+        openstackControlNodeV3 = osNodeBuilderV3.hostname("controllerv3")
+                .type(OpenstackNode.NodeType.CONTROLLER)
+                .managementIp(IpAddress.valueOf("2.2.2.2"))
+                .endPoint("2.2.2.2")
+                .authentication(osNodeAuthBuilderV3.build())
+                .state(NodeState.COMPLETE)
+                .build();
+
+        getConnectedClient(openstackControlNodeV2);
+        getConnectedClient(openstackControlNodeV3);
 
     }
 
@@ -327,4 +476,45 @@
             return ports;
         }
     }
+
+    private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
+        @Override
+        public Network network(String networkId) {
+            if (networkId.equals(openstackSriovPort1.getNetworkId())) {
+                return new NeutronNetwork().toBuilder().name("network").build();
+            } else {
+                return null;
+            }
+        }
+
+        @Override
+        public Port port(String portId) {
+            if (portId.equals(floatingIp1.getPortId())) {
+                return openstackSriovPort1;
+            } else if (portId.equals(floatingIp2.getPortId())) {
+                return openstackSriovPort2;
+            } else if (portId.equals("portId4")) {
+                return new NeutronPort().toBuilder().name("osPort4").build();
+            } else {
+                return null;
+            }
+        }
+    }
+
+    private class TestOpenstackRouterAdminService extends OpenstackRouterServiceAdapter {
+        @Override
+        public void addRouterInterface(RouterInterface osRouterIface) {
+            routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
+        }
+
+        @Override
+        public void updateRouterInterface(RouterInterface osRouterIface) {
+            routerInterfaceMap.put(osRouterIface.getPortId(), osRouterIface);
+        }
+
+        @Override
+        public RouterInterface routerInterface(String osRouterIfaceId) {
+            return routerInterfaceMap.get(osRouterIfaceId);
+        }
+    }
 }