diff --git a/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java b/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
index ada38f4..7cb60a6 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/pwaas/PwaasUtil.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.segmentrouting.pwaas;
 
+import org.onlab.osgi.ServiceNotFoundException;
 import org.onlab.packet.MplsLabel;
 import org.onlab.packet.VlanId;
 import org.onosproject.cli.AbstractShellCommand;
@@ -43,12 +44,46 @@
 
     private static final Logger log = LoggerFactory.getLogger(PwaasUtil.class);
 
-    private static DeviceService deviceService = AbstractShellCommand.get(DeviceService.class);
+    private static DeviceService deviceService;
+    private static InterfaceService intfService;
 
-    private static InterfaceService intfService = AbstractShellCommand.get(InterfaceService.class);
+    // Suppress ExceptionInInitializerError and simply set the value to null,
+    // such that unit tests have a chance to replace the variable with mocked service
+    static {
+        try {
+            deviceService = AbstractShellCommand.get(DeviceService.class);
+        } catch (NullPointerException | ServiceNotFoundException e) {
+            deviceService = null;
+        }
+        try {
+            intfService = AbstractShellCommand.get(InterfaceService.class);
+        } catch (NullPointerException | ServiceNotFoundException e) {
+            intfService = null;
+        }
+    }
+
+    static final String ERR_SERVICE_UNAVAIL = "Service %s not available";
+    static final String ERR_SAME_DEV =
+            "Pseudowire connection points can not reside in the same node, in pseudowire %d.";
+    static final String ERR_EMPTY_INNER_WHEN_OUTER_PRESENT =
+            "Inner tag should not be empty when outer tag is set for pseudowire %d for %s.";
+    static final String ERR_WILDCARD_VLAN =
+            "Wildcard VLAN matching not yet supported for pseudowire %d.";
+    static final String ERR_DOUBLE_TO_UNTAGGED =
+            "Support for double tag <-> untag is not supported for pseudowire %d.";
+    static final String ERR_DOUBLE_TO_SINGLE =
+            "Support for double-tag<-> single-tag is not supported for pseudowire %d.";
+    static final String ERR_SINGLE_TO_UNTAGGED =
+            "single-tag <-> untag is not supported for pseudowire %d.";
+    static final String ERR_VLAN_TRANSLATION =
+            "We do not support VLAN translation for pseudowire %d.";
+    static final String ERR_DEV_NOT_FOUND =
+            "Device %s does not exist for pseudowire %d.";
+    static final String ERR_PORT_NOT_FOUND =
+            "Port %s of device %s does not exist for pseudowire %d.";
 
     private PwaasUtil() {
-        return;
+
     }
 
     /**
@@ -129,12 +164,15 @@
      * supported and if policy will be successfully instantiated in the
      * network.
      *
+     * @param cP1 pseudo wire endpoint 1
+     * @param cP2 pseudo wire endpoint 2
      * @param ingressInner the ingress inner tag
      * @param ingressOuter the ingress outer tag
      * @param egressInner the egress inner tag
      * @param egressOuter the egress outer tag
+     * @param tunnelId tunnel ID
      */
-    private static void verifyPolicy(ConnectPoint cP1,
+    static void verifyPolicy(ConnectPoint cP1,
                               ConnectPoint cP2,
                               VlanId ingressInner,
                               VlanId ingressOuter,
@@ -143,42 +181,34 @@
                               Long tunnelId) {
 
         if (cP1.deviceId().equals(cP2.deviceId())) {
-            throw new IllegalArgumentException(String.format("Pseudowire connection points can not reside in the " +
-                                                                     "same node, in pseudowire %d.", tunnelId));
+            throw new IllegalArgumentException(String.format(ERR_SAME_DEV, tunnelId));
         }
 
         // We can have multiple tags, all of them can be NONE,
         // indicating untagged traffic, however, the outer tag can
         // not have value if the inner tag is None
         if (ingressInner.equals(VlanId.NONE) && !ingressOuter.equals(VlanId.NONE)) {
-            throw new IllegalArgumentException(String.format("Inner tag should not be empty when " +
-                                                                     "outer tag is set for pseudowire %d for cP1.",
-                                                             tunnelId));
+            throw new IllegalArgumentException(String.format(ERR_EMPTY_INNER_WHEN_OUTER_PRESENT,
+                    tunnelId, "cp1"));
         }
 
         if (egressInner.equals(VlanId.NONE) && !egressOuter.equals(VlanId.NONE)) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Inner tag should not be empty when" +
-                                                                                    " outer tag is set for " +
-                                                                                    "pseudowire %d " +
-                                                                                    "for cP2.", tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_EMPTY_INNER_WHEN_OUTER_PRESENT,
+                    tunnelId, "cp2"));
         }
 
         if (ingressInner.equals(VlanId.ANY) ||
                 ingressOuter.equals(VlanId.ANY) ||
                 egressInner.equals(VlanId.ANY) ||
                 egressOuter.equals(VlanId.ANY)) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Wildcard VLAN matching not yet " +
