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 a6c4bc3..e33637e 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
@@ -16,17 +16,32 @@
 package org.onosproject.openstacknetworking.util;
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
 import com.google.common.testing.EqualsTester;
 import org.apache.commons.io.IOUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.IpAddress;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.openstacknode.api.NodeState;
+import org.onosproject.openstacknode.api.OpenstackNode;
+import org.onosproject.openstacknode.impl.OpenstackNodeTest;
 import org.openstack4j.model.network.NetFloatingIP;
 import org.openstack4j.openstack.networking.domain.NeutronFloatingIP;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.onosproject.openstacknetworking.util.OpenstackNetworkingUtil.getGwByComputeDevId;
 
 public final class OpenstackNetworkingUtilTest {
 
@@ -56,4 +71,58 @@
                 OpenstackNetworkingUtil.jsonToModelEntity(is, NeutronFloatingIP.class);
         new EqualsTester().addEqualityGroup(floatingIp, floatingIp2).testEquals();
     }
+
+    /**
+     * Tests the getGwByComputeDevId method.
+     */
+    @Test
+    public void testGetGwByComputeDevId() {
+        Set<OpenstackNode> gws = Sets.newConcurrentHashSet();
+        gws.add(genGateway(1));
+        gws.add(genGateway(2));
+        gws.add(genGateway(3));
+
+        Set<OpenstackNode> cloneOfGws = ImmutableSet.copyOf(gws);
+
+        Map<String, Integer> gwCountMap = Maps.newConcurrentMap();
+        int numOfDev = 99;
+
+        for (int i = 1; i < 1 + numOfDev; i++) {
+            OpenstackNode gw = getGwByComputeDevId(gws, genDeviceId(i));
+
+            if (gwCountMap.get(gw.hostname()) == null) {
+                gwCountMap.put(gw.hostname(), 1);
+            } else {
+                gwCountMap.compute(gw.hostname(), (k, v) -> v + 1);
+            }
+
+            new EqualsTester().addEqualityGroup(
+                    getGwByComputeDevId(gws, genDeviceId(i)),
+                    getGwByComputeDevId(cloneOfGws, genDeviceId(i)))
+                    .testEquals();
+        }
+
+        int sum = gwCountMap.values().stream().mapToInt(Integer::intValue).sum();
+        assertEquals(numOfDev, sum);
+    }
+
+    private OpenstackNode genGateway(int index) {
+
+        Device intgBrg = InternalOpenstackNodeTest.createDevice(index);
+
+        String hostname = "gateway-" + index;
+        IpAddress ip = Ip4Address.valueOf("10.10.10." + index);
+        NodeState state = NodeState.COMPLETE;
+        String uplinkPort = "eth0";
+        return InternalOpenstackNodeTest.createNode(hostname,
+                OpenstackNode.NodeType.GATEWAY, intgBrg, ip, uplinkPort, state);
+
+    }
+
+    private DeviceId genDeviceId(int index) {
+        return DeviceId.deviceId("of:compute-" + index);
+    }
+
+    protected class InternalOpenstackNodeTest extends OpenstackNodeTest {
+    }
 }
