Merge "Tests coverage increasing for iovisor.endpoint"
authorMartin Sunal <msunal@cisco.com>
Fri, 20 May 2016 09:50:05 +0000 (09:50 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Fri, 20 May 2016 09:50:05 +0000 (09:50 +0000)
25 files changed:
artifacts/pom.xml
features/pom.xml
features/src/main/features/features.xml
renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorRenderer.java [changed mode: 0644->0755]
renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassificationResult.java [changed mode: 0644->0755]
renderers/iovisor/src/main/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/L4Classifier.java
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorRendererTest.java [changed mode: 0644->0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/IovisorResolvedEndpointListenerTest.java [changed mode: 0644->0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/ResolvedPolicyListenerTest.java [changed mode: 0644->0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListenerTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/AllowActionTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassificationResultTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListenerTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/EtherTypeClassifierTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/IpProtoClassifierTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/L4ClassifierTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ParamDerivatorTest.java [new file with mode: 0755]
renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/SubjectFeaturesTest.java [new file with mode: 0755]
renderers/pom.xml
renderers/vpp/pom.xml [new file with mode: 0644]
renderers/vpp/src/main/config/default-config.xml [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModule.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModuleFactory.java [new file with mode: 0644]
renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java [new file with mode: 0644]
renderers/vpp/src/main/yang/vpp-provider-impl.yang [new file with mode: 0644]

index 6eef12e7d57f9a857be7a7712d898a4a080f9c61..f9fd8aa7f5112455b9f0287235bdc42f9660fd5c 100755 (executable)
         <artifactId>ne-location-provider</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>vpp-renderer</artifactId>
+        <version>${project.version}</version>
+      </dependency>
       <dependency>
         <groupId>${project.groupId}</groupId>
         <artifactId>neutron-mapper</artifactId>
         <type>xml</type>
         <classifier>config</classifier>
       </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>vpp-renderer</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>config</classifier>
+      </dependency>
       <dependency>
         <groupId>${project.groupId}</groupId>
         <artifactId>neutron-mapper</artifactId>
index 12389e640a9e14ba6f234e7a1af232b88e6a44df..77089623e919981bb79b9e7668628d1a64b79d5d 100755 (executable)
       <groupId>org.opendaylight.groupbasedpolicy</groupId>
       <artifactId>ne-location-provider</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>vpp-renderer</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.groupbasedpolicy</groupId>
       <artifactId>neutron-mapper</artifactId>
       <type>xml</type>
       <classifier>config</classifier>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.groupbasedpolicy</groupId>
+      <artifactId>vpp-renderer</artifactId>
+      <type>xml</type>
+      <classifier>config</classifier>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.groupbasedpolicy</groupId>
       <artifactId>neutron-mapper</artifactId>
index 046346d82709138b94327f33ef01c6dcaad90633..2b385da76648a60629f886fbddd3282f675b1066 100755 (executable)
         <configfile finalname="${config.configfile.directory}/15-neutron-ovsdb.xml">mvn:org.opendaylight.groupbasedpolicy/neutron-ovsdb/{{VERSION}}/xml/config</configfile>
     </feature>
 
+    <!--
+        The VPP renderer
+    -->
+    <feature name='odl-groupbasedpolicy-vpp' version='${project.version}' description='OpenDaylight :: groupbasedpolicy :: VPP renderer '>
+        <feature version="${project.version}">odl-groupbasedpolicy-base</feature>
+        <bundle>mvn:org.opendaylight.groupbasedpolicy/vpp-renderer/{{VERSION}}</bundle>
+        <configfile finalname="${config.configfile.directory}/15-vpp-renderer.xml">mvn:org.opendaylight.groupbasedpolicy/vpp-renderer/{{VERSION}}/xml/config</configfile>
+    </feature>
+
     <!--
          The UI Backend
     -->
old mode 100644 (file)
new mode 100755 (executable)
index 1113e04..6bfc3a7
@@ -61,8 +61,8 @@ public class IovisorRenderer implements AutoCloseable {
         }
         endpointManager = new EndpointManager(dataBroker, epRendererAugmentationRegistry);
         endpointListener = new EndpointListener(dataBroker, endpointManager);
-        this.resolvedPolicyListener = new ResolvedPolicyListener(dataBroker, endpointManager.getIovisorModuleManager());
-        this.resolvedEndpointListener = new IovisorResolvedEndpointListener(dataBroker);
+        resolvedPolicyListener = new ResolvedPolicyListener(dataBroker, endpointManager.getIovisorModuleManager());
+        resolvedEndpointListener = new IovisorResolvedEndpointListener(dataBroker);
         classifierDefinitionListener = new ClassifierDefinitionListener(dataBroker);
         actionDefinitionListener = new ActionDefinitionListener(dataBroker);
 
old mode 100644 (file)
new mode 100755 (executable)
index cb4a379..7d5dd5a
@@ -14,6 +14,7 @@ import com.google.common.base.Preconditions;
 
 public class ClassificationResult {
 
+    static final String DEFAULT_ERROR_MESSAGE = "";
     private final String errorMessage;
     private final boolean isSuccessful;
 
@@ -29,7 +30,7 @@ public class ClassificationResult {
      * @param matches cannot be {@code null}
      */
     public ClassificationResult(List<String> matches) {
-        errorMessage = "";
+        errorMessage = DEFAULT_ERROR_MESSAGE;
         this.isSuccessful = true;
     }
 
index 7bb668e34115d881550e6f949735d928db9073d4..6a78cfda4f72a0ca5a4a98685af4e131948829b8 100755 (executable)
@@ -11,12 +11,12 @@ package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;
 import java.util.List;
 import java.util.Map;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ClassifierDefinitionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.parameter.value.RangeValue;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.IntBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.RangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;
@@ -26,13 +26,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValue;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.supported.range.value.fields.SupportedRangeValueBuilder;
 
-import com.google.common.collect.ImmutableList;
-
 /**
  * Match against TCP or UDP, and source and/or destination ports
  */
 public class L4Classifier extends Classifier {
 
+    static final String EXC_MSG_PARAM_VALUE_NOT_SPECIFIED = "Value of parameter not specified: ";
+    static final String EXC_MSG_MUT_EXCLUSIVE_PARAMS = "Mutually exclusive parameters: ";
+    static final String EXC_MSG_RANGE_VALUE_MISMATCH = "Range value mismatch: ";
+
     protected L4Classifier(Classifier parent) {
         super(parent);
     }
@@ -87,15 +89,11 @@ public class L4Classifier extends Classifier {
         if (params.get(portParam) != null) {
             StringBuilder paramLog = new StringBuilder();
             if (params.get(portParam).getIntValue() == null) {
-                paramLog.append("Value of ").append(portParam).append(" parameter is not specified.");
+                paramLog.append(EXC_MSG_PARAM_VALUE_NOT_SPECIFIED).append(portParam);
                 throw new IllegalArgumentException(paramLog.toString());
             }
             if (params.get(portRangeParam) != null) {
-                paramLog.append("Source port parameters ")
-                    .append(portParam)
-                    .append(" and ")
-                    .append(portRangeParam)
-                    .append(" are mutually exclusive.");
+                paramLog.append(EXC_MSG_MUT_EXCLUSIVE_PARAMS).append(portParam).append(" and ").append(portRangeParam);
                 throw new IllegalArgumentException(paramLog.toString());
             }
         }
@@ -103,18 +101,14 @@ public class L4Classifier extends Classifier {
 
     private void validateRange(Map<String, ParameterValue> params, String portRangeParam) {
         if (params.get(portRangeParam) != null) {
-            validateRangeValue(params.get(portRangeParam).getRangeValue());
-        }
-    }
-
-    private void validateRangeValue(RangeValue rangeValueParam) {
-        if (rangeValueParam == null) {
-            throw new IllegalArgumentException("Range parameter is specifiet but value is not present.");
-        }
-        final Long min = rangeValueParam.getMin();
-        final Long max = rangeValueParam.getMax();
-        if (min > max) {
-            throw new IllegalArgumentException("Range value mismatch. " + min + " is greater than MAX " + max + ".");
+            if (params.get(portRangeParam).getRangeValue() == null) {
+                throw new IllegalArgumentException(EXC_MSG_PARAM_VALUE_NOT_SPECIFIED + portRangeParam);
+            }
+            Long min = params.get(portRangeParam).getRangeValue().getMin();
+            Long max = params.get(portRangeParam).getRangeValue().getMax();
+            if (min > max) {
+                throw new IllegalArgumentException(EXC_MSG_RANGE_VALUE_MISMATCH + min + ">" + max);
+            }
         }
     }
 
old mode 100644 (file)
new mode 100755 (executable)
index 289c1b5..02a5265
@@ -8,9 +8,12 @@
 
 package org.opendaylight.groupbasedpolicy.renderer.iovisor;
 
+import static org.junit.Assert.assertNotNull;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 
 import org.junit.Before;
+import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.groupbasedpolicy.api.EpRendererAugmentationRegistry;
 import org.opendaylight.groupbasedpolicy.api.PolicyValidatorRegistry;
@@ -28,7 +31,24 @@ public class IovisorRendererTest extends GbpIovisorDataBrokerTest {
         dataBroker = getDataBroker();
         epRendererAugReg = mock(EpRendererAugmentationRegistry.class);
         policyValidatorRegistry = mock(PolicyValidatorRegistry.class);
-        iovisorRenderer = new IovisorRenderer(dataBroker, epRendererAugReg, policyValidatorRegistry);
+        iovisorRenderer = spy(new IovisorRenderer(dataBroker, epRendererAugReg, policyValidatorRegistry));
 
     }
+
+    @Test
+    public void testConstructor() throws Exception{
+        IovisorRenderer other = new IovisorRenderer(dataBroker, epRendererAugReg, policyValidatorRegistry);
+        other.close();
+    }
+
+    @Test
+    public void testGetResolvedEndpointListener(){
+         assertNotNull(iovisorRenderer.getResolvedEndpointListener());
+    }
+
+    @Test
+    public void testGetEndPointManager(){
+         assertNotNull(iovisorRenderer.getEndPointManager());
+    }
+
 }
old mode 100644 (file)
new mode 100755 (executable)
index 718122f..403f1ca
 
 package org.opendaylight.groupbasedpolicy.renderer.iovisor;
 
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.renderer.iovisor.test.GbpIovisorDataBrokerTest;
+import org.opendaylight.groupbasedpolicy.renderer.iovisor.utils.IovisorIidFactory;
 import org.opendaylight.groupbasedpolicy.util.DataStoreHelper;
 import org.opendaylight.groupbasedpolicy.util.IidFactory;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.EndpointGroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.TenantId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorResolvedEndpointsByTenantByEndpointgroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.IovisorResolvedEndpointsByTenantByEndpointgroupIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.resolved.endpoints.by.tenant.by.endpointgroup.id.IovisorResolvedEndpointByTenantByEndpointgroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.resolved.endpoints.by.tenant.by.endpointgroup.id.IovisorResolvedEndpointByTenantByEndpointgroupIdBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.interests.followed.tenants.followed.tenant.FollowedEndpointGroup;
-
-import com.google.common.base.Optional;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class IovisorResolvedEndpointListenerTest extends GbpIovisorDataBrokerTest {
 
     private DataBroker dataBroker;
     private IovisorResolvedEndpointListener iovisorResolvedEndpointListener;
+    private DataObjectModification<IovisorResolvedEndpointsByTenantByEndpointgroupId> rootNode;
+    private Set<DataTreeModification<IovisorResolvedEndpointsByTenantByEndpointgroupId>> changes;
+    private InstanceIdentifier<IovisorResolvedEndpointsByTenantByEndpointgroupId> rootIdentifier;
+
     private final TenantId tenant1 = new TenantId("tenant1");
     private final EndpointGroupId epg1 = new EndpointGroupId("client");
 
     @Before
     public void iovisorInit() {
         dataBroker = getDataBroker();
-        iovisorResolvedEndpointListener = new IovisorResolvedEndpointListener(dataBroker);
+        iovisorResolvedEndpointListener = spy(new IovisorResolvedEndpointListener(dataBroker));
+
+        rootNode = mock(DataObjectModification.class);
+        rootIdentifier = IovisorIidFactory.iovisorResolvedEndpointsByTenantIdByEndpointGroupIdWildCardIid();
+        DataTreeIdentifier<IovisorResolvedEndpointsByTenantByEndpointgroupId> rootPath =
+                new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
+                        IovisorIidFactory.iovisorResolvedEndpointsByTenantIdByEndpointGroupIdWildCardIid());
+        DataTreeModification<IovisorResolvedEndpointsByTenantByEndpointgroupId> change = mock(DataTreeModification.class);
 
+        when(change.getRootNode()).thenReturn(rootNode);
+        when(change.getRootPath()).thenReturn(rootPath);
+
+        changes = ImmutableSet.of(change);
+
+        IovisorResolvedEndpointByTenantByEndpointgroupId testElement = new IovisorResolvedEndpointByTenantByEndpointgroupIdBuilder()
+                .setTenantId(tenant1)
+                .setEndpointgroupId(epg1)
+                .build();
+        List<IovisorResolvedEndpointByTenantByEndpointgroupId> list = ImmutableList.of(testElement);
+
+        IovisorResolvedEndpointsByTenantByEndpointgroupId testData = new IovisorResolvedEndpointsByTenantByEndpointgroupIdBuilder()
+                .setIovisorResolvedEndpointByTenantByEndpointgroupId(list)
+                .build();
+
+        when(rootNode.getDataAfter()).thenReturn(testData);
     }
 
+    @Test
+    public void testOnWrite() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+
+        iovisorResolvedEndpointListener.onDataTreeChanged(changes);
+
+        verify(iovisorResolvedEndpointListener).onSubtreeModified(rootNode, rootIdentifier);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testOnDelete() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+
+        iovisorResolvedEndpointListener.onDataTreeChanged(changes);
+    }
+
+    @Test
+    public void testOnSubtreeModified() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
+
+        iovisorResolvedEndpointListener.onDataTreeChanged(changes);
+
+        verify(iovisorResolvedEndpointListener).endpointPolicyUpdated(any(TenantId.class), any(EndpointGroupId.class), any(WriteTransaction.class));
+    }
+
+
     @Test
     public void endpointPolicyUpdatedTest() {
         iovisorResolvedEndpointListener.endpointPolicyUpdated(tenant1, epg1, dataBroker.newWriteOnlyTransaction());
old mode 100644 (file)
new mode 100755 (executable)
index f1943aa..26e77d9
@@ -9,16 +9,27 @@
 package org.opendaylight.groupbasedpolicy.renderer.iovisor;
 
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.sun.jersey.api.client.ClientHandlerException;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.groupbasedpolicy.api.EpRendererAugmentationRegistry;
 import org.opendaylight.groupbasedpolicy.renderer.iovisor.endpoint.EndpointManager;
 import org.opendaylight.groupbasedpolicy.renderer.iovisor.module.IovisorModuleManager;
@@ -36,6 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.re
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.module.instances.IovisorModuleInstanceBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.iovisor.module.by.tenant.by.endpointgroup.id.IovisorModuleInstanceId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.iovisor.rev151030.iovisor.modules.by.tenant.by.endpointgroup.id.iovisor.module.by.tenant.by.endpointgroup.id.IovisorModuleInstanceIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.ResolvedPolicies;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.actions.ActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.classifiers.Classifier;
@@ -44,18 +56,19 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.p
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.has.resolved.rules.ResolvedRuleBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicy;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicyBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.ResolvedPolicyKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraints;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.PolicyRuleGroupWithEndpointConstraintsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.resolved.policy.rev150828.resolved.policies.resolved.policy.policy.rule.group.with.endpoint.constraints.PolicyRuleGroupBuilder;
-
-import com.google.common.collect.ImmutableList;
-import com.sun.jersey.api.client.ClientHandlerException;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class ResolvedPolicyListenerTest extends GbpIovisorDataBrokerTest {
 
     private DataBroker dataBroker;
     private ResolvedPolicyListener resolvedPolicyListener;
+    private DataObjectModification<ResolvedPolicy> rootNode;
+    private Set<DataTreeModification<ResolvedPolicy>> changes;
 
     private TenantId tenantId = new TenantId("tenant1");
     private EndpointGroupId consEpg = new EndpointGroupId("client");
@@ -116,7 +129,24 @@ public class ResolvedPolicyListenerTest extends GbpIovisorDataBrokerTest {
         endpointManager = new EndpointManager(dataBroker, mock(EpRendererAugmentationRegistry.class));
         iovisorModuleManager = mock(IovisorModuleManager.class);
         // iovisorModuleManager = endpointManager.getIovisorModuleManager();
-        resolvedPolicyListener = new ResolvedPolicyListener(dataBroker, iovisorModuleManager);
+        resolvedPolicyListener = spy(new ResolvedPolicyListener(dataBroker, iovisorModuleManager));
+
+        ResolvedPolicyKey key = mock(ResolvedPolicyKey.class);
+        rootNode = mock(DataObjectModification.class);
+        InstanceIdentifier<ResolvedPolicy> rootIdentifier =
+                InstanceIdentifier.builder(ResolvedPolicies.class)
+                        .child(ResolvedPolicy.class, key)
+                        .build();
+        DataTreeIdentifier<ResolvedPolicy> rootPath =
+                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, rootIdentifier);
+        DataTreeModification<ResolvedPolicy> change = mock(DataTreeModification.class);
+
+        when(change.getRootNode()).thenReturn(rootNode);
+        when(change.getRootPath()).thenReturn(rootPath);
+
+        changes = ImmutableSet.of(change);
+
+        when(rootNode.getDataAfter()).thenReturn(resolvedPolicy);
     }
 
     @Test(expected = NullPointerException.class)
@@ -124,6 +154,29 @@ public class ResolvedPolicyListenerTest extends GbpIovisorDataBrokerTest {
         resolvedPolicyListener.processResolvedPolicyNotification(null);
     }
 
+    @Test
+    public void testOnWrite() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+
+        resolvedPolicyListener.onDataTreeChanged(changes);
+
+        verify(resolvedPolicyListener).processResolvedPolicyNotification(eq(resolvedPolicy));
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testOnDelete() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+
+        resolvedPolicyListener.onDataTreeChanged(changes);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void testOnSubtreeModified() {
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
+
+        resolvedPolicyListener.onDataTreeChanged(changes);
+    }
+
     @Test
     public void policyUriBuilderTest() {
         String target = "/restconf/operational/resolved-policy:resolved-policies/resolved-policy/" + tenantId.getValue()
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListenerTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ActionDefinitionListenerTest.java
new file mode 100755 (executable)
index 0000000..d418eed
--- /dev/null
@@ -0,0 +1,101 @@
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.mockito.Mockito.mock;\r
+import static org.mockito.Mockito.spy;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.util.Set;\r
+\r
+import com.google.common.collect.ImmutableSet;\r
+import com.google.common.util.concurrent.CheckedFuture;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;\r
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.SubjectFeatureDefinitions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinitionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ActionDefinitionKey;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+\r
+public class ActionDefinitionListenerTest {\r
+\r
+    private ActionDefinitionListener listener;\r
+    private DataObjectModification<ActionDefinition> rootNode;\r
+    private Set<DataTreeModification<ActionDefinition>> changes;\r
+\r
+    private InstanceIdentifier<ActionDefinition> rootIdentifier;\r
+    private DataBroker dataProvider;\r
+\r
+    @SuppressWarnings("unchecked")\r
+    @Before\r
+    public void init() {\r
+        dataProvider = mock(DataBroker.class);\r
+\r
+        listener = spy(new ActionDefinitionListener(dataProvider));\r
+\r
+        ActionDefinitionKey key = mock(ActionDefinitionKey.class);\r
+        rootNode = mock(DataObjectModification.class);\r
+        rootIdentifier =\r
+                InstanceIdentifier.builder(SubjectFeatureDefinitions.class).child(ActionDefinition.class, key).build();\r
+        DataTreeIdentifier<ActionDefinition> rootPath =\r
+                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, rootIdentifier);\r
+\r
+        DataTreeModification<ActionDefinition> change = mock(DataTreeModification.class);\r
+\r
+        when(change.getRootNode()).thenReturn(rootNode);\r
+        when(change.getRootPath()).thenReturn(rootPath);\r
+\r
+        changes = ImmutableSet.of(change);\r
+\r
+        ActionDefinition def = new ActionDefinitionBuilder().setId(AllowActionDefinition.ID).build();\r
+\r
+        when(rootNode.getDataBefore()).thenReturn(def);\r
+        when(rootNode.getDataAfter()).thenReturn(def);\r
+    }\r
+\r
+    @Test\r
+    public void testOnWrite() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onSubtreeModified(rootNode, rootIdentifier);\r
+    }\r
+\r
+    @Test\r
+    public void testOnDelete() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onDelete(rootNode, rootIdentifier);\r
+    }\r
+\r
+    @Test\r
+    public void testOnSubtreeModified() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onSubtreeModified(rootNode, rootIdentifier);\r
+    }\r
+\r
+    private WriteTransaction resetTransaction() {\r
+        WriteTransaction wt = mock(WriteTransaction.class);\r
+        CheckedFuture checkedFuture = mock(CheckedFuture.class);\r
+        when(wt.submit()).thenReturn(checkedFuture);\r
+        when(dataProvider.newWriteOnlyTransaction()).thenReturn(wt);\r
+        return wt;\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/AllowActionTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/AllowActionTest.java
new file mode 100755 (executable)
index 0000000..2ac1331
--- /dev/null
@@ -0,0 +1,52 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.groupbasedpolicy.api.ValidationResult;\r
+import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstance;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.tenants.tenant.policy.subject.feature.instances.ActionInstanceBuilder;\r
+\r
+public class AllowActionTest {\r
+\r
+    AllowAction action;\r
+\r
+    @Before\r
+    public void init() {\r
+        action = new AllowAction();\r
+    }\r
+\r
+    @Test\r
+    public void testGetId() {\r
+        assertEquals(action.getId(), AllowActionDefinition.ID);\r
+    }\r
+\r
+    @Test\r
+    public void testGetActionDef() {\r
+        assertEquals(action.getActionDef(), AllowActionDefinition.DEFINITION);\r
+    }\r
+\r
+    @Test\r
+    public void testGetSupportedParameterValues() {\r
+        assertTrue(action.getSupportedParameterValues().isEmpty());\r
+    }\r
+\r
+    @Test\r
+    public void testValidate() {\r
+        ActionInstance actionInstance = new ActionInstanceBuilder().build();\r
+        ValidationResult result = action.validate(actionInstance);\r
+        assertTrue(result.isValid());\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassificationResultTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassificationResultTest.java
new file mode 100755 (executable)
index 0000000..74646fa
--- /dev/null
@@ -0,0 +1,51 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+\r
+public class ClassificationResultTest {\r
+\r
+    private static final String ERROR_MESSAGE = "error message";\r
+    private ClassificationResult resultOk;\r
+    private ClassificationResult resultError;\r
+\r
+    @Before\r
+    public void init() {\r
+        List<String> list = new ArrayList<>();\r
+        list.add("string");\r
+        resultOk = new ClassificationResult(list);\r
+        resultError = new ClassificationResult(ERROR_MESSAGE);\r
+    }\r
+\r
+    @Test\r
+    public void testConstructor_Result() {\r
+        assertTrue(resultOk.isSuccessfull());\r
+    }\r
+\r
+    @Test\r
+    public void testConstructor_ErrorMsg() {\r
+        assertFalse(resultError.isSuccessfull());\r
+    }\r
+\r
+    @Test\r
+    public void testGetErrorMessage() {\r
+        assertEquals(resultOk.getErrorMessage(), ClassificationResult.DEFAULT_ERROR_MESSAGE);\r
+        assertEquals(resultError.getErrorMessage(), ERROR_MESSAGE);\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListenerTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ClassifierDefinitionListenerTest.java
new file mode 100755 (executable)
index 0000000..eb02ac9
--- /dev/null
@@ -0,0 +1,102 @@
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.mockito.Mockito.mock;\r
+import static org.mockito.Mockito.spy;\r
+import static org.mockito.Mockito.verify;\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.util.Set;\r
+\r
+import com.google.common.collect.ImmutableSet;\r
+import com.google.common.util.concurrent.CheckedFuture;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;\r
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;\r
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;\r
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.SubjectFeatureDefinitions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinitionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.definitions.ClassifierDefinitionKey;\r
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
+\r
+public class ClassifierDefinitionListenerTest {\r
+\r
+    private ClassifierDefinitionListener listener;\r
+    private DataObjectModification<ClassifierDefinition> rootNode;\r
+    private Set<DataTreeModification<ClassifierDefinition>> changes;\r
+\r
+    private InstanceIdentifier<ClassifierDefinition> rootIdentifier;\r
+    private DataBroker dataProvider;\r
+\r
+    @SuppressWarnings("unchecked")\r
+    @Before\r
+    public void init() {\r
+        dataProvider = mock(DataBroker.class);\r
+\r
+        listener = spy(new ClassifierDefinitionListener(dataProvider));\r
+\r
+        ClassifierDefinitionKey key = mock(ClassifierDefinitionKey.class);\r
+        rootNode = mock(DataObjectModification.class);\r
+        rootIdentifier = InstanceIdentifier.builder(SubjectFeatureDefinitions.class)\r
+            .child(ClassifierDefinition.class, key)\r
+            .build();\r
+        DataTreeIdentifier<ClassifierDefinition> rootPath =\r
+                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, rootIdentifier);\r
+\r
+        DataTreeModification<ClassifierDefinition> change = mock(DataTreeModification.class);\r
+\r
+        when(change.getRootNode()).thenReturn(rootNode);\r
+        when(change.getRootPath()).thenReturn(rootPath);\r
+\r
+        changes = ImmutableSet.of(change);\r
+\r
+        ClassifierDefinition def = new ClassifierDefinitionBuilder().setId(EtherTypeClassifierDefinition.ID).build();\r
+\r
+        when(rootNode.getDataBefore()).thenReturn(def);\r
+        when(rootNode.getDataAfter()).thenReturn(def);\r
+    }\r
+\r
+    @Test\r
+    public void testOnWrite() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onSubtreeModified(rootNode, rootIdentifier);\r
+    }\r
+\r
+    @Test\r
+    public void testOnDelete() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onDelete(rootNode, rootIdentifier);\r
+    }\r
+\r
+    @Test\r
+    public void testOnSubtreeModified() {\r
+        when(rootNode.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);\r
+        WriteTransaction wt = resetTransaction();\r
+\r
+        listener.onDataTreeChanged(changes);\r
+\r
+        verify(listener).onSubtreeModified(rootNode, rootIdentifier);\r
+    }\r
+\r
+    private WriteTransaction resetTransaction() {\r
+        WriteTransaction wt = mock(WriteTransaction.class);\r
+        CheckedFuture checkedFuture = mock(CheckedFuture.class);\r
+        when(wt.submit()).thenReturn(checkedFuture);\r
+        when(dataProvider.newWriteOnlyTransaction()).thenReturn(wt);\r
+        return wt;\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/EtherTypeClassifierTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/EtherTypeClassifierTest.java
new file mode 100755 (executable)
index 0000000..8720c2f
--- /dev/null
@@ -0,0 +1,87 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertNull;\r
+import static org.junit.Assert.assertTrue;\r
+import static org.junit.Assert.fail;\r
+\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.ParameterType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.Int;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;\r
+\r
+public class EtherTypeClassifierTest {\r
+\r
+    @Test\r
+    public void testGetId() {\r
+        assertEquals(EtherTypeClassifierDefinition.ID, Classifier.ETHER_TYPE_CL.getId());\r
+    }\r
+\r
+    @Test\r
+    public void testGetClassifierDefinition() {\r
+        assertEquals(EtherTypeClassifierDefinition.DEFINITION, Classifier.ETHER_TYPE_CL.getClassifierDefinition());\r
+    }\r
+\r
+    @Test\r
+    public void testGetSupportedParameterValues() {\r
+        List<SupportedParameterValues> valuesList = Classifier.ETHER_TYPE_CL.getSupportedParameterValues();\r
+        assertEquals(1, valuesList.size());\r
+\r
+        SupportedParameterValues values = valuesList.get(0);\r
+        assertNotNull(values);\r
+        assertEquals(EtherTypeClassifierDefinition.ETHERTYPE_PARAM, values.getParameterName().getValue());\r
+        ParameterType pt = values.getParameterType();\r
+        assertTrue(pt instanceof Int);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.ARP_VALUE).build();\r
+        params.put(EtherTypeClassifierDefinition.ETHERTYPE_PARAM, pv);\r
+\r
+        try {\r
+            Classifier.ETHER_TYPE_CL.checkPresenceOfRequiredParams(params);\r
+        } catch (IllegalArgumentException e) {\r
+            fail("Required parameter missing");\r
+        }\r
+    }\r
+\r
+    @Test(expected = IllegalArgumentException.class)\r
+    public void testCheckPresenceOfRequiredParams_noParam() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+\r
+        Classifier.ETHER_TYPE_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test(expected = IllegalArgumentException.class)\r
+    public void testCheckPresenceOfRequiredParams_nullValue() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().build();\r
+        params.put(EtherTypeClassifierDefinition.ETHERTYPE_PARAM, pv);\r
+\r
+        Classifier.ETHER_TYPE_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testGetParent() {\r
+        assertNull(Classifier.ETHER_TYPE_CL.getParent());\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/IpProtoClassifierTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/IpProtoClassifierTest.java
new file mode 100755 (executable)
index 0000000..57734e1
--- /dev/null
@@ -0,0 +1,113 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertNull;\r
+import static org.junit.Assert.assertTrue;\r
+import static org.junit.Assert.fail;\r
+\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.ParameterType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.Int;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;\r
+\r
+public class IpProtoClassifierTest {\r
+\r
+    @Test\r
+    public void testGetId() {\r
+        assertEquals(IpProtoClassifierDefinition.ID, Classifier.IP_PROTO_CL.getId());\r
+    }\r
+\r
+    @Test\r
+    public void testGetClassifierDefinition() {\r
+        assertEquals(IpProtoClassifierDefinition.DEFINITION, Classifier.IP_PROTO_CL.getClassifierDefinition());\r
+    }\r
+\r
+    @Test\r
+    public void testGetSupportedParameterValues() {\r
+        List<SupportedParameterValues> valuesList = Classifier.IP_PROTO_CL.getSupportedParameterValues();\r
+        assertEquals(1, valuesList.size());\r
+\r
+        SupportedParameterValues values = valuesList.get(0);\r
+        assertNotNull(values);\r
+        assertEquals(IpProtoClassifierDefinition.PROTO_PARAM, values.getParameterName().getValue());\r
+        ParameterType pt = values.getParameterType();\r
+        assertTrue(pt instanceof Int);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams() {\r
+        Map<String, ParameterValue> params = prepareParams(IpProtoClassifierDefinition.UDP_VALUE);\r
+\r
+        try {\r
+            Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);\r
+        } catch (IllegalArgumentException e) {\r
+            fail("Required parameter missing");\r
+        }\r
+    }\r
+\r
+    @Test(expected = IllegalArgumentException.class)\r
+    public void testCheckPresenceOfRequiredParams_noParam() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+\r
+        Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test(expected = IllegalArgumentException.class)\r
+    public void testCheckPresenceOfRequiredParams_nullValue() {\r
+        Map<String, ParameterValue> params = prepareParams_nullValue();\r
+\r
+        Classifier.IP_PROTO_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testGetIpProtoValue() {\r
+        Long expected = IpProtoClassifierDefinition.UDP_VALUE;\r
+\r
+        assertEquals(expected, IpProtoClassifier.getIpProtoValue(prepareParams(expected)));\r
+    }\r
+\r
+    @Test\r
+    public void testGetIpProtoValue_badParams() {\r
+        Map<String, ParameterValue> params = prepareParams_nullValue();\r
+\r
+        assertNull(IpProtoClassifier.getIpProtoValue(params));\r
+        assertNull(IpProtoClassifier.getIpProtoValue(new HashMap<String, ParameterValue>()));\r
+        assertNull(IpProtoClassifier.getIpProtoValue(null));\r
+    }\r
+\r
+    @Test\r
+    public void testGetParent() {\r
+        assertEquals(Classifier.IP_PROTO_CL.getParent(), Classifier.ETHER_TYPE_CL);\r
+    }\r
+\r
+    private Map<String, ParameterValue> prepareParams(Long intValue) {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().setIntValue(intValue).build();\r
+        params.put(IpProtoClassifierDefinition.PROTO_PARAM, pv);\r
+        return params;\r
+    }\r
+\r
+    private Map<String, ParameterValue> prepareParams_nullValue() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().build();\r
+        params.put(IpProtoClassifierDefinition.PROTO_PARAM, pv);\r
+        return params;\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/L4ClassifierTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/L4ClassifierTest.java
new file mode 100755 (executable)
index 0000000..14ddba6
--- /dev/null
@@ -0,0 +1,172 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.junit.Before;\r
+import org.junit.Rule;\r
+import org.junit.Test;\r
+import org.junit.rules.ExpectedException;\r
+import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.common.rev140421.ParameterName;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.parameter.value.RangeValueBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.ParameterType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.has.parameters.type.parameter.type.Int;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.renderer.rev151103.renderers.renderer.capabilities.supported.classifier.definition.SupportedParameterValues;\r
+\r
+public class L4ClassifierTest {\r
+\r
+    private ParameterValue pvSrcPort80;\r
+    private ParameterValue pvDstPort80;\r
+    private ParameterValue pvDstPort_null;\r
+    private ParameterValue pvSrcRange81_82;\r
+    private ParameterValue pvDstRange81_82;\r
+    private ParameterValue pvDstRange82_81;\r
+    private ParameterValue pvDstRange_null;\r
+\r
+    @Rule\r
+    public ExpectedException thrown = ExpectedException.none();\r
+\r
+    @Before\r
+    public void init() {\r
+        pvSrcPort80 = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.SRC_PORT_PARAM)).setIntValue(80L).build();\r
+        pvDstPort80 = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).setIntValue(80L).build();\r
+        pvDstPort_null = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.DST_PORT_PARAM)).build();\r
+        pvSrcRange81_82 = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM))\r
+                .setRangeValue(new RangeValueBuilder().setMin(81L).setMax(82L).build())\r
+                .build();\r
+        pvDstRange81_82 = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))\r
+                .setRangeValue(new RangeValueBuilder().setMin(81L).setMax(82L).build())\r
+                .build();\r
+        pvDstRange82_81 = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))\r
+                .setRangeValue(new RangeValueBuilder().setMin(82L).setMax(81L).build())\r
+                .build();\r
+        pvDstRange_null = new ParameterValueBuilder().setName(\r
+                new ParameterName(L4ClassifierDefinition.DST_PORT_RANGE_PARAM))\r
+                //.setRangeValue(new RangeValueBuilder().setMin(82L).setMax(81L).build())\r
+                .build();\r
+    }\r
+\r
+    @Test\r
+    public void testGetId() {\r
+        assertEquals(L4ClassifierDefinition.ID, Classifier.L4_CL.getId());\r
+    }\r
+\r
+    @Test\r
+    public void testGetClassifierDefinition() {\r
+        assertEquals(L4ClassifierDefinition.DEFINITION, Classifier.L4_CL.getClassifierDefinition());\r
+    }\r
+\r
+    @Test\r
+    public void testGetSupportedParameterValues() {\r
+        List<SupportedParameterValues> valuesList = Classifier.L4_CL.getSupportedParameterValues();\r
+        assertEquals(4, valuesList.size());\r
+\r
+        SupportedParameterValues values = valuesList.get(0);\r
+        assertNotNull(values);\r
+        assertEquals(L4ClassifierDefinition.SRC_PORT_PARAM, values.getParameterName().getValue());\r
+        ParameterType pt = values.getParameterType();\r
+        assertTrue(pt instanceof Int);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_Empty() throws Exception {\r
+        // TODO check: sending empty map is ok?\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_SinglePorts() throws Exception {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
+        params.put(L4ClassifierDefinition.DST_PORT_PARAM, pvDstPort80);\r
+\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_PortRanges() throws Exception {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM, pvSrcRange81_82);\r
+        params.put(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, pvDstRange81_82);\r
+\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_DstPortNull() throws IllegalArgumentException {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
+        params.put(L4ClassifierDefinition.DST_PORT_PARAM, pvDstPort_null);\r
+\r
+        thrown.expect(IllegalArgumentException.class);\r
+        thrown.expectMessage(L4Classifier.EXC_MSG_PARAM_VALUE_NOT_SPECIFIED);\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_DstRangeNull() throws IllegalArgumentException {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
+        params.put(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, pvDstRange_null);\r
+\r
+        thrown.expect(IllegalArgumentException.class);\r
+        thrown.expectMessage(L4Classifier.EXC_MSG_PARAM_VALUE_NOT_SPECIFIED);\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_ParamConflict() throws IllegalArgumentException {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
+        params.put(L4ClassifierDefinition.SRC_PORT_RANGE_PARAM, pvSrcRange81_82);\r
+\r
+        thrown.expect(IllegalArgumentException.class);\r
+        thrown.expectMessage(L4Classifier.EXC_MSG_MUT_EXCLUSIVE_PARAMS);\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_RangeInverted() throws IllegalArgumentException {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        params.put(L4ClassifierDefinition.SRC_PORT_PARAM, pvSrcPort80);\r
+        params.put(L4ClassifierDefinition.DST_PORT_RANGE_PARAM, pvDstRange82_81);\r
+\r
+        thrown.expect(IllegalArgumentException.class);\r
+        thrown.expectMessage(L4Classifier.EXC_MSG_RANGE_VALUE_MISMATCH);\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(params);\r
+    }\r
+\r
+    @Test\r
+    public void testCheckPresenceOfRequiredParams_emptyParams() {\r
+\r
+        Classifier.L4_CL.checkPresenceOfRequiredParams(new HashMap<String, ParameterValue>());\r
+    }\r
+\r
+    @Test\r
+    public void testGetParent() {\r
+        assertEquals(Classifier.L4_CL.getParent(), Classifier.IP_PROTO_CL);\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ParamDerivatorTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/ParamDerivatorTest.java
new file mode 100755 (executable)
index 0000000..5884bb4
--- /dev/null
@@ -0,0 +1,56 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.junit.Test;\r
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValue;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.policy.rev140421.subject.feature.instance.ParameterValueBuilder;\r
+\r
+public class ParamDerivatorTest {\r
+\r
+    private ParamDerivator derivator = ParamDerivator.ETHER_TYPE_DERIVATOR;\r
+\r
+    @Test\r
+    public void testDeriveParameter_noDerivation() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE).build();\r
+        params.put(EtherTypeClassifierDefinition.ETHERTYPE_PARAM, pv);\r
+\r
+        List<Map<String, ParameterValue>> result = derivator.deriveParameter(params);\r
+\r
+        assertEquals(1, result.size());\r
+        assertEquals(params, result.get(0));\r
+    }\r
+\r
+    @Test\r
+    public void testDeriveParameter_withDerivation() {\r
+        Map<String, ParameterValue> params = new HashMap<>();\r
+        ParameterValue pv = new ParameterValueBuilder().setIntValue(EtherTypeClassifierDefinition.IPv4_VALUE).build();\r
+        params.put("dummy key", pv);\r
+\r
+        List<Map<String, ParameterValue>> derivedParams = derivator.deriveParameter(params);\r
+\r
+        assertEquals(2, derivedParams.size());\r
+\r
+        Map<String, ParameterValue> ipv4Params = derivedParams.get(0);\r
+        Map<String, ParameterValue> ipv6Params = derivedParams.get(1);\r
+\r
+        assertTrue(ipv4Params.containsKey(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));\r
+        assertTrue(ipv6Params.containsKey(EtherTypeClassifierDefinition.ETHERTYPE_PARAM));\r
+    }\r
+\r
+}\r
diff --git a/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/SubjectFeaturesTest.java b/renderers/iovisor/src/test/java/org/opendaylight/groupbasedpolicy/renderer/iovisor/sf/SubjectFeaturesTest.java
new file mode 100755 (executable)
index 0000000..743ca9e
--- /dev/null
@@ -0,0 +1,41 @@
+/*\r
+ * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.groupbasedpolicy.renderer.iovisor.sf;\r
+\r
+import static junit.framework.Assert.assertEquals;\r
+import static org.junit.Assert.assertNotNull;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.groupbasedpolicy.api.sf.AllowActionDefinition;\r
+import org.opendaylight.groupbasedpolicy.api.sf.EtherTypeClassifierDefinition;\r
+import org.opendaylight.groupbasedpolicy.api.sf.IpProtoClassifierDefinition;\r
+import org.opendaylight.groupbasedpolicy.api.sf.L4ClassifierDefinition;\r
+\r
+public class SubjectFeaturesTest {\r
+\r
+    @Test\r
+    public void testGetClassifier() {\r
+        assertEquals(Classifier.ETHER_TYPE_CL, SubjectFeatures.getClassifier(EtherTypeClassifierDefinition.ID));\r
+        assertEquals(Classifier.IP_PROTO_CL, SubjectFeatures.getClassifier(IpProtoClassifierDefinition.ID));\r
+        assertEquals(Classifier.L4_CL, SubjectFeatures.getClassifier(L4ClassifierDefinition.ID));\r
+    }\r
+\r
+    @Test\r
+    public void testGetActions() {\r
+        assertNotNull(SubjectFeatures.getActions());\r
+    }\r
+\r
+    @Test\r
+    public void testGetAction() {\r
+        Assert.assertEquals(AllowActionDefinition.DEFINITION,\r
+                SubjectFeatures.getAction(AllowActionDefinition.ID).getActionDef());\r
+    }\r
+\r
+}\r
index cedd261800fed2560bc6415ebb3ff4e4f1f66e64..1a39df73bc34ce54a0b16ee5e75f7c6406102da0 100644 (file)
@@ -25,6 +25,7 @@
     <module>iovisor</module>
     <module>ovssfc</module>
     <module>netconf</module>
+    <module>vpp</module>
   </modules>
 
   <dependencies>
diff --git a/renderers/vpp/pom.xml b/renderers/vpp/pom.xml
new file mode 100644 (file)
index 0000000..0da97aa
--- /dev/null
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved.
+  This program and the accompanying materials are made available under the
+  terms of the Eclipse Public License v1.0 which accompanies this distribution,
+  and is available at http://www.eclipse.org/legal/epl-v10.html -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.opendaylight.groupbasedpolicy</groupId>
+    <artifactId>groupbasedpolicy-renderers</artifactId>
+    <version>0.4.0-SNAPSHOT</version>
+    <relativePath>../</relativePath>
+  </parent>
+
+  <artifactId>vpp-renderer</artifactId>
+  <packaging>bundle</packaging>
+
+  <properties></properties>
+
+  <dependencies>
+    <!-- project specific dependencies -->
+
+    <!-- testing dependencies -->
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-all</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <!-- project build -->
+  <build>
+    <!-- We use the maven-resources-plugin to copy a class from the groupbasepolicy
+      bundle that we need in order to run some unit tests in the renderer (classes
+      in the test directory aren't packaged in bundles, and instead of keeping
+      separate copies, we just copy the file(s) needed in order to run the test). -->
+    <plugins>
+      <plugin>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>maven-bundle-plugin</artifactId>
+        <extensions>true</extensions>
+        <configuration>
+          <instructions>
+            <Export-Package>
+              org.opendaylight.yang.gen.v1.urn.opendaylight.groupbasedpolicy.vpp.input.rev160425.*
+            </Export-Package> -->
+          </instructions>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>
diff --git a/renderers/vpp/src/main/config/default-config.xml b/renderers/vpp/src/main/config/default-config.xml
new file mode 100644 (file)
index 0000000..baff11b
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<snapshot>
+    <configuration>
+        <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+            <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+                <module>
+                    <name>vpp-provider-impl</name>
+                    <type xmlns:vpp="urn:opendaylight:params:xml:ns:yang:controller:config:vpp-provider:impl">
+                        vpp:vpp-provider-impl
+                    </type>
+                    <data-broker>
+                      <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-async-data-broker</type>
+                      <name>binding-data-broker</name>
+                    </data-broker>
+                </module>
+            </modules>
+        </data>
+    </configuration>
+    <required-capabilities>
+        <capability>urn:opendaylight:params:xml:ns:yang:controller:config:vpp-provider:impl?module=vpp-provider-impl&amp;revision=2016-04-25</capability>
+    </required-capabilities>
+</snapshot>
diff --git a/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModule.java b/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModule.java
new file mode 100644 (file)
index 0000000..3d2f7d0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VppProviderModule extends org.opendaylight.controller.config.yang.config.vpp_provider.impl.AbstractVppProviderModule {
+
+    private static final Logger LOG = LoggerFactory.getLogger(VppProviderModule.class);
+
+    public VppProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
+        super(identifier, dependencyResolver);
+    }
+
+    public VppProviderModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.controller.config.yang.config.vpp_provider.impl.VppProviderModule oldModule, java.lang.AutoCloseable oldInstance) {
+        super(identifier, dependencyResolver, oldModule, oldInstance);
+    }
+
+    @Override
+    public void customValidation() {
+        // add custom validation form module attributes here.
+    }
+
+    @Override
+    public java.lang.AutoCloseable createInstance() {
+        final VppRenderer vppRenderer = new VppRenderer(getDataBrokerDependency());
+
+        LOG.info("VPP Renderer instance has been created");
+
+        return new AutoCloseable() {
+
+            @Override
+            public void close() throws Exception {
+                vppRenderer.close();
+            }
+        };
+    }
+
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModuleFactory.java b/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppProviderModuleFactory.java
new file mode 100644 (file)
index 0000000..3e4028c
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+/*
+* Generated file
+*
+* Generated from: yang module name: vpp-provider-impl yang module local name: vpp-provider-impl
+* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
+* Generated at: Thu May 05 09:46:48 CEST 2016
+*
+* Do not modify this file unless it is present under src/main directory
+*/
+package org.opendaylight.controller.config.yang.config.vpp_provider.impl;
+public class VppProviderModuleFactory extends org.opendaylight.controller.config.yang.config.vpp_provider.impl.AbstractVppProviderModuleFactory {
+
+}
diff --git a/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java b/renderers/vpp/src/main/java/org/opendaylight/controller/config/yang/config/vpp_provider/impl/VppRenderer.java
new file mode 100644 (file)
index 0000000..f3885f2
--- /dev/null
@@ -0,0 +1,34 @@
+/*\r
+ * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.controller.config.yang.config.vpp_provider.impl;\r
+\r
+import com.google.common.base.Preconditions;\r
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
+import org.slf4j.Logger;\r
+import org.slf4j.LoggerFactory;\r
+\r
+public class VppRenderer implements AutoCloseable {\r
+    private static final Logger LOG = LoggerFactory.getLogger(VppRenderer.class);\r
+\r
+    private DataBroker dataBroker;\r
+\r
+    public VppRenderer(DataBroker dataBroker) {\r
+        Preconditions.checkNotNull(dataBroker);\r
+\r
+        this.dataBroker = dataBroker;\r
+\r
+        LOG.info("VPP Renderer has Started");\r
+    }\r
+\r
+    @Override\r
+    public void close() throws Exception {\r
+        this.dataBroker = null;\r
+    }\r
+\r
+}\r
diff --git a/renderers/vpp/src/main/yang/vpp-provider-impl.yang b/renderers/vpp/src/main/yang/vpp-provider-impl.yang
new file mode 100644 (file)
index 0000000..b70d8c9
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+module vpp-provider-impl {
+    yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:controller:config:vpp-provider:impl";
+    prefix "vpp-provider-impl";
+
+    import config { prefix config; revision-date 2013-04-05; }
+    import opendaylight-md-sal-binding { prefix mdsal; revision-date 2013-10-28; }
+    import ietf-yang-types { prefix "yang"; revision-date 2010-09-24; }
+    import opendaylight-sal-binding-broker-impl { prefix sal-broker; revision-date 2013-10-28;}
+    import groupbasedpolicy-cfg { prefix gbpcfg; revision-date 2015-11-06; }
+
+    description
+        "This module contains the base YANG definitions for
+          vpp-provider impl implementation.";
+
+    revision "2016-04-25" {
+        description
+            "Initial revision.";
+    }
+
+    identity vpp-provider-impl {
+        base "config:module-type";
+
+        config:java-name-prefix VppProvider;
+    }
+
+    // Augments the 'configuration' choice node under modules/module.
+    augment "/config:modules/config:module/config:configuration" {
+        case vpp-provider-impl {
+            when "/config:modules/config:module/config:type = 'vpp-provider-impl'";
+
+            // Wires in the data-broker service
+            container data-broker {
+                uses config:service-ref {
+                    refine type {
+                        mandatory true;
+                        config:required-identity mdsal:binding-async-data-broker;
+                    }
+                }
+            }
+        }
+    }
+}