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 41252b1..270fbd6 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
@@ -26,13 +26,21 @@
 import org.junit.Test;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
+import org.onlab.packet.MacAddress;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.PortNumber;
+import org.onosproject.openstacknetworking.api.InstancePort;
+import org.onosproject.openstacknetworking.impl.DefaultInstancePort;
+import org.onosproject.openstacknetworking.web.OpenstackFloatingIpWebResourceTest;
+import org.onosproject.openstacknetworking.web.OpenstackNetworkWebResourceTest;
 import org.onosproject.openstacknode.api.NodeState;
 import org.onosproject.openstacknode.api.OpenstackNode;
 import org.onosproject.openstacknode.api.OpenstackNodeTest;
 import org.openstack4j.model.network.NetFloatingIP;
+import org.openstack4j.model.network.Port;
 import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
+import org.openstack4j.openstack.networking.domain.NeutronPort;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,18 +49,71 @@
 import java.util.Set;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
 
 public final class OpenstackNetworkingUtilTest {
 
-    private NetFloatingIP floatingIp;
+    private NetFloatingIP floatingIp1;
+    private NetFloatingIP floatingIp2;
+    private NetFloatingIP floatingIp3;
+    private Port openstackPort;
+    private Port openstackSriovPort1;
+    private Port openstackSriovPort2;
+    private Port openstackSriovPort3;
+    private InstancePort instancePort1;
+    private InstancePort instancePort2;
+    private InstancePort instancePort3;
 
     @Before
     public void setUp() {
-        floatingIp = NeutronFloatingIP.builder()
-                .floatingNetworkId("floatingNetworkingId")
-                .portId("portId")
+
+        instancePort1 = DefaultInstancePort.builder()
+                .networkId("net-id-1")
+                .portId("ce705c24-c1ef-408a-bda3-7bbd946164ab")
+                .deviceId(DeviceId.deviceId("of:000000000000000a"))
+                .portNumber(PortNumber.portNumber(1, "tap-1"))
+                .ipAddress(IpAddress.valueOf("10.0.0.3"))
+                .macAddress(MacAddress.valueOf("11:22:33:44:55:66"))
+                .state(InstancePort.State.valueOf("ACTIVE"))
                 .build();
+
+        instancePort2 = DefaultInstancePort.builder()
+                .networkId("net-id-2")
+                .portId("port-id-2")
+                .deviceId(DeviceId.deviceId("of:000000000000000b"))
+                .portNumber(PortNumber.portNumber(2, "tap-2"))
+                .ipAddress(IpAddress.valueOf("10.10.10.2"))
+                .macAddress(MacAddress.valueOf("22:33:44:55:66:11"))
+                .state(InstancePort.State.valueOf("ACTIVE"))
+                .build();
+
+        instancePort3 = DefaultInstancePort.builder()
+                .networkId("net-id-3")
+                .portId("port-id-3")
+                .deviceId(DeviceId.deviceId("of:000000000000000c"))
+                .oldDeviceId(DeviceId.deviceId("of:000000000000000d"))
+                .oldPortNumber(PortNumber.portNumber(4, "tap-4"))
+                .portNumber(PortNumber.portNumber(3, "tap-3"))
+                .ipAddress(IpAddress.valueOf("10.10.10.3"))
+                .macAddress(MacAddress.valueOf("33:44:55:66:11:22"))
+                .state(InstancePort.State.valueOf("ACTIVE"))
+                .build();
+
+        InputStream floatingIpjsonStream1 = OpenstackFloatingIpWebResourceTest.class
+                .getResourceAsStream("openstack-floatingip1.json");
+        InputStream floatingIpjsonStream2 = OpenstackFloatingIpWebResourceTest.class
+                .getResourceAsStream("openstack-floatingip2.json");
+        InputStream floatingIpjsonStream3 = OpenstackFloatingIpWebResourceTest.class
+                .getResourceAsStream("openstack-floatingip3.json");
+
+        floatingIp1 = (NetFloatingIP)
+                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream1, NeutronFloatingIP.class);
+        floatingIp2 = (NetFloatingIP)
+                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream2, NeutronFloatingIP.class);
+        floatingIp3 = (NetFloatingIP)
+                OpenstackNetworkingUtil.jsonToModelEntity(floatingIpjsonStream3, NeutronFloatingIP.class);
+
     }
 
     @After
@@ -65,11 +126,47 @@
     @Test
     public void testFloatingIp() throws IOException {
         ObjectNode floatingIpNode =
-                OpenstackNetworkingUtil.modelEntityToJson(floatingIp, NeutronFloatingIP.class);
+                OpenstackNetworkingUtil.modelEntityToJson(floatingIp1, NeutronFloatingIP.class);
         InputStream is = IOUtils.toInputStream(floatingIpNode.toString(), StandardCharsets.UTF_8.name());
         NetFloatingIP floatingIp2 = (NetFloatingIP)
                 OpenstackNetworkingUtil.jsonToModelEntity(is, NeutronFloatingIP.class);
-        new EqualsTester().addEqualityGroup(floatingIp, floatingIp2).testEquals();
+        new EqualsTester().addEqualityGroup(floatingIp1, floatingIp2).testEquals();
+    }
+
+    /**
+     * Tests the associatedFloatingIp method.
+     * @throws NullPointerException
+     */
+    @Test
+    public void testAsscoatedFloatingIp() throws NullPointerException {
+        Set<NetFloatingIP> testSet = Sets.newHashSet();
+        testSet.add(floatingIp1);
+        testSet.add(floatingIp2);
+        testSet.add(floatingIp3);
+
+        NetFloatingIP floatingIp1 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort1, testSet);
+        NetFloatingIP floatingIp2 = OpenstackNetworkingUtil.associatedFloatingIp(instancePort2, testSet);
+
+        assertEquals(floatingIp1, this.floatingIp1);
+        assertEquals(floatingIp2, null);
+    }
+
+    /**
+     * Tests the getGwByInstancePort method.
+     */
+    @Test
+    public void testGetGwByInstancePort() {
+
+        Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
+        gws.add(genGateway(1));
+        gws.add(genGateway(2));
+        gws.add(genGateway(3));
+
+        int expectedGwIndex = 2;
+
+        OpenstackNode gw = OpenstackNetworkingUtil.getGwByInstancePort(gws, instancePort1);
+
+        assertEquals(genGateway(expectedGwIndex), gw);
     }
 
     /**
@@ -78,6 +175,10 @@
     @Test
     public void testGetGwByComputeDevId() {
         Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
+
+        OpenstackNode nullGw = getGwByComputeDevId(gws, genDeviceId(1));
+        assertNull(nullGw);
+
         gws.add(genGateway(1));
         gws.add(genGateway(2));
         gws.add(genGateway(3));
@@ -106,6 +207,53 @@
         assertEquals(numOfDev, sum);
     }
 
+    /**
+     * Tests getIntfNameFromPciAddress method.
+     */
+    @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));
+    }
+
+    /**
+     * tests swapStaleLocation method.
+     */
+    @Test
+    public void testSwapStaleLocation() {
+        InstancePort swappedInstancePort =  OpenstackNetworkingUtil.swapStaleLocation(instancePort3);
+
+        assertEquals(instancePort3.oldDeviceId(), swappedInstancePort.deviceId());
+        assertEquals(instancePort3.oldPortNumber(), swappedInstancePort.portNumber());
+
+    }
+
     private OpenstackNode genGateway(int index) {
 
         Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
