External api proposal
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / ModelDrivenSwitchImplTest.java
index 1494186f2dba2d962509d27cd5c3d012e6992088..16f8c88c1e5577b433376b6ff1101ab38512b129 100644 (file)
@@ -9,10 +9,12 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal;
 
 import java.math.BigInteger;
+import java.util.ArrayList;
 import java.util.Collections;
+import java.util.List;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -21,30 +23,122 @@ import org.mockito.Matchers;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.runners.MockitoJUnitRunner;
-import org.opendaylight.controller.sal.common.util.Futures;
 import org.opendaylight.controller.sal.common.util.Rpcs;
-import org.opendaylight.openflowplugin.openflow.md.OFConstants;
-import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;
-import org.opendaylight.openflowplugin.openflow.md.core.SwitchConnectionDistinguisher;
-import org.opendaylight.openflowplugin.openflow.md.core.session.IMessageDispatchService;
+import org.opendaylight.openflowplugin.api.OFConstants;
+import org.opendaylight.openflowplugin.api.openflow.md.core.ConnectionConductor;
+import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;
+import org.opendaylight.openflowplugin.api.openflow.md.core.session.IMessageDispatchService;
+import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionContext;
+import org.opendaylight.openflowplugin.api.statistics.MessageSpy;
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
-import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;
-import org.opendaylight.openflowplugin.openflow.md.core.session.TransactionKey;
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.OriginalFlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.flow.update.UpdatedFlowBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowStatisticsFromFlowTableOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.GetFlowStatisticsFromFlowTableOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.PortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.Port;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.PortKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.queue.rev130925.QueueId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowCookie;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.UpdateGroupOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetAllGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupFeaturesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.AddMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.RemoveMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.UpdateMeterOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.meter.update.UpdatedMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterConfigStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetAllMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterFeaturesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.GetMeterStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.FlowModInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortModInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.UpdatePortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.port.update.UpdatedPortBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetAllNodeConnectorsStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.GetNodeConnectorStatisticsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromAllPortsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetAllQueuesStatisticsFromGivenPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.GetQueueStatisticsFromGivenPortOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.UpdateTableOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTable;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.table.update.UpdatedTableBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeaturesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.TablePropertiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeatureProperties;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeaturePropertiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties.TableFeaturePropertiesKey;
+import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.MoreExecutors;
 
 /**
  * simple NPE smoke test
@@ -63,9 +157,8 @@ public class ModelDrivenSwitchImplTest {
     private IMessageDispatchService messageDispatchService;
     @Mock
     private GetFeaturesOutput features;
-
-    public static Cache<TransactionKey, Object> bulkTransactionCache = CacheBuilder.newBuilder()
-            .expireAfterWrite(10000, TimeUnit.MILLISECONDS).concurrencyLevel(1).build();
+    @Mock
+    private MessageSpy<DataContainer> messageSpy;
 
     /**
      * @throws java.lang.Exception
@@ -77,10 +170,11 @@ public class ModelDrivenSwitchImplTest {
         Mockito.when(conductor.getVersion()).thenReturn(OFConstants.OFP_VERSION_1_0)
                 .thenReturn(OFConstants.OFP_VERSION_1_3);
         Mockito.when(context.getFeatures()).thenReturn(features);
-        Mockito.when(context.getbulkTransactionCache()).thenReturn(bulkTransactionCache);
         Mockito.when(features.getDatapathId()).thenReturn(BigInteger.valueOf(1));
         
-        OFSessionUtil.getSessionManager().setRpcPool(Executors.newFixedThreadPool(10));
+        OFSessionUtil.getSessionManager().setRpcPool(MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10)));
+        OFSessionUtil.getSessionManager().setMessageSpy(messageSpy);
+        OpenflowPortsUtil.init();
 
         mdSwitchOF10 = new ModelDrivenSwitchImpl(null, null, context);
         mdSwitchOF13 = new ModelDrivenSwitchImpl(null, null, context);
@@ -90,9 +184,11 @@ public class ModelDrivenSwitchImplTest {
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#addFlow(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.AddFlowInput)}
      * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
      */
     @Test