-                                                                                    "supported for pseudowire %d.",
-                                                                            tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_WILDCARD_VLAN, tunnelId));
         }
 
         if (((!ingressOuter.equals(VlanId.NONE) && !ingressInner.equals(VlanId.NONE)) &&
                 (egressOuter.equals(VlanId.NONE) && egressInner.equals(VlanId.NONE)))
                 || ((ingressOuter.equals(VlanId.NONE) && ingressInner.equals(VlanId.NONE)) &&
                 (!egressOuter.equals(VlanId.NONE) && !egressInner.equals(VlanId.NONE)))) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Support for double tag <-> untag is not" +
-                                                                                    "supported for pseudowire %d.",
-                                                                            tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_DOUBLE_TO_UNTAGGED, tunnelId));
         }
         if ((!ingressInner.equals(VlanId.NONE) &&
                 ingressOuter.equals(VlanId.NONE) &&
@@ -186,50 +216,42 @@
                 || (egressOuter.equals(VlanId.NONE) &&
                 !egressInner.equals(VlanId.NONE) &&
                 !ingressOuter.equals(VlanId.NONE))) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Support for double-tag<->" +
-                                                                                    "single-tag is not supported" +
-                                                                                    " for pseudowire %d.", tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_DOUBLE_TO_SINGLE, tunnelId));
         }
 
         if ((ingressInner.equals(VlanId.NONE) && !egressInner.equals(VlanId.NONE))
                 || (!ingressInner.equals(VlanId.NONE) && egressInner.equals(VlanId.NONE))) {
-            throw new IllegalArgumentException(String.valueOf(String.format("single-tag <-> untag is not supported" +
-                                                                                    " for pseudowire %d.", tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_SINGLE_TO_UNTAGGED, tunnelId));
         }
 
+        // FIXME PW VLAN translation is not supported on Dune
+        //       Need to explore doing that in egress table later if there is a requirement
+        if (!ingressInner.equals(egressInner) || !ingressOuter.equals(egressOuter)) {
+            throw new IllegalArgumentException(String.format(ERR_VLAN_TRANSLATION, tunnelId));
+        }
 
-        if (!ingressInner.equals(egressInner) && !ingressOuter.equals(egressOuter)) {
-            throw new IllegalArgumentException(String.valueOf(String.format("We do not support changing both tags " +
-                                                                                    "in double tagged pws, only the " +
-                                                                                    "outer," +
-                                                                                    " for pseudowire %d.", tunnelId)));
+        if (deviceService == null) {
+            throw new IllegalStateException(String.format(ERR_SERVICE_UNAVAIL, "DeviceService"));
         }
 
         // check if cp1 and port of cp1 exist
         if (deviceService.getDevice(cP1.deviceId()) == null) {
-            throw new IllegalArgumentException(String.valueOf(String.format("cP1 device %s does not exist for" +
-                                                                                    " pseudowire %d.", cP1.deviceId(),
-                                                                            tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_DEV_NOT_FOUND, cP1.deviceId(), tunnelId));
         }
 
         if (deviceService.getPort(cP1) == null) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Port %s for cP1 device %s does not" +
-                                                                                    " exist for pseudowire %d.",
-                                                                            cP1.port(),
-                                                                            cP1.deviceId(), tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_PORT_NOT_FOUND, cP1.port(),
+                    cP1.deviceId(), tunnelId));
         }
 
         // check if cp2 and port of cp2 exist
         if (deviceService.getDevice(cP2.deviceId()) == null) {
-            throw new IllegalArgumentException(String.valueOf(String.format("cP2 device %s does not exist for" +
-                                                                                    " pseudowire %d.", cP2.deviceId(),
-                                                                            tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_DEV_NOT_FOUND, cP2.deviceId(), tunnelId));
         }
 
         if (deviceService.getPort(cP2) == null) {
-            throw new IllegalArgumentException(String.valueOf(String.format("Port %s for cP2 device %s does " +
-                                                                                    "not exist for pseudowire %d.",
-                                                                            cP2.port(), cP2.deviceId(), tunnelId)));
+            throw new IllegalArgumentException(String.format(ERR_PORT_NOT_FOUND, cP2.port(),
+                    cP2.deviceId(), tunnelId));
         }
     }
 
@@ -312,6 +334,10 @@
         }
         vlanSet.get(cP2).add(vlanToCheckCP2);
 
+        if (intfService == null) {
+            throw new IllegalStateException(String.format(ERR_SERVICE_UNAVAIL, "InterfaceService"));
+        }
+
         // check that vlans for the connect points are not used
         intfService.getInterfacesByPort(cP1).stream()
                 .forEach(intf -> {
diff --git a/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java b/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java
new file mode 100644
index 0000000..1d9f07e
--- /dev/null
+++ b/app/src/test/java/org/onosproject/segmentrouting/pwaas/PwaasUtilTest.java
@@ -0,0 +1,263 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
+ *
+ * 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.onosproject.segmentrouting.pwaas;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.onlab.junit.TestUtils;
+import org.onlab.packet.MacAddress;
+import org.onlab.packet.VlanId;
+import org.onosproject.net.ConnectPoint;
+import org.onosproject.net.DefaultPort;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.Port;
+import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.intf.Interface;
+import org.onosproject.net.intf.InterfaceService;
+import org.onosproject.segmentrouting.MockDevice;
+
+import static org.easymock.EasyMock.createNiceMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+
+public class PwaasUtilTest {
+    private static final DeviceId DID1 = DeviceId.deviceId("of:1");
+    private static final DeviceId DID2 = DeviceId.deviceId("of:2");
+    private static final DeviceId DID99 = DeviceId.deviceId("of:99");
+    private static final PortNumber PN1 = PortNumber.portNumber(1);
+    private static final PortNumber PN2 = PortNumber.portNumber(2);
+    private static final PortNumber PN99 = PortNumber.portNumber(99);
+    private static final ConnectPoint CP11 = new ConnectPoint(DID1, PN1);
+    private static final ConnectPoint CP12 = new ConnectPoint(DID1, PN2);
+    private static final ConnectPoint CP21 = new ConnectPoint(DID2, PN1);
+    private static final ConnectPoint CP22 = new ConnectPoint(DID2, PN2);
+    private static final VlanId V1 = VlanId.vlanId((short) 1);
+    private static final VlanId V2 = VlanId.vlanId((short) 2);
+    private static final Device D1 = new MockDevice(DID1, null);
+    private static final Device D2 = new MockDevice(DID2, null);
+    private static final Port P11 = new DefaultPort(D1, PN1, true);
+    private static final Port P12 = new DefaultPort(D1, PN2, true);
+    private static final Port P21 = new DefaultPort(D2, PN1, true);
+    private static final Port P22 = new DefaultPort(D2, PN2, true);
+    private static final Interface I11 = new Interface("I11", CP11, Lists.newArrayList(), MacAddress.NONE,
+            VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+    private static final Interface I12 = new Interface("I12", CP12, Lists.newArrayList(), MacAddress.NONE,
+            VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+    private static final Interface I21 = new Interface("I21", CP21, Lists.newArrayList(), MacAddress.NONE,
+            VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+    private static final Interface I22 = new Interface("I22", CP22, Lists.newArrayList(), MacAddress.NONE,
+            VlanId.NONE, VlanId.NONE, Sets.newHashSet(VlanId.NONE), VlanId.NONE);
+
+    private ConnectPoint cp1;
+    private ConnectPoint cp2;
+    private VlanId ingressInner;
+    private VlanId ingressOuter;
+    private VlanId egressInner;
+    private VlanId egressOuter;
+    private static final Long TUNNEL_ID = (long) 1234;
+
+    @Before
+    public void setUp() {
+        DeviceService deviceService = createNiceMock(DeviceService.class);
+        InterfaceService intfService = createNiceMock(InterfaceService.class);
+        TestUtils.setField(PwaasUtil.class, "deviceService", deviceService);
+        TestUtils.setField(PwaasUtil.class, "intfService", intfService);
+
+        expect(deviceService.getDevice(DID1)).andReturn(D1).anyTimes();
+        expect(deviceService.getDevice(DID2)).andReturn(D2).anyTimes();
+        expect(deviceService.getPort(CP11)).andReturn(P11).anyTimes();
+        expect(deviceService.getPort(CP12)).andReturn(P12).anyTimes();
+        expect(deviceService.getPort(CP21)).andReturn(P21).anyTimes();
+        expect(deviceService.getPort(CP22)).andReturn(P22).anyTimes();
+        expect(intfService.getInterfacesByPort(CP11)).andReturn(Sets.newHashSet(I11)).anyTimes();
+        expect(intfService.getInterfacesByPort(CP12)).andReturn(Sets.newHashSet(I12)).anyTimes();
+        expect(intfService.getInterfacesByPort(CP21)).andReturn(Sets.newHashSet(I21)).anyTimes();
+        expect(intfService.getInterfacesByPort(CP22)).andReturn(Sets.newHashSet(I22)).anyTimes();
+        replay(deviceService);
+        replay(intfService);
+    }
+
+    @Rule
+    public final ExpectedException exception = ExpectedException.none();
+
+    @Test
+    public void verifyPolicy() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = V1;
+        egressOuter = V2;
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+
+        ingressInner = VlanId.NONE;
+        ingressOuter = VlanId.NONE;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyOnSameDevice() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID1, PN2);
+        ingressInner = VlanId.NONE;
+        ingressOuter = VlanId.NONE;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_SAME_DEV, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyEmptyInnerCp1() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = VlanId.NONE;
+        ingressOuter = V1;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_EMPTY_INNER_WHEN_OUTER_PRESENT, TUNNEL_ID, "cp1"));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyEmptyInnerCp2() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = VlanId.NONE;
+        ingressOuter = VlanId.NONE;
+        egressInner = VlanId.NONE;
+        egressOuter = V1;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_EMPTY_INNER_WHEN_OUTER_PRESENT, TUNNEL_ID, "cp2"));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyVlanWildcard() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = VlanId.ANY;
+        ingressOuter = VlanId.NONE;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_WILDCARD_VLAN, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+
+    @Test
+    public void verifyPolicyDeviceServiceNotAvailable() {
+        TestUtils.setField(PwaasUtil.class, "deviceService", null);
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = V1;
+        egressOuter = V2;
+        exception.expect(IllegalStateException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_SERVICE_UNAVAIL, "DeviceService"));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyDoubleToUntagged() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_DOUBLE_TO_UNTAGGED, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyDoubleToSingle() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = V1;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_DOUBLE_TO_SINGLE, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicySingleToUntagged() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = VlanId.NONE;
+        egressInner = VlanId.NONE;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_SINGLE_TO_UNTAGGED, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyVlanTranslation() {
+        cp1 = new ConnectPoint(DID1, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = VlanId.NONE;
+        egressInner = V2;
+        egressOuter = VlanId.NONE;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_VLAN_TRANSLATION, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyDeviceNotFound() {
+        cp1 = new ConnectPoint(DID99, PN1);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = V1;
+        egressOuter = V2;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_DEV_NOT_FOUND, DID99, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+
+    @Test
+    public void verifyPolicyPortNotFound() {
+        cp1 = new ConnectPoint(DID1, PN99);
+        cp2 = new ConnectPoint(DID2, PN2);
+        ingressInner = V1;
+        ingressOuter = V2;
+        egressInner = V1;
+        egressOuter = V2;
+        exception.expect(IllegalArgumentException.class);
+        exception.expectMessage(String.format(PwaasUtil.ERR_PORT_NOT_FOUND, PN99, DID1, TUNNEL_ID));
+        PwaasUtil.verifyPolicy(cp1, cp2, ingressInner, ingressOuter, egressInner, egressOuter, TUNNEL_ID);
+    }
+}
\ No newline at end of file