-    public void testAddFlow() {
+    public void testAddFlow() throws InterruptedException, ExecutionException {
         UpdateFlowOutputBuilder updateFlowOutput = new UpdateFlowOutputBuilder();
         updateFlowOutput.setTransactionId(new TransactionId(new BigInteger("42")));
         Set<RpcError> errorSet = Collections.emptySet();
@@ -102,19 +198,26 @@ public class ModelDrivenSwitchImplTest {
                         Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
 
         AddFlowInputBuilder input = new AddFlowInputBuilder();
-        input.setMatch(new MatchBuilder().build());
+        input.setMatch(createMatch());
 
-        mdSwitchOF10.addFlow(input.build());
-        mdSwitchOF13.addFlow(input.build());
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.addFlow(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.addFlow(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).flowMod(
+                Matchers.any(FlowModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
     }
 
     /**
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#removeFlow(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.RemoveFlowInput)}
      * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
      */
     @Test
-    public void testRemoveFlow() {
+    public void testRemoveFlow() throws InterruptedException, ExecutionException {
         UpdateFlowOutputBuilder updateFlowOutput = new UpdateFlowOutputBuilder();
         updateFlowOutput.setTransactionId(new TransactionId(new BigInteger("42")));
         Set<RpcError> errorSet = Collections.emptySet();
@@ -124,19 +227,27 @@ public class ModelDrivenSwitchImplTest {
                         Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
 
         RemoveFlowInputBuilder input = new RemoveFlowInputBuilder();
-        input.setMatch(new MatchBuilder().build());
+        input.setMatch(createMatch());
 
-        mdSwitchOF10.removeFlow(input.build());
-        mdSwitchOF13.removeFlow(input.build());
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.removeFlow(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.removeFlow(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).flowMod(
+                Matchers.any(FlowModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+        
     }
 
     /**
      * Test method for
      * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#updateFlow(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.service.rev130819.UpdateFlowInput)}
      * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
      */
     @Test
-    public void testUpdateFlow() {
+    public void testUpdateFlow() throws InterruptedException, ExecutionException {
         UpdateFlowOutputBuilder updateFlowOutput = new UpdateFlowOutputBuilder();
         updateFlowOutput.setTransactionId(new TransactionId(new BigInteger("42")));
         Set<RpcError> errorSet = Collections.emptySet();
@@ -147,10 +258,909 @@ public class ModelDrivenSwitchImplTest {
 
         UpdateFlowInputBuilder input = new UpdateFlowInputBuilder();
         UpdatedFlowBuilder updatedFlow = new UpdatedFlowBuilder();
-        updatedFlow.setMatch(new MatchBuilder().build());
+        updatedFlow.setBarrier(false);
+        updatedFlow.setMatch(createMatch());
+        updatedFlow.setPriority(65);
+        updatedFlow.setFlags(new FlowModFlags(true, false, true, false, true));
         input.setUpdatedFlow(updatedFlow.build());
+        OriginalFlowBuilder originalFlowBuilder = new OriginalFlowBuilder();
+        originalFlowBuilder.setMatch(createMatch());
+        originalFlowBuilder.setPriority(65);
+        originalFlowBuilder.setFlags(new FlowModFlags(true, false, true, false, true));
+        input.setOriginalFlow(originalFlowBuilder.build());
+        
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.updateFlow(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.updateFlow(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).flowMod(
+                Matchers.any(FlowModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * addGroup(org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.
+     * AddGroupInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testAddGroup() throws InterruptedException, ExecutionException {
+        UpdateGroupOutputBuilder updateGroupOutput = new UpdateGroupOutputBuilder();
+        updateGroupOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateGroupOutput> result = Rpcs.getRpcResult(true, updateGroupOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.groupMod(Matchers.any(GroupModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        AddGroupInputBuilder input = new AddGroupInputBuilder();
+        input.setGroupType(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupFf);
+        input.setGroupId(new GroupId(789L));
+
+        mdSwitchOF10.addGroup(input.build()).get();
+        mdSwitchOF13.addGroup(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).groupMod(
+                Matchers.any(GroupModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * updateGroup(org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.
+     * UpdateGroupInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testUpdateGroup() throws InterruptedException, ExecutionException {
+        UpdateGroupOutputBuilder updateGroupOutput = new UpdateGroupOutputBuilder();
+        updateGroupOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateGroupOutput> result = Rpcs.getRpcResult(true, updateGroupOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.groupMod(Matchers.any(GroupModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        UpdateGroupInputBuilder input = new UpdateGroupInputBuilder();
+        UpdatedGroupBuilder updatedGroupBuilder = new UpdatedGroupBuilder();
+        updatedGroupBuilder.setGroupId(new GroupId(789L));
+        updatedGroupBuilder.setGroupType(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupFf);
+        input.setUpdatedGroup(updatedGroupBuilder.build());
+
+        mdSwitchOF10.updateGroup(input.build()).get();
+        mdSwitchOF13.updateGroup(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).groupMod(
+                Matchers.any(GroupModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * removeGroup(org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.
+     * RemoveGroupInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testRemoveGroup() throws InterruptedException, ExecutionException {
+        UpdateGroupOutputBuilder updateGroupOutput = new UpdateGroupOutputBuilder();
+        updateGroupOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateGroupOutput> result = Rpcs.getRpcResult(true, updateGroupOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.groupMod(Matchers.any(GroupModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        RemoveGroupInputBuilder input = new RemoveGroupInputBuilder();
+        input.setGroupId(new GroupId(789L));
+        input.setGroupType(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes.GroupFf);
+
+        mdSwitchOF10.removeGroup(input.build()).get();
+        mdSwitchOF13.removeGroup(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).groupMod(
+                Matchers.any(GroupModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * addMeter(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.
+     * AddMeterInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testAddMeter() throws InterruptedException, ExecutionException {
+        UpdateMeterOutputBuilder updateMeterOutput = new UpdateMeterOutputBuilder();
+        updateMeterOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateMeterOutput> result = Rpcs.getRpcResult(true, updateMeterOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.meterMod(Matchers.any(MeterModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        AddMeterInputBuilder input = new AddMeterInputBuilder();
+        input.setMeterId(new MeterId(78L));
+
+        mdSwitchOF10.addMeter(input.build()).get();
+        mdSwitchOF13.addMeter(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).meterMod(
+                Matchers.any(MeterModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * updateMeter(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.
+     * UpdateMeterInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testUpdtateMeter() throws InterruptedException, ExecutionException {
+        UpdateMeterOutputBuilder updateMeterOutput = new UpdateMeterOutputBuilder();
+        updateMeterOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateMeterOutput> result = Rpcs.getRpcResult(true, updateMeterOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.meterMod(Matchers.any(MeterModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        UpdateMeterInputBuilder input = new UpdateMeterInputBuilder();
+        UpdatedMeterBuilder updatedMeterBuilder = new UpdatedMeterBuilder();
+        updatedMeterBuilder.setMeterId(new MeterId(89L));
+        updatedMeterBuilder.setBarrier(false);
+        input.setUpdatedMeter(updatedMeterBuilder.build());
+
+        mdSwitchOF10.updateMeter(input.build()).get();
+        mdSwitchOF13.updateMeter(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).meterMod(
+                Matchers.any(MeterModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * removeMeter(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.service.rev130918.
+     * RemoveMeterInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testRemoveMeter() throws InterruptedException, ExecutionException {
+        UpdateMeterOutputBuilder updateMeterOutput = new UpdateMeterOutputBuilder();
+        updateMeterOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdateMeterOutput> result = Rpcs.getRpcResult(true, updateMeterOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.meterMod(Matchers.any(MeterModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        RemoveMeterInputBuilder input = new RemoveMeterInputBuilder();
+        input.setMeterId(new MeterId(89L));
+        
+        mdSwitchOF10.removeMeter(input.build()).get();
+        mdSwitchOF13.removeMeter(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).meterMod(
+                Matchers.any(MeterModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllGroupStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
+     * GetAllGroupStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllGroupStatistics() throws InterruptedException, ExecutionException {
+        GetAllGroupStatisticsOutputBuilder getAllGroupStatistcsOutput = new GetAllGroupStatisticsOutputBuilder();
+        getAllGroupStatistcsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllGroupStatisticsInputBuilder input = new GetAllGroupStatisticsInputBuilder();
+
+        mdSwitchOF10.getAllGroupStatistics(input.build()).get();
+        mdSwitchOF13.getAllGroupStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getGroupDescription(org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
+     * GetGroupDescriptionInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetGroupDescription() throws InterruptedException, ExecutionException {
+        GetGroupDescriptionOutputBuilder getGroupDescOutput = new GetGroupDescriptionOutputBuilder();
+        getGroupDescOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
 
-        mdSwitchOF10.updateFlow(input.build());
-        mdSwitchOF13.updateFlow(input.build());
+        GetGroupDescriptionInputBuilder input = new GetGroupDescriptionInputBuilder();
+
+        mdSwitchOF10.getGroupDescription(input.build()).get();
+        mdSwitchOF13.getGroupDescription(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getGroupFeatures(org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
+     * GetGroupFeaturesInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetGroupFeatures() throws InterruptedException, ExecutionException {
+        GetGroupFeaturesOutputBuilder getGroupFeaturesOutput = new GetGroupFeaturesOutputBuilder();
+        getGroupFeaturesOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetGroupFeaturesInputBuilder input = new GetGroupFeaturesInputBuilder();
+
+        mdSwitchOF10.getGroupFeatures(input.build()).get();
+        mdSwitchOF13.getGroupFeatures(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getGroupStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.
+     * GetGroupStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    //TODO GetGroupStatistics why NPE?
+    @Test
+    public void testGetGroupStatistics() throws InterruptedException, ExecutionException {
+        GetGroupStatisticsOutputBuilder getGroupStatsOutput = new GetGroupStatisticsOutputBuilder();
+        getGroupStatsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetGroupStatisticsInputBuilder input = new GetGroupStatisticsInputBuilder();
+        input.setGroupId(new GroupId(42L));
+
+        mdSwitchOF10.getGroupStatistics(input.build()).get();
+        mdSwitchOF13.getGroupStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllMeterConfigStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
+     * GetAllMeterConfigStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllMeterConfigStatistics() throws InterruptedException, ExecutionException {
+        GetAllMeterConfigStatisticsOutputBuilder getAllMeterConfigStatsOutput = 
+                new GetAllMeterConfigStatisticsOutputBuilder();
+        getAllMeterConfigStatsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllMeterConfigStatisticsInputBuilder input = new GetAllMeterConfigStatisticsInputBuilder();
+
+        mdSwitchOF10.getAllMeterConfigStatistics(input.build()).get();
+        mdSwitchOF13.getAllMeterConfigStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllMeterStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
+     * GetAllMeterStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllMeterStatistics() throws InterruptedException, ExecutionException {
+        GetAllMeterStatisticsOutputBuilder getAllMeterStatisticsOutput = 
+                new GetAllMeterStatisticsOutputBuilder();
+        getAllMeterStatisticsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllMeterStatisticsInputBuilder input = new GetAllMeterStatisticsInputBuilder();
+
+        mdSwitchOF10.getAllMeterStatistics(input.build()).get();
+        mdSwitchOF13.getAllMeterStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getMeterFeatures(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
+     * GetMeterFeaturesInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetMeterFeatures() throws InterruptedException, ExecutionException {
+        GetMeterFeaturesOutputBuilder getMeterFeaturesOutput = 
+                new GetMeterFeaturesOutputBuilder();
+        getMeterFeaturesOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetMeterFeaturesInputBuilder input = new GetMeterFeaturesInputBuilder();
+
+        mdSwitchOF10.getMeterFeatures(input.build()).get();
+        mdSwitchOF13.getMeterFeatures(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getMeterStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.
+     * GetMeterStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetMeterStatistics() throws InterruptedException, ExecutionException {
+        GetMeterStatisticsOutputBuilder getMeterStatsOutput = new GetMeterStatisticsOutputBuilder();
+        getMeterStatsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetMeterStatisticsInputBuilder input = new GetMeterStatisticsInputBuilder();
+        input.setMeterId(new MeterId(42L));
+
+        mdSwitchOF10.getMeterStatistics(input.build()).get();
+        mdSwitchOF13.getMeterStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllNodeConnectorsStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.
+     * GetAllNodeConnectorsStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllNodeConnectorsStatistics() throws InterruptedException, ExecutionException {
+        GetAllNodeConnectorsStatisticsOutputBuilder getAllNodeConnectorsStatsOutput = 
+                new GetAllNodeConnectorsStatisticsOutputBuilder();
+        getAllNodeConnectorsStatsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllNodeConnectorsStatisticsInputBuilder input = new GetAllNodeConnectorsStatisticsInputBuilder();
+
+        mdSwitchOF10.getAllNodeConnectorsStatistics(input.build()).get();
+        mdSwitchOF13.getAllNodeConnectorsStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getNodeConnectorStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.
+     * GetNodeConnectorStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetNodeConnectorStatistics() throws InterruptedException, ExecutionException {
+        GetNodeConnectorStatisticsOutputBuilder getNodeConnectorStatsOutput = 
+                new GetNodeConnectorStatisticsOutputBuilder();
+        getNodeConnectorStatsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetNodeConnectorStatisticsInputBuilder input = new GetNodeConnectorStatisticsInputBuilder();
+        input.setNodeConnectorId(new NodeConnectorId("openflow:12:8"));
+        
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.getNodeConnectorStatistics(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.getNodeConnectorStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * updatePort(org.opendaylight.yang.gen.v1.urn.opendaylight.port.service.rev131107.
+     * UpdatePortInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testUpdatePort() throws InterruptedException, ExecutionException {
+        UpdatePortOutputBuilder updatePortOutput = new UpdatePortOutputBuilder();
+        updatePortOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<UpdatePortOutput> result = Rpcs.getRpcResult(true, updatePortOutput.build(), errorSet);
+        Mockito.when(
+                messageDispatchService.portMod(Matchers.any(PortModInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        UpdatePortInputBuilder input = new UpdatePortInputBuilder();
+        
+        PortBuilder portBuilder = new PortBuilder();
+        List<Port> ports = new ArrayList<Port>();
+        ports.add(createPort()); 
+        portBuilder.setPort(ports);
+        UpdatedPortBuilder updatedPortBuilder = new UpdatedPortBuilder();
+        updatedPortBuilder.setPort(portBuilder.build());
+        input.setUpdatedPort(updatedPortBuilder.build());
+
+        mdSwitchOF10.updatePort(input.build()).get();
+        mdSwitchOF13.updatePort(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).portMod(
+                Matchers.any(PortModInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    private static Port createPort() {
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.PortBuilder port = 
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.port.mod.port.PortBuilder();
+        
+        port.setPortName("TestingPort01");
+        port.setMask(new PortConfig(true, true, true, true));
+        port.setConfiguration(new PortConfig(true, true, true, true));
+        port.setAdvertisedFeatures(new PortFeatures(true, true, true, true, 
+                                                    false, false, false, false, 
+                                                    true, true, true, true,
+                                                    false, false, false, false));
+        port.setPortNumber(new PortNumberUni(42L));
+        port.setHardwareAddress(new MacAddress("01:23:45:67:89:ab"));
+        port.setBarrier(true);
+        port.setContainerName("TestContainer");
+        port.setPortModOrder(25L);
+        port.setKey(new PortKey(25L));
+        return port.build();
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * updateTable(org.opendaylight.yang.gen.v1.urn.opendaylight.table.service.rev131026.
+     * UpdateTableInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testUpdateTable() throws InterruptedException, ExecutionException {
+        UpdateTableOutputBuilder updateTableOutput = new UpdateTableOutputBuilder();
+        updateTableOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        UpdateTableInputBuilder input = new UpdateTableInputBuilder();
+        input.setUpdatedTable(createUpdateTable());
+
+        mdSwitchOF10.updateTable(input.build()).get();
+        mdSwitchOF13.updateTable(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    private static UpdatedTable createUpdateTable() {
+        UpdatedTableBuilder updatedTableBuilder = new UpdatedTableBuilder();
+        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
+        tableFeaturesBuilder.setConfig(new TableConfig(true));
+        tableFeaturesBuilder.setKey(new TableFeaturesKey((short) 42));
+        tableFeaturesBuilder.setMaxEntries(42L);
+        tableFeaturesBuilder.setMetadataMatch(new BigInteger("42424242"));
+        tableFeaturesBuilder.setMetadataWrite(new BigInteger("42424242"));
+        tableFeaturesBuilder.setName("testTableFeatures");
+        tableFeaturesBuilder.setTableId((short) 41);
+        
+        TablePropertiesBuilder tablePropertiesBuilder = new TablePropertiesBuilder();
+        TableFeaturePropertiesBuilder tableFeaturePropertiesBuilder = new TableFeaturePropertiesBuilder();
+        tableFeaturePropertiesBuilder.setKey(new TableFeaturePropertiesKey(45));
+        tableFeaturePropertiesBuilder.setOrder(44);
+        tableFeaturePropertiesBuilder.setTableFeaturePropType(new ApplySetfieldBuilder().build());
+        List<TableFeatureProperties> tableFeatureProperties = new ArrayList<TableFeatureProperties>();
+        tableFeatureProperties.add(tableFeaturePropertiesBuilder.build());
+        tablePropertiesBuilder.setTableFeatureProperties(tableFeatureProperties);
+        
+        tableFeaturesBuilder.setTableProperties(tablePropertiesBuilder.build());
+        List<TableFeatures> tableFeatures = new ArrayList<TableFeatures>();
+        tableFeatures.add(tableFeaturesBuilder.build());
+        updatedTableBuilder.setTableFeatures(tableFeatures);
+        return updatedTableBuilder.build();
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllFlowStatisticsFromFlowTable(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.
+     * GetAllFlowStatisticsFromFlowTableInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllFlowStatisticsFromFlowTable() throws InterruptedException, ExecutionException {
+        GetAllFlowStatisticsFromFlowTableOutputBuilder allFlowStatisticsFromFlowTableOutput = 
+                new GetAllFlowStatisticsFromFlowTableOutputBuilder();
+        allFlowStatisticsFromFlowTableOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllFlowStatisticsFromFlowTableInputBuilder input = new GetAllFlowStatisticsFromFlowTableInputBuilder();
+        input.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId((short) 42));
+
+        mdSwitchOF10.getAllFlowStatisticsFromFlowTable(input.build()).get();
+        mdSwitchOF13.getAllFlowStatisticsFromFlowTable(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllFlowStatisticsFromFlowTable(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.
+     * GetAllFlowStatisticsFromFlowTableInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllFlowsStatisticsFromAllFlowTables() throws InterruptedException, ExecutionException {
+        GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder allFlowStatisticsFromAllFlowTablesOutput = 
+                new GetAllFlowsStatisticsFromAllFlowTablesOutputBuilder();
+        allFlowStatisticsFromAllFlowTablesOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllFlowsStatisticsFromAllFlowTablesInputBuilder input = 
+                                    new GetAllFlowsStatisticsFromAllFlowTablesInputBuilder();
+
+        mdSwitchOF10.getAllFlowsStatisticsFromAllFlowTables(input.build()).get();
+        mdSwitchOF13.getAllFlowsStatisticsFromAllFlowTables(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllFlowStatisticsFromFlowTable(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.
+     * GetAllFlowStatisticsFromFlowTableInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetFlowStatisticsFromFlowTables() throws InterruptedException, ExecutionException {
+        GetFlowStatisticsFromFlowTableOutputBuilder flowStatisticsFromFlowTablesOutput = 
+                new GetFlowStatisticsFromFlowTableOutputBuilder();
+        flowStatisticsFromFlowTablesOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetFlowStatisticsFromFlowTableInputBuilder input = 
+                                    new GetFlowStatisticsFromFlowTableInputBuilder();
+        input.setMatch(createMatch()); 
+
+        mdSwitchOF10.getFlowStatisticsFromFlowTable(input.build()).get();
+        mdSwitchOF13.getFlowStatisticsFromFlowTable(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    private static Match createMatch() {
+        MatchBuilder matchBuilder = new MatchBuilder(); 
+        EthernetMatchBuilder ethernetMatchBuilder = new EthernetMatchBuilder();
+        EthernetDestinationBuilder ethernetDestinationBuilder = new EthernetDestinationBuilder();
+        ethernetDestinationBuilder.setAddress(new MacAddress("01:23:45:67:89:ab"));
+        ethernetDestinationBuilder.setMask(new MacAddress("01:23:45:67:89:ab"));
+        ethernetMatchBuilder.setEthernetDestination(ethernetDestinationBuilder.build()); 
+        EthernetSourceBuilder ethernetSourceBuilder = new EthernetSourceBuilder();
+        ethernetSourceBuilder.setAddress(new MacAddress("01:23:45:67:89:ab"));
+        ethernetSourceBuilder.setMask(new MacAddress("01:23:45:67:89:ab"));
+        ethernetMatchBuilder.setEthernetSource(ethernetSourceBuilder.build()); 
+        ethernetMatchBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType(42L)).build()); 
+        matchBuilder.setEthernetMatch(ethernetMatchBuilder.build());
+        return matchBuilder.build();
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAggregateFlowStatisticsFromFlowTableForAllFlows(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.
+     * GetAggregateFlowStatisticsFromFlowTableForAllFlowsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAggregateFlowStatisticsFromFlowTableForAllFlows() throws InterruptedException, 
+                                                                                ExecutionException {
+        GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder aggregateFlowStatisticsOutput = 
+                new GetAggregateFlowStatisticsFromFlowTableForAllFlowsOutputBuilder();
+        aggregateFlowStatisticsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder input = 
+                           new GetAggregateFlowStatisticsFromFlowTableForAllFlowsInputBuilder();
+        input.setTableId(new org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId((short) 42));
+
+        mdSwitchOF10.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build()).get();
+        mdSwitchOF13.getAggregateFlowStatisticsFromFlowTableForAllFlows(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAggregateFlowStatisticsFromFlowTableForGivenMatch(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.
+     * GetAggregateFlowStatisticsFromFlowTableForGivenMatchInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAggregateFlowStatisticsFromFlowTableForGivenMatch() throws InterruptedException, 
+                                                                                ExecutionException {
+        GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder aggregateFlowStatisticsForMatchOutput = 
+                new GetAggregateFlowStatisticsFromFlowTableForGivenMatchOutputBuilder();
+        aggregateFlowStatisticsForMatchOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder input = 
+                           new GetAggregateFlowStatisticsFromFlowTableForGivenMatchInputBuilder();
+        input.setMatch(createMatch());
+        input.setCookie(new FlowCookie(new BigInteger("123456")));
+        input.setCookieMask(new FlowCookie(new BigInteger("123456")));
+        input.setOutGroup(44L);
+        input.setOutPort(new BigInteger("12563"));
+
+        mdSwitchOF10.getAggregateFlowStatisticsFromFlowTableForGivenMatch(input.build()).get();
+        mdSwitchOF13.getAggregateFlowStatisticsFromFlowTableForGivenMatch(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getFlowTablesStatistics(org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.
+     * GetFlowTablesStatisticsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetFlowTablesStatistics() throws InterruptedException, ExecutionException {
+        GetFlowTablesStatisticsOutputBuilder flowTableStatisticsOutput = 
+                new GetFlowTablesStatisticsOutputBuilder();
+        flowTableStatisticsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetFlowTablesStatisticsInputBuilder input = new GetFlowTablesStatisticsInputBuilder();
+
+        mdSwitchOF10.getFlowTablesStatistics(input.build()).get();
+        mdSwitchOF13.getFlowTablesStatistics(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllQueuesStatisticsFromAllPorts(org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.
+     * GetAllQueuesStatisticsFromAllPortsInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllQueuesStatisticsFromAllPorts() throws InterruptedException, ExecutionException {
+        GetAllQueuesStatisticsFromAllPortsOutputBuilder allQueuesStatisticsAllPortsOutput = 
+                new GetAllQueuesStatisticsFromAllPortsOutputBuilder();
+        allQueuesStatisticsAllPortsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllQueuesStatisticsFromAllPortsInputBuilder input = 
+                new GetAllQueuesStatisticsFromAllPortsInputBuilder();
+
+        mdSwitchOF10.getAllQueuesStatisticsFromAllPorts(input.build()).get();
+        mdSwitchOF13.getAllQueuesStatisticsFromAllPorts(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getAllQueuesStatisticsFromGivenPort(org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.
+     * GetAllQueuesStatisticsFromGivenPortInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetAllQueuesStatisticsFromGivenPort() throws InterruptedException, ExecutionException {
+        GetAllQueuesStatisticsFromGivenPortOutputBuilder allQueuesStatisticsGivenPortsOutput = 
+                new GetAllQueuesStatisticsFromGivenPortOutputBuilder();
+        allQueuesStatisticsGivenPortsOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetAllQueuesStatisticsFromGivenPortInputBuilder input = 
+                new GetAllQueuesStatisticsFromGivenPortInputBuilder();
+        input.setNodeConnectorId(new NodeConnectorId("openflow:12:8"));
+        
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.getAllQueuesStatisticsFromGivenPort(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.getAllQueuesStatisticsFromGivenPort(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
+    }
+    
+    /**
+     * Test method for
+     * {@link org.opendaylight.openflowplugin.openflow.md.core.sal.ModelDrivenSwitchImpl#
+     * getQueueStatisticsFromGivenPort(org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.
+     * GetQueueStatisticsFromGivenPortInput)}
+     * .
+     * @throws ExecutionException 
+     * @throws InterruptedException 
+     */
+    @Test
+    public void testGetQueueStatisticsFromGivenPort() throws InterruptedException, ExecutionException {
+        GetQueueStatisticsFromGivenPortOutputBuilder queuesStatisticsGivenPortOutput = 
+                new GetQueueStatisticsFromGivenPortOutputBuilder();
+        queuesStatisticsGivenPortOutput.setTransactionId(new TransactionId(new BigInteger("42")));
+        Set<RpcError> errorSet = Collections.emptySet();
+        RpcResult<Void> result = Rpcs.getRpcResult(true, null, errorSet);
+        Mockito.when(
+                messageDispatchService.multipartRequest(Matchers.any(MultipartRequestInput.class),
+                        Matchers.any(SwitchConnectionDistinguisher.class))).thenReturn(Futures.immediateFuture(result));
+
+        GetQueueStatisticsFromGivenPortInputBuilder input = 
+                new GetQueueStatisticsFromGivenPortInputBuilder();
+        input.setNodeConnectorId(new NodeConnectorId("openflow:12:8"));
+        input.setQueueId(new QueueId(55L));
+        
+        Mockito.when(features.getVersion()).thenReturn((short)1);
+        mdSwitchOF10.getQueueStatisticsFromGivenPort(input.build()).get();
+        Mockito.when(features.getVersion()).thenReturn((short)4);
+        mdSwitchOF13.getQueueStatisticsFromGivenPort(input.build()).get();
+        Mockito.verify(messageDispatchService, Mockito.times(2)).multipartRequest(
+                Matchers.any(MultipartRequestInput.class),
+                Matchers.any(SwitchConnectionDistinguisher.class));
     }
 }