Bug 1254 - Added unit tests 05/11405/1
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Fri, 19 Sep 2014 15:23:25 +0000 (17:23 +0200)
committerMichal Polkorab <michal.polkorab@pantheon.sk>
Sat, 20 Sep 2014 18:54:28 +0000 (20:54 +0200)
 - + fixed MultipartReplyTranslator#getGroupActionsSupportBitmap()

Change-Id: Ie05f26b366da6e2edaf5ca6392b80ce81c018734
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertorTest.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest2.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest3.java [new file with mode: 0644]

index 12ae74a489d5b24d5b3e17978640606a742b990c..69674a31b46a701441638379cfaba673255d5092 100644 (file)
@@ -470,23 +470,22 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
         List<Long> supportActionByGroups = new ArrayList<Long>();
         for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType supportedActions : actionsSupported){
             long supportActionBitmap = 0;
-            supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): ~(1 << 0);
-            supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): ~(1 << 11);
-            supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): ~(1 << 12);
-            supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): ~(1 << 15);
-            supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): ~(1 << 16);
-            supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 16): ~(1 << 16);
-            supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 17): ~(1 << 17);
-            supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 18): ~(1 << 18);
-            supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 19): ~(1 << 19);
-            supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 20): ~(1 << 20);
-            supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 21): ~(1 << 21);
-            supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 22): ~(1 << 22);
-            supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 23): ~(1 << 23);
-            supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 24): ~(1 << 24);
-            supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 25): ~(1 << 25);
-            supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 26): ~(1 << 26);
-            supportActionBitmap |= supportedActions.isOFPATEXPERIMENTER()?(1 << 27): ~(1 << 27);
+            supportActionBitmap |= supportedActions.isOFPATOUTPUT()?(1 << 0): 0;
+            supportActionBitmap |= supportedActions.isOFPATCOPYTTLOUT()?(1 << 11): 0;
+            supportActionBitmap |= supportedActions.isOFPATCOPYTTLIN()?(1 << 12): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETMPLSTTL()?(1 << 15): 0;
+            supportActionBitmap |= supportedActions.isOFPATDECMPLSTTL()?(1 << 16): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHVLAN()?(1 << 17): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPVLAN()?(1 << 18): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHMPLS()?(1 << 19): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPMPLS()?(1 << 20): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETQUEUE()?(1 << 21): 0;
+            supportActionBitmap |= supportedActions.isOFPATGROUP()?(1 << 22): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETNWTTL()?(1 << 23): 0;
+            supportActionBitmap |= supportedActions.isOFPATDECNWTTL()?(1 << 24): 0;
+            supportActionBitmap |= supportedActions.isOFPATSETFIELD()?(1 << 25): 0;
+            supportActionBitmap |= supportedActions.isOFPATPUSHPBB()?(1 << 26): 0;
+            supportActionBitmap |= supportedActions.isOFPATPOPPBB()?(1 << 27): 0;
             supportActionByGroups.add(Long.valueOf(supportActionBitmap));
         }
         return supportActionByGroups;
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java
new file mode 100644 (file)
index 0000000..df7a135
--- /dev/null
@@ -0,0 +1,172 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.sal.convertor;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStatsBuilder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class GroupStatsResponseConvertorTest {\r
+\r
+    GroupStatsResponseConvertor convertor =  new GroupStatsResponseConvertor();\r
+\r
+    /**\r
+     * Test empty GroupStats conversion\r
+     */\r
+    @Test\r
+    public void testEmptyGroupStats() {\r
+        List<GroupStats> groupStats = new ArrayList<>();\r
+\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+\r
+        Assert.assertEquals("Wrong group stats size", 0, salGroupStats.size());\r
+    }\r
+\r
+    /**\r
+     * Test single GroupStat conversion\r
+     */\r
+    @Test\r
+    public void testSingleGroupStat() {\r
+        List<GroupStats> groupStats = new ArrayList<>();\r
+        GroupStatsBuilder statsBuilder = new GroupStatsBuilder();\r
+        statsBuilder.setByteCount(new BigInteger("12345"));\r
+        statsBuilder.setDurationNsec(1000000L);\r
+        statsBuilder.setDurationSec(5000L);\r
+        statsBuilder.setGroupId(new GroupId(42L));\r
+        statsBuilder.setPacketCount(new BigInteger("54321"));\r
+        statsBuilder.setRefCount(24L);\r
+        statsBuilder.setBucketStats(new ArrayList<BucketStats>());\r
+        groupStats.add(statsBuilder.build());\r
+\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+\r
+        Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats stat = salGroupStats.get(0);\r
+        Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 12345, stat.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 5000, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 1000000, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket stats", 0, stat.getBuckets().getBucketCounter().size());\r
+    }\r
+\r
+    /**\r
+     * Test two GroupStats conversion\r
+     */\r
+    @Test\r
+    public void testTwoGroupStats() {\r
+        List<GroupStats> groupStats = new ArrayList<>();\r
+        GroupStatsBuilder statsBuilder = new GroupStatsBuilder();\r
+        statsBuilder.setByteCount(new BigInteger("12345"));\r
+        statsBuilder.setDurationNsec(1000000L);\r
+        statsBuilder.setDurationSec(5000L);\r
+        statsBuilder.setGroupId(new GroupId(42L));\r
+        statsBuilder.setPacketCount(new BigInteger("54321"));\r
+        statsBuilder.setRefCount(24L);\r
+        statsBuilder.setBucketStats(new ArrayList<BucketStats>());\r
+        groupStats.add(statsBuilder.build());\r
+        statsBuilder = new GroupStatsBuilder();\r
+        statsBuilder.setByteCount(new BigInteger("1"));\r
+        statsBuilder.setDurationNsec(2L);\r
+        statsBuilder.setDurationSec(3L);\r
+        statsBuilder.setGroupId(new GroupId(4L));\r
+        statsBuilder.setPacketCount(new BigInteger("5"));\r
+        statsBuilder.setRefCount(6L);\r
+        statsBuilder.setBucketStats(new ArrayList<BucketStats>());\r
+        groupStats.add(statsBuilder.build());\r
+\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+\r
+        Assert.assertEquals("Wrong group stats size", 2, salGroupStats.size());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats stat = salGroupStats.get(0);\r
+        Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 12345, stat.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 5000, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 1000000, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket stats", 0, stat.getBuckets().getBucketCounter().size());\r
+        stat = salGroupStats.get(1);\r
+        Assert.assertEquals("Wrong group-id", 4, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong key", 4, stat.getKey().getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong ref-count", 6, stat.getRefCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 5, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 1, stat.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 3, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 2, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket stats", 0, stat.getBuckets().getBucketCounter().size());\r
+    }\r
+\r
+    /**\r
+     * Test GroupStats with buckets conversion\r
+     */\r
+    @Test\r
+    public void testGroupStatsWithBuckets() {\r
+        List<GroupStats> groupStats = new ArrayList<>();\r
+        GroupStatsBuilder statsBuilder = new GroupStatsBuilder();\r
+        statsBuilder.setByteCount(new BigInteger("12345"));\r
+        statsBuilder.setDurationNsec(1000000L);\r
+        statsBuilder.setDurationSec(5000L);\r
+        statsBuilder.setGroupId(new GroupId(42L));\r
+        statsBuilder.setPacketCount(new BigInteger("54321"));\r
+        statsBuilder.setRefCount(24L);\r
+        List<BucketStats> bucketStats = new ArrayList<>();\r
+        BucketStatsBuilder bucketStatsBuilder = new BucketStatsBuilder();\r
+        bucketStatsBuilder.setByteCount(new BigInteger("987"));\r
+        bucketStatsBuilder.setPacketCount(new BigInteger("654"));\r
+        bucketStats.add(bucketStatsBuilder.build());\r
+        bucketStatsBuilder = new BucketStatsBuilder();\r
+        bucketStatsBuilder.setByteCount(new BigInteger("123"));\r
+        bucketStatsBuilder.setPacketCount(new BigInteger("456"));\r
+        bucketStats.add(bucketStatsBuilder.build());\r
+        statsBuilder.setBucketStats(bucketStats);\r
+        groupStats.add(statsBuilder.build());\r
+\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+\r
+        Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+        .GroupStats stat = salGroupStats.get(0);\r
+        Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 12345, stat.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 5000, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 1000000, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket stats", 2, stat.getBuckets().getBucketCounter().size());\r
+        List<BucketCounter> list = stat.getBuckets().getBucketCounter();\r
+        Assert.assertEquals("Wrong bucket-id", 0, list.get(0).getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket packet count", 654, list.get(0).getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket byte count", 987, list.get(0).getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket-id", 1, list.get(1).getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket packet count", 456, list.get(1).getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong bucket byte count", 123, list.get(1).getByteCount().getValue().intValue());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java
new file mode 100644 (file)
index 0000000..fec246d
--- /dev/null
@@ -0,0 +1,181 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.sal.convertor;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsListBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDescBuilder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class GroupStatsResponseConvertorTest2 {\r
+\r
+    GroupStatsResponseConvertor convertor =  new GroupStatsResponseConvertor();\r
+\r
+    /**\r
+     * Test empty GroupDescStats conversion\r
+     */\r
+    @Test\r
+    public void test() {\r
+        List<GroupDesc> groupDescStats = new ArrayList<>();\r
+\r
+        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
+\r
+        Assert.assertEquals("Wrong groupDesc stats size", 0, statsList.size());\r
+    }\r
+\r
+    /**\r
+     * Test single GroupDescStat conversion without buckets\r
+     */\r
+    @Test\r
+    public void testSingleGroupDescStat() {\r
+        List<GroupDesc> groupDescStats = new ArrayList<>();\r
+        GroupDescBuilder builder = new GroupDescBuilder();\r
+        builder.setType(GroupType.OFPGTALL);\r
+        builder.setGroupId(new GroupId(42L));\r
+        builder.setBucketsList(new ArrayList<BucketsList>());\r
+        groupDescStats.add(builder.build());\r
+\r
+        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
+\r
+        Assert.assertEquals("Wrong groupDesc stats size", 1, statsList.size());\r
+        GroupDescStats stat = statsList.get(0);\r
+        Assert.assertEquals("Wrong type", GroupTypes.GroupAll, stat.getGroupType());\r
+        Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong buckets size", 0, stat.getBuckets().getBucket().size());\r
+    }\r
+\r
+    /**\r
+     * Test single GroupDescStats conversion\r
+     */\r
+    @Test\r
+    public void testGroupDescStats() {\r
+        List<GroupDesc> groupDescStats = new ArrayList<>();\r
+        GroupDescBuilder builder = new GroupDescBuilder();\r
+        builder.setType(GroupType.OFPGTFF);\r
+        builder.setGroupId(new GroupId(42L));\r
+        List<BucketsList> bucketsList = new ArrayList<>();\r
+        BucketsListBuilder bucketsBuilder = new BucketsListBuilder();\r
+        bucketsBuilder.setWeight(16);\r
+        bucketsBuilder.setWatchPort(new PortNumber(84L));\r
+        bucketsBuilder.setWatchGroup(168L);\r
+        List<Action> actions = new ArrayList<>();\r
+        ActionBuilder actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(CopyTtlIn.class);\r
+        actions.add(actionBuilder.build());\r
+        bucketsBuilder.setAction(actions);\r
+        bucketsList.add(bucketsBuilder.build());\r
+        builder.setBucketsList(bucketsList);\r
+        groupDescStats.add(builder.build());\r
+        builder = new GroupDescBuilder();\r
+        builder.setType(GroupType.OFPGTINDIRECT);\r
+        builder.setGroupId(new GroupId(50L));\r
+        bucketsList = new ArrayList<>();\r
+        bucketsBuilder = new BucketsListBuilder();\r
+        bucketsBuilder.setWeight(100);\r
+        bucketsBuilder.setWatchPort(new PortNumber(200L));\r
+        bucketsBuilder.setWatchGroup(400L);\r
+        actions = new ArrayList<>();\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(CopyTtlOut.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(DecNwTtl.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(PopPbb.class);\r
+        actions.add(actionBuilder.build());\r
+        bucketsBuilder.setAction(actions);\r
+        bucketsList.add(bucketsBuilder.build());\r
+        bucketsBuilder = new BucketsListBuilder();\r
+        bucketsBuilder.setWeight(5);\r
+        bucketsBuilder.setWatchPort(new PortNumber(10L));\r
+        bucketsBuilder.setWatchGroup(15L);\r
+        actions = new ArrayList<>();\r
+        bucketsBuilder.setAction(actions);\r
+        bucketsList.add(bucketsBuilder.build());\r
+        builder.setBucketsList(bucketsList);\r
+        groupDescStats.add(builder.build());\r
+\r
+        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
+\r
+        Assert.assertEquals("Wrong groupDesc stats size", 2, statsList.size());\r
+        GroupDescStats stat = statsList.get(0);\r
+        Assert.assertEquals("Wrong type", GroupTypes.GroupFf, stat.getGroupType());\r
+        Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong buckets size", 1, stat.getBuckets().getBucket().size());\r
+        Bucket bucket = stat.getBuckets().getBucket().get(0);\r
+        Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 16, bucket.getWeight().intValue());\r
+        Assert.assertEquals("Wrong type", 168, bucket.getWatchGroup().intValue());\r
+        Assert.assertEquals("Wrong type", 84, bucket.getWatchPort().intValue());\r
+        Assert.assertEquals("Wrong type", 1, bucket.getAction().size());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list\r
+        .Action action = bucket.getAction().get(0);\r
+        Assert.assertEquals("Wrong type", 0, action.getOrder().intValue());\r
+        Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
+                + ".action.action.CopyTtlInCase", action.getAction().getImplementedInterface().getName());\r
+\r
+        stat = statsList.get(1);\r
+        Assert.assertEquals("Wrong type", GroupTypes.GroupIndirect, stat.getGroupType());\r
+        Assert.assertEquals("Wrong group-id", 50, stat.getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong key", 50, stat.getKey().getGroupId().getValue().intValue());\r
+        Assert.assertEquals("Wrong buckets size", 2, stat.getBuckets().getBucket().size());\r
+        bucket = stat.getBuckets().getBucket().get(0);\r
+        Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 100, bucket.getWeight().intValue());\r
+        Assert.assertEquals("Wrong type", 400, bucket.getWatchGroup().intValue());\r
+        Assert.assertEquals("Wrong type", 200, bucket.getWatchPort().intValue());\r
+        Assert.assertEquals("Wrong type", 3, bucket.getAction().size());\r
+        action = bucket.getAction().get(0);\r
+        Assert.assertEquals("Wrong type", 0, action.getOrder().intValue());\r
+        Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
+                + ".action.action.CopyTtlOutCase", action.getAction().getImplementedInterface().getName());\r
+        action = bucket.getAction().get(1);\r
+        Assert.assertEquals("Wrong type", 1, action.getOrder().intValue());\r
+        Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
+                + ".action.action.DecNwTtlCase", action.getAction().getImplementedInterface().getName());\r
+        action = bucket.getAction().get(2);\r
+        Assert.assertEquals("Wrong type", 2, action.getOrder().intValue());\r
+        Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
+                + ".action.action.PopPbbActionCase", action.getAction().getImplementedInterface().getName());\r
+        bucket = stat.getBuckets().getBucket().get(1);\r
+        Assert.assertEquals("Wrong type", 1, bucket.getKey().getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 1, bucket.getBucketId().getValue().intValue());\r
+        Assert.assertEquals("Wrong type", 5, bucket.getWeight().intValue());\r
+        Assert.assertEquals("Wrong type", 15, bucket.getWatchGroup().intValue());\r
+        Assert.assertEquals("Wrong type", 10, bucket.getWatchPort().intValue());\r
+        Assert.assertEquals("Wrong type", 0, bucket.getAction().size());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/TableFeaturesReplyConvertorTest.java
new file mode 100644 (file)
index 0000000..64d0daf
--- /dev/null
@@ -0,0 +1,573 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.sal.convertor;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Test;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeatureProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ActionRelatedTableFeaturePropertyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.InstructionRelatedTableFeatureProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.InstructionRelatedTableFeaturePropertyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NextTableRelatedTableFeatureProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NextTableRelatedTableFeaturePropertyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmRelatedTableFeatureProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmRelatedTableFeaturePropertyBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.table.features.properties.container.table.feature.properties.NextTableIds;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.table.features.properties.container.table.feature.properties.NextTableIdsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ApplyActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.ClearActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.GotoTable;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.Meter;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteActions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.WriteMetadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.InstructionBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeaturesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features.TableFeaturesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeatureProperties;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.table.features.properties.grouping.TableFeaturePropertiesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfield;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldMiss;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Instructions;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.InstructionsMiss;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTable;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTableMiss;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Wildcards;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfield;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfieldMiss;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.TableFeatures;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class TableFeaturesReplyConvertorTest {\r
+\r
+    /**\r
+     * Incorrect / empty input test\r
+     */\r
+    @Test\r
+    public void test() {\r
+        List<TableFeatures> list = TableFeaturesReplyConvertor.toTableFeaturesReply(null);\r
+        Assert.assertEquals("Returned list is not empty", 0, list.size());\r
+    }\r
+\r
+    /**\r
+     * Incorrect / empty input test\r
+     */\r
+    @Test\r
+    public void test2() {\r
+        MultipartReplyTableFeaturesBuilder builder = new MultipartReplyTableFeaturesBuilder();\r
+        List<TableFeatures> list = TableFeaturesReplyConvertor.toTableFeaturesReply(builder.build());\r
+        Assert.assertEquals("Returned list is not empty", 0, list.size());\r
+    }\r
+\r
+    /**\r
+     * Test correct input - without table properties\r
+     */\r
+    @Test\r
+    public void testWithMPTableFeature() {\r
+        MultipartReplyTableFeaturesBuilder builder = new MultipartReplyTableFeaturesBuilder();\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart\r
+        .reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features\r
+        .TableFeatures> features = new ArrayList<>();\r
+        TableFeaturesBuilder featuresBuilder = new TableFeaturesBuilder();\r
+        featuresBuilder.setTableId((short) 5);\r
+        featuresBuilder.setName("Aloha");\r
+        byte[] metaMatch = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};\r
+        featuresBuilder.setMetadataMatch(metaMatch);\r
+        byte[] metaWrite = new byte[]{8, 9, 10, 11, 12, 13, 14, 15};\r
+        featuresBuilder.setMetadataWrite(metaWrite);\r
+        featuresBuilder.setConfig(new TableConfig(false));\r
+        featuresBuilder.setMaxEntries(42L);\r
+        features.add(featuresBuilder.build());\r
+        builder.setTableFeatures(features);\r
+        List<TableFeatures> list = TableFeaturesReplyConvertor.toTableFeaturesReply(builder.build());\r
+        Assert.assertEquals("Returned empty list", 1, list.size());\r
+        TableFeatures feature = list.get(0);\r
+        Assert.assertEquals("Wrong table-id", 5, feature.getTableId().intValue());\r
+        Assert.assertEquals("Wrong name", "Aloha", feature.getName());\r
+        Assert.assertEquals("Wrong metadata match", new BigInteger(1, metaMatch), feature.getMetadataMatch());\r
+        Assert.assertEquals("Wrong metadata write", new BigInteger(1, metaWrite), feature.getMetadataWrite());\r
+        Assert.assertEquals("Wrong config", false, feature.getConfig().isDEPRECATEDMASK());\r
+        Assert.assertEquals("Wrong max-entries", 42, feature.getMaxEntries().intValue());\r
+        Assert.assertEquals("Wrong properties", 0, feature.getTableProperties().getTableFeatureProperties().size());\r
+    }\r
+\r
+    /**\r
+     * Test correct input\r
+     */\r
+    @Test\r
+    public void testWithMPTableFeatureWithProperties() {\r
+        MultipartReplyTableFeaturesBuilder builder = new MultipartReplyTableFeaturesBuilder();\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart\r
+        .reply.multipart.reply.body.multipart.reply.table.features._case.multipart.reply.table.features\r
+        .TableFeatures> features = new ArrayList<>();\r
+        TableFeaturesBuilder featuresBuilder = new TableFeaturesBuilder();\r
+        featuresBuilder.setTableId((short) 5);\r
+        featuresBuilder.setName("Aloha");\r
+        byte[] metaMatch = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};\r
+        featuresBuilder.setMetadataMatch(metaMatch);\r
+        byte[] metaWrite = new byte[]{8, 9, 10, 11, 12, 13, 14, 15};\r
+        featuresBuilder.setMetadataWrite(metaWrite);\r
+        featuresBuilder.setConfig(new TableConfig(false));\r
+        featuresBuilder.setMaxEntries(42L);\r
+        List<TableFeatureProperties> properties = new ArrayList<>();\r
+        TableFeaturePropertiesBuilder propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTNEXTTABLES);\r
+        NextTableRelatedTableFeaturePropertyBuilder nextPropBuilder =\r
+                new NextTableRelatedTableFeaturePropertyBuilder();\r
+        List<NextTableIds> nextIds = new ArrayList<>();\r
+        nextIds.add(new NextTableIdsBuilder().setTableId((short) 1).build());\r
+        nextIds.add(new NextTableIdsBuilder().setTableId((short) 2).build());\r
+        nextPropBuilder.setNextTableIds(nextIds);\r
+        propBuilder.addAugmentation(NextTableRelatedTableFeatureProperty.class, nextPropBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTNEXTTABLESMISS);\r
+        nextPropBuilder = new NextTableRelatedTableFeaturePropertyBuilder();\r
+        nextIds = new ArrayList<>();\r
+        nextIds.add(new NextTableIdsBuilder().setTableId((short) 3).build());\r
+        nextPropBuilder.setNextTableIds(nextIds);\r
+        propBuilder.addAugmentation(NextTableRelatedTableFeatureProperty.class, nextPropBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTINSTRUCTIONS);\r
+        InstructionRelatedTableFeaturePropertyBuilder insPropBuilder =\r
+                new InstructionRelatedTableFeaturePropertyBuilder();\r
+        List<Instruction> insIds = new ArrayList<>();\r
+        InstructionBuilder insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(WriteActions.class);\r
+        insIds.add(insBuilder.build());\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(GotoTable.class);\r
+        insIds.add(insBuilder.build());\r
+        insPropBuilder.setInstruction(insIds);\r
+        propBuilder.addAugmentation(InstructionRelatedTableFeatureProperty.class, insPropBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTINSTRUCTIONSMISS);\r
+        insPropBuilder = new InstructionRelatedTableFeaturePropertyBuilder();\r
+        insIds = new ArrayList<>();\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(WriteMetadata.class);\r
+        insIds.add(insBuilder.build());\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(ApplyActions.class);\r
+        insIds.add(insBuilder.build());\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(Meter.class);\r
+        insIds.add(insBuilder.build());\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(ClearActions.class);\r
+        insIds.add(insBuilder.build());\r
+        insBuilder = new InstructionBuilder();\r
+        insBuilder.setType(GotoTable.class);\r
+        insIds.add(insBuilder.build());\r
+        insPropBuilder.setInstruction(insIds);\r
+        propBuilder.addAugmentation(InstructionRelatedTableFeatureProperty.class, insPropBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        featuresBuilder.setTableFeatureProperties(properties);\r
+        features.add(featuresBuilder.build());\r
+        featuresBuilder = new TableFeaturesBuilder();\r
+        featuresBuilder.setTableId((short) 6);\r
+        featuresBuilder.setName("Mahalo");\r
+        byte[] metaMatch2 = new byte[]{8, 9, 10, 11, 12, 13, 14, 15};\r
+        featuresBuilder.setMetadataMatch(metaMatch2);\r
+        byte[] metaWrite2 = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};\r
+        featuresBuilder.setMetadataWrite(metaWrite2);\r
+        featuresBuilder.setConfig(new TableConfig(false));\r
+        featuresBuilder.setMaxEntries(24L);\r
+        properties = new ArrayList<>();\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTMATCH);\r
+        OxmRelatedTableFeaturePropertyBuilder oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(InPhyPort.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(InPort.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYSETFIELD);\r
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        entries = new ArrayList<>();\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(IpProto.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(IpEcn.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITESETFIELD);\r
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        entries = new ArrayList<>();\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(VlanVid.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITESETFIELDMISS);\r
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        entries = new ArrayList<>();\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(VlanPcp.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(TcpSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYSETFIELDMISS);\r
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        entries = new ArrayList<>();\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(UdpSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(UdpDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWILDCARDS);\r
+        oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
+        entries = new ArrayList<>();\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        entries.add(entriesBuilder.build());\r
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYACTIONS);\r
+        ActionRelatedTableFeaturePropertyBuilder actBuilder = new ActionRelatedTableFeaturePropertyBuilder();\r
+        List<Action> actions = new ArrayList<>();\r
+        ActionBuilder actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(Output.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(PopPbb.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(SetNwTtl.class);\r
+        actions.add(actionBuilder.build());\r
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYACTIONSMISS);\r
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();\r
+        actions = new ArrayList<>();\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(Group.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(CopyTtlIn.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(CopyTtlOut.class);\r
+        actions.add(actionBuilder.build());\r
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITEACTIONS);\r
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();\r
+        actions = new ArrayList<>();\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(SetMplsTtl.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(DecMplsTtl.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(PushVlan.class);\r
+        actions.add(actionBuilder.build());\r
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITEACTIONSMISS);\r
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();\r
+        actions = new ArrayList<>();\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(PopVlan.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(PushPbb.class);\r
+        actions.add(actionBuilder.build());\r
+        actionBuilder = new ActionBuilder();\r
+        actionBuilder.setType(SetField.class);\r
+        actions.add(actionBuilder.build());\r
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        featuresBuilder.setTableFeatureProperties(properties);\r
+        features.add(featuresBuilder.build());\r
+        builder.setTableFeatures(features);\r
+\r
+        List<TableFeatures> list = TableFeaturesReplyConvertor.toTableFeaturesReply(builder.build());\r
+\r
+        Assert.assertEquals("Returned empty list", 2, list.size());\r
+        TableFeatures feature = list.get(0);\r
+        Assert.assertEquals("Wrong table-id", 5, feature.getTableId().intValue());\r
+        Assert.assertEquals("Wrong name", "Aloha", feature.getName());\r
+        Assert.assertEquals("Wrong metadata match", new BigInteger(1, metaMatch), feature.getMetadataMatch());\r
+        Assert.assertEquals("Wrong metadata write", new BigInteger(1, metaWrite), feature.getMetadataWrite());\r
+        Assert.assertEquals("Wrong config", false, feature.getConfig().isDEPRECATEDMASK());\r
+        Assert.assertEquals("Wrong max-entries", 42, feature.getMaxEntries().intValue());\r
+        Assert.assertEquals("Wrong properties", 4, feature.getTableProperties().getTableFeatureProperties().size());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.features.table.features.table.properties\r
+        .TableFeatureProperties property = feature.getTableProperties().getTableFeatureProperties().get(0);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTable",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        NextTable propType = (NextTable) property.getTableFeaturePropType();\r
+        List<Short> ids = propType.getTables().getTableIds();\r
+        Assert.assertEquals("Wrong next table-id size", 2, ids.size());\r
+        Assert.assertEquals("Wrong next-registry-id", 1, ids.get(0).intValue());\r
+        Assert.assertEquals("Wrong next-registry-id", 2, ids.get(1).intValue());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(1);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.NextTableMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        NextTableMiss propType2 = (NextTableMiss) property.getTableFeaturePropType();\r
+        ids = propType2.getTablesMiss().getTableIds();\r
+        Assert.assertEquals("Wrong next table-id size", 1, ids.size());\r
+        Assert.assertEquals("Wrong next-registry-id", 3, ids.get(0).intValue());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(2);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Instructions",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        Instructions propType3 = (Instructions) property.getTableFeaturePropType();\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list\r
+        .Instruction> instructionIds = propType3.getInstructions().getInstruction();\r
+        Assert.assertEquals("Wrong instruction-ids size", 2, instructionIds.size());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteActionsCase",\r
+                instructionIds.get(0).getInstruction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCase",\r
+                instructionIds.get(1).getInstruction().getImplementedInterface().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(3);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.InstructionsMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        InstructionsMiss propType4 = (InstructionsMiss) property.getTableFeaturePropType();\r
+        instructionIds = propType4.getInstructionsMiss().getInstruction();\r
+        Assert.assertEquals("Wrong instruction-ids size", 5, instructionIds.size());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCase",\r
+                instructionIds.get(0).getInstruction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase",\r
+                instructionIds.get(1).getInstruction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.MeterCase",\r
+                instructionIds.get(2).getInstruction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ClearActionsCase",\r
+                instructionIds.get(3).getInstruction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong instruction-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCase",\r
+                instructionIds.get(4).getInstruction().getImplementedInterface().getName());\r
+        feature = list.get(1);\r
+        Assert.assertEquals("Wrong table-id", 6, feature.getTableId().intValue());\r
+        Assert.assertEquals("Wrong name", "Mahalo", feature.getName());\r
+        Assert.assertEquals("Wrong metadata match", new BigInteger(1, metaMatch2), feature.getMetadataMatch());\r
+        Assert.assertEquals("Wrong metadata write", new BigInteger(1, metaWrite2), feature.getMetadataWrite());\r
+        Assert.assertEquals("Wrong config", false, feature.getConfig().isDEPRECATEDMASK());\r
+        Assert.assertEquals("Wrong max-entries", 24, feature.getMaxEntries().intValue());\r
+        Assert.assertEquals("Wrong properties", 10, feature.getTableProperties().getTableFeatureProperties().size());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(0);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        Match propType5 = (Match) property.getTableFeaturePropType();\r
+        List<SetFieldMatch> fieldMatch = propType5.getMatchSetfield().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPhyPort",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(1);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfield",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        ApplySetfield propType6 = (ApplySetfield) property.getTableFeaturePropType();\r
+        fieldMatch = propType6.getApplySetfield().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpEcn",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(2);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfield",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        WriteSetfield propType7 = (WriteSetfield) property.getTableFeaturePropType();\r
+        fieldMatch = propType7.getWriteSetfield().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Exthdr",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(3);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteSetfieldMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        WriteSetfieldMiss propType8 = (WriteSetfieldMiss) property.getTableFeaturePropType();\r
+        fieldMatch = propType8.getWriteSetfieldMiss().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(4);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplySetfieldMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        ApplySetfieldMiss propType9 = (ApplySetfieldMiss) property.getTableFeaturePropType();\r
+        fieldMatch = propType9.getApplySetfieldMiss().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(5);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Wildcards",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        Wildcards propType10 = (Wildcards) property.getTableFeaturePropType();\r
+        fieldMatch = propType10.getWildcardSetfield().getSetFieldMatch();\r
+        Assert.assertEquals("Wrong match-entry-ids size", 2, fieldMatch.size());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc",\r
+                fieldMatch.get(0).getMatchType().getName());\r
+        Assert.assertEquals("Wrong match-entry-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst",\r
+                fieldMatch.get(1).getMatchType().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(6);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActions",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+        .ApplyActions propType11 = (org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActions) property.getTableFeaturePropType();\r
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action> actionsList = propType11.getApplyActions().getAction();\r
+        Assert.assertEquals("Wrong actions-ids size", 3, actionsList.size());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase",\r
+                actionsList.get(0).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopPbbActionCase",\r
+                actionsList.get(1).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetNwTtlActionCase",\r
+                actionsList.get(2).getAction().getImplementedInterface().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(7);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.ApplyActionsMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+        .ApplyActionsMiss propType12 = (org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+                .ApplyActionsMiss) property.getTableFeaturePropType();\r
+        actionsList = propType12.getApplyActionsMiss().getAction();\r
+        Assert.assertEquals("Wrong actions-ids size", 3, actionsList.size());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.GroupActionCase",\r
+                actionsList.get(0).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCase",\r
+                actionsList.get(1).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlOutCase",\r
+                actionsList.get(2).getAction().getImplementedInterface().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(8);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActions",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+        .WriteActions propType13 = (org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+                .WriteActions) property.getTableFeaturePropType();\r
+        actionsList = propType13.getWriteActions().getAction();\r
+        Assert.assertEquals("Wrong actions-ids size", 3, actionsList.size());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetMplsTtlActionCase",\r
+                actionsList.get(0).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.DecMplsTtlCase",\r
+                actionsList.get(1).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase",\r
+                actionsList.get(2).getAction().getImplementedInterface().getName());\r
+        property = feature.getTableProperties().getTableFeatureProperties().get(9);\r
+        Assert.assertEquals("Wrong property type", "org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.WriteActionsMiss",\r
+                property.getTableFeaturePropType().getImplementedInterface().getName());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+        .WriteActionsMiss propType14 = (org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type\r
+                .WriteActionsMiss) property.getTableFeaturePropType();\r
+        actionsList = propType14.getWriteActionsMiss().getAction();\r
+        Assert.assertEquals("Wrong actions-ids size", 3, actionsList.size());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCase",\r
+                actionsList.get(0).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushPbbActionCase",\r
+                actionsList.get(1).getAction().getImplementedInterface().getName());\r
+        Assert.assertEquals("Wrong actions-id", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase",\r
+                actionsList.get(2).getAction().getImplementedInterface().getName());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest.java
new file mode 100644 (file)
index 0000000..7fd306b
--- /dev/null
@@ -0,0 +1,232 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.translator;\r
+\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;\r
+import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;\r
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.FlowsStatisticsUpdate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.flow.and.statistics.map.list.FlowAndStatisticsMapList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction.rev130731.instructions.grouping.Instruction;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyFlowCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlowBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.multipart.reply.flow.FlowStatsBuilder;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MultipartReplyTranslatorTest {\r
+\r
+    @Mock SwitchConnectionDistinguisher cookie;\r
+    @Mock SessionContext sc;\r
+    @Mock ConnectionConductor conductor;\r
+    @Mock GetFeaturesOutput features;\r
+\r
+    MultipartReplyTranslator translator = new MultipartReplyTranslator();\r
+\r
+    /**\r
+     * Initializes mocks\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        MockitoAnnotations.initMocks(this);\r
+        when(sc.getPrimaryConductor()).thenReturn(conductor);\r
+        when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);\r
+        when(sc.getFeatures()).thenReturn(features);\r
+        when(features.getDatapathId()).thenReturn(new BigInteger("42"));\r
+    }\r
+\r
+    /**\r
+     * Test with null and incorrect message\r
+     */\r
+    @Test\r
+    public void test() {\r
+        List<DataObject> list = translator.translate(cookie, sc, null);\r
+\r
+        Assert.assertEquals("Wrong list size", 0, list.size());\r
+        HelloMessageBuilder helloBuilder = new HelloMessageBuilder();\r
+        list = translator.translate(cookie, sc, helloBuilder.build());\r
+        Assert.assertEquals("Wrong list size", 0, list.size());\r
+    }\r
+\r
+    /**\r
+     * Test with experimenter MultipartReply message\r
+     */\r
+    @Test\r
+    public void testExperimenterCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPEXPERIMENTER);\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 0, list.size());\r
+    }\r
+\r
+    /**\r
+     * Test  MultipartReply message with empty flow stats\r
+     */\r
+    @Test\r
+    public void testEmptyFlowCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPFLOW);\r
+        \r
+        MultipartReplyFlowCaseBuilder caseBuilder = new MultipartReplyFlowCaseBuilder();\r
+        MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();\r
+        List<FlowStats> flowStats = new ArrayList<>();\r
+        flowBuilder.setFlowStats(flowStats);\r
+        caseBuilder.setMultipartReplyFlow(flowBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        FlowsStatisticsUpdate flowUpdate = (FlowsStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", flowUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, flowUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, flowUpdate.getTransactionId().getValue().intValue());\r
+        List<FlowAndStatisticsMapList> mapList = flowUpdate.getFlowAndStatisticsMapList();\r
+        Assert.assertEquals("Wrong flow stats size", 0, mapList.size());\r
+    }\r
+\r
+    /**\r
+     * Test with experimenter MultipartReply message\r
+     */\r
+    @Test\r
+    public void testFlowCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPFLOW);\r
+        \r
+        MultipartReplyFlowCaseBuilder caseBuilder = new MultipartReplyFlowCaseBuilder();\r
+        MultipartReplyFlowBuilder flowBuilder = new MultipartReplyFlowBuilder();\r
+        List<FlowStats> flowStats = new ArrayList<>();\r
+        FlowStatsBuilder statsBuilder = new FlowStatsBuilder();\r
+        statsBuilder.setTableId((short) 1);\r
+        statsBuilder.setDurationSec(2L);\r
+        statsBuilder.setDurationNsec(3L);\r
+        statsBuilder.setPriority(4);\r
+        statsBuilder.setIdleTimeout(5);\r
+        statsBuilder.setHardTimeout(6);\r
+        FlowModFlags flags = new FlowModFlags(true, false, true, false, true);\r
+        statsBuilder.setFlags(flags);\r
+        statsBuilder.setCookie(new BigInteger("7"));\r
+        statsBuilder.setPacketCount(new BigInteger("8"));\r
+        statsBuilder.setByteCount(new BigInteger("9"));\r
+        MatchBuilder matchBuilder = new MatchBuilder();\r
+        matchBuilder.setType(OxmMatchType.class);\r
+        matchBuilder.setMatchEntries(new ArrayList<MatchEntries>());\r
+        statsBuilder.setMatch(matchBuilder.build());\r
+        statsBuilder.setInstruction(new ArrayList<Instruction>());\r
+        flowStats.add(statsBuilder.build());\r
+        statsBuilder = new FlowStatsBuilder();\r
+        statsBuilder.setTableId((short) 10);\r
+        statsBuilder.setDurationSec(20L);\r
+        statsBuilder.setDurationNsec(30L);\r
+        statsBuilder.setPriority(40);\r
+        statsBuilder.setIdleTimeout(50);\r
+        statsBuilder.setHardTimeout(60);\r
+        flags = new FlowModFlags(false, true, false, true, false);\r
+        statsBuilder.setFlags(flags);\r
+        statsBuilder.setCookie(new BigInteger("70"));\r
+        statsBuilder.setPacketCount(new BigInteger("80"));\r
+        statsBuilder.setByteCount(new BigInteger("90"));\r
+        matchBuilder = new MatchBuilder();\r
+        matchBuilder.setType(OxmMatchType.class);\r
+        matchBuilder.setMatchEntries(new ArrayList<MatchEntries>());\r
+        statsBuilder.setMatch(matchBuilder.build());\r
+        statsBuilder.setInstruction(new ArrayList<Instruction>());\r
+        flowStats.add(statsBuilder.build());\r
+        flowBuilder.setFlowStats(flowStats);\r
+        caseBuilder.setMultipartReplyFlow(flowBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        FlowsStatisticsUpdate flowUpdate = (FlowsStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", flowUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, flowUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, flowUpdate.getTransactionId().getValue().intValue());\r
+        List<FlowAndStatisticsMapList> mapList = flowUpdate.getFlowAndStatisticsMapList();\r
+        Assert.assertEquals("Wrong flow stats size", 2, mapList.size());\r
+        FlowAndStatisticsMapList stat = mapList.get(0);\r
+        Assert.assertEquals("Wrong table-id", 1, stat.getTableId().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 2, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 3, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong priority", 4, stat.getPriority().intValue());\r
+        Assert.assertEquals("Wrong idle-timeout", 5, stat.getIdleTimeout().intValue());\r
+        Assert.assertEquals("Wrong hard-timeout", 6, stat.getHardTimeout().intValue());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.FlowModFlags expectedFlags = \r
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026\r
+                .FlowModFlags(!flags.isOFPFFCHECKOVERLAP(), !flags.isOFPFFNOBYTCOUNTS(), !flags.isOFPFFNOPKTCOUNTS(),\r
+                        !flags.isOFPFFRESETCOUNTS(), !flags.isOFPFFSENDFLOWREM());\r
+        Assert.assertEquals("Wrong flags", expectedFlags, stat.getFlags());\r
+        Assert.assertEquals("Wrong cookie", 7, stat.getCookie().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 8, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 9, stat.getByteCount().getValue().intValue());\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder emptyMatchBuilder = \r
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder();\r
+        Match emptyMatch = emptyMatchBuilder.build();\r
+        Assert.assertEquals("Wrong match", emptyMatch, stat.getMatch());\r
+        Assert.assertEquals("Wrong instructions", 0, stat.getInstructions().getInstruction().size());\r
+        stat = mapList.get(1);\r
+        Assert.assertEquals("Wrong table-id", 10, stat.getTableId().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 20, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 30, stat.getDuration().getNanosecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong priority", 40, stat.getPriority().intValue());\r
+        Assert.assertEquals("Wrong idle-timeout", 50, stat.getIdleTimeout().intValue());\r
+        Assert.assertEquals("Wrong hard-timeout", 60, stat.getHardTimeout().intValue());\r
+        expectedFlags = new org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026\r
+                .FlowModFlags(flags.isOFPFFCHECKOVERLAP(), flags.isOFPFFNOBYTCOUNTS(), flags.isOFPFFNOPKTCOUNTS(),\r
+                        flags.isOFPFFRESETCOUNTS(), flags.isOFPFFSENDFLOWREM());\r
+        Assert.assertEquals("Wrong flags", expectedFlags, stat.getFlags());\r
+        Assert.assertEquals("Wrong cookie", 70, stat.getCookie().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 80, stat.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 90, stat.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong match", emptyMatch, stat.getMatch());\r
+        Assert.assertEquals("Wrong instructions", 0, stat.getInstructions().getInstruction().size());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest2.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest2.java
new file mode 100644 (file)
index 0000000..627d119
--- /dev/null
@@ -0,0 +1,214 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.translator;\r
+\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;\r
+import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;\r
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.AggregateFlowStatisticsUpdate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupFeaturesUpdated;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdated;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ActionType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupCapabilities;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupTypes;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandTypeBitmap;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyGroupFeaturesCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyMeterFeaturesCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregateBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeaturesBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeaturesBuilder;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MultipartReplyTranslatorTest2 {\r
+\r
+    @Mock SwitchConnectionDistinguisher cookie;\r
+    @Mock SessionContext sc;\r
+    @Mock ConnectionConductor conductor;\r
+    @Mock GetFeaturesOutput features;\r
+\r
+    MultipartReplyTranslator translator = new MultipartReplyTranslator();\r
+\r
+    /**\r
+     * Initializes mocks\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        MockitoAnnotations.initMocks(this);\r
+        when(sc.getPrimaryConductor()).thenReturn(conductor);\r
+        when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);\r
+        when(sc.getFeatures()).thenReturn(features);\r
+        when(features.getDatapathId()).thenReturn(new BigInteger("42"));\r
+    }\r
+\r
+    /**\r
+     * Test  MultipartReply message with aggregate stat\r
+     */\r
+    @Test\r
+    public void testAggregateCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPAGGREGATE);\r
+        \r
+        MultipartReplyAggregateCaseBuilder caseBuilder = new MultipartReplyAggregateCaseBuilder();\r
+        MultipartReplyAggregateBuilder aggBuilder = new MultipartReplyAggregateBuilder();\r
+        aggBuilder.setByteCount(new BigInteger("52"));\r
+        aggBuilder.setFlowCount(6587L);\r
+        aggBuilder.setPacketCount(new BigInteger("25"));\r
+        caseBuilder.setMultipartReplyAggregate(aggBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        AggregateFlowStatisticsUpdate aggUpdate = (AggregateFlowStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", aggUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, aggUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, aggUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong byte count", 52, aggUpdate.getByteCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong packet count", 25, aggUpdate.getPacketCount().getValue().intValue());\r
+        Assert.assertEquals("Wrong flow count", 6587, aggUpdate.getFlowCount().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test  MultipartReply message with group features stat\r
+     */\r
+    @Test\r
+    public void testGroupFeaturesCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPGROUPFEATURES);\r
+        \r
+        MultipartReplyGroupFeaturesCaseBuilder caseBuilder = new MultipartReplyGroupFeaturesCaseBuilder();\r
+        MultipartReplyGroupFeaturesBuilder featBuilder = new MultipartReplyGroupFeaturesBuilder();\r
+        featBuilder.setTypes(new GroupTypes(true, false, true, false));\r
+        featBuilder.setCapabilities(new GroupCapabilities(false, true, false, true));\r
+        List<Long> maxGroups = new ArrayList<>();\r
+        maxGroups.add(1L);\r
+        maxGroups.add(2L);\r
+        maxGroups.add(3L);\r
+        maxGroups.add(4L);\r
+        featBuilder.setMaxGroups(maxGroups);\r
+        List<ActionType> actionTypes = new ArrayList<>();\r
+        ActionType actionType1 = new ActionType(true, false, true, false, false, false, true,\r
+                false, true, false, true, false, true, false, true, false, true);\r
+        actionTypes.add(actionType1);\r
+        ActionType actionType2 = new ActionType(false, true, false, true, false, true, false,\r
+                true, false, true, false, true, false, true, false, true, false);\r
+        actionTypes.add(actionType2);\r
+        ActionType actionType3 = new ActionType(false, false, false, false, false, false, false,\r
+                true, true, true, true, true, true, true, true, true, true);\r
+        actionTypes.add(actionType3);\r
+        ActionType actionType4 = new ActionType(true, true, true, true, true, true, true,\r
+                false, false, false, false, false, false, false, false, false, false);\r
+        actionTypes.add(actionType4);\r
+        featBuilder.setActionsBitmap(actionTypes);\r
+        caseBuilder.setMultipartReplyGroupFeatures(featBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        GroupFeaturesUpdated groupUpdate = (GroupFeaturesUpdated) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", groupUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, groupUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, groupUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong group types size", 2, groupUpdate.getGroupTypesSupported().size());\r
+        Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupAll",\r
+                groupUpdate.getGroupTypesSupported().get(0).getName());\r
+        Assert.assertEquals("Wrong group type", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupIndirect",\r
+                groupUpdate.getGroupTypesSupported().get(1).getName());\r
+        Assert.assertEquals("Wrong group capabilities size", 2, groupUpdate.getGroupCapabilitiesSupported().size());\r
+        Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.ChainingChecks",\r
+                groupUpdate.getGroupCapabilitiesSupported().get(0).getName());\r
+        Assert.assertEquals("Wrong group capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight",\r
+                groupUpdate.getGroupCapabilitiesSupported().get(1).getName());\r
+        Assert.assertEquals("Wrong max groups", maxGroups, groupUpdate.getMaxGroups());\r
+        Assert.assertEquals("Wrong actions bitmap", 137072641, groupUpdate.getActions().get(0).longValue());\r
+        Assert.assertEquals("Wrong actions bitmap", 131336192, groupUpdate.getActions().get(1).longValue());\r
+        Assert.assertEquals("Wrong actions bitmap", 247365632, groupUpdate.getActions().get(2).longValue());\r
+        Assert.assertEquals("Wrong actions bitmap", 21043201, groupUpdate.getActions().get(3).longValue());\r
+    }\r
+\r
+    /**\r
+     * Test  MultipartReply message with meter features stat\r
+     */\r
+    @Test\r
+    public void testMeterFeaturesCase() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPMETERFEATURES);\r
+        \r
+        MultipartReplyMeterFeaturesCaseBuilder caseBuilder = new MultipartReplyMeterFeaturesCaseBuilder();\r
+        MultipartReplyMeterFeaturesBuilder featBuilder = new MultipartReplyMeterFeaturesBuilder();\r
+        featBuilder.setMaxMeter(1L);\r
+        featBuilder.setBandTypes(new MeterBandTypeBitmap(true, true));\r
+        featBuilder.setCapabilities(new MeterFlags(true, true, true, true));\r
+        featBuilder.setMaxBands((short) 2);\r
+        featBuilder.setMaxColor((short) 3);\r
+        caseBuilder.setMultipartReplyMeterFeatures(featBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+\r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        MeterFeaturesUpdated megterUpdate = (MeterFeaturesUpdated) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", megterUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, megterUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, megterUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong max meter", 1, megterUpdate.getMaxMeter().getValue().intValue());\r
+        Assert.assertEquals("Wrong max bands", 2, megterUpdate.getMaxBands().intValue());\r
+        Assert.assertEquals("Wrong max color", 3, megterUpdate.getMaxColor().intValue());\r
+        Assert.assertEquals("Wrong capabilities size", 4, megterUpdate.getMeterCapabilitiesSupported().size());\r
+        Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"\r
+                + ".MeterBurst", megterUpdate.getMeterCapabilitiesSupported().get(0).getName());\r
+        Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"\r
+                + ".MeterKbps", megterUpdate.getMeterCapabilitiesSupported().get(1).getName());\r
+        Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"\r
+                + ".MeterPktps", megterUpdate.getMeterCapabilitiesSupported().get(2).getName());\r
+        Assert.assertEquals("Wrong capability", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918"\r
+                + ".MeterStats", megterUpdate.getMeterCapabilitiesSupported().get(3).getName());\r
+        Assert.assertEquals("Wrong band types size", 2, megterUpdate.getMeterBandSupported().size());\r
+        Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDrop",\r
+                megterUpdate.getMeterBandSupported().get(0).getName());\r
+        Assert.assertEquals("Wrong band type", "org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterBandDscpRemark",\r
+                megterUpdate.getMeterBandSupported().get(1).getName());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest3.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslatorTest3.java
new file mode 100644 (file)
index 0000000..d3e88d1
--- /dev/null
@@ -0,0 +1,373 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. 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.openflowplugin.openflow.md.core.translator;\r
+\r
+import static org.mockito.Mockito.when;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.mockito.Mock;\r
+import org.mockito.MockitoAnnotations;\r
+import org.opendaylight.openflowjava.protocol.api.util.BinContent;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
+import org.opendaylight.openflowplugin.api.openflow.md.core.SwitchConnectionDistinguisher;\r
+import org.opendaylight.openflowplugin.openflow.md.core.ConnectionConductor;\r
+import org.opendaylight.openflowplugin.openflow.md.core.session.SessionContext;\r
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.FlowTableStatisticsUpdate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetFeaturesOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessageBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyPortStatsCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyQueueCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueueBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTableBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStatsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.NodeConnectorStatisticsUpdate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.QueueStatisticsUpdate;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap;\r
+import org.opendaylight.yangtools.yang.binding.DataObject;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MultipartReplyTranslatorTest3 {\r
+\r
+    @Mock SwitchConnectionDistinguisher cookie;\r
+    @Mock SessionContext sc;\r
+    @Mock ConnectionConductor conductor;\r
+    @Mock GetFeaturesOutput features;\r
+\r
+    MultipartReplyTranslator translator = new MultipartReplyTranslator();\r
+\r
+    /**\r
+     * Initializes mocks\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        MockitoAnnotations.initMocks(this);\r
+        when(sc.getPrimaryConductor()).thenReturn(conductor);\r
+        when(conductor.getVersion()).thenReturn((short) EncodeConstants.OF13_VERSION_ID);\r
+        when(sc.getFeatures()).thenReturn(features);\r
+        when(features.getDatapathId()).thenReturn(new BigInteger("42"));\r
+        OpenflowPortsUtil.init();\r
+    }\r
+\r
+    /**\r
+     * Test empty port stats\r
+     */\r
+    @Test\r
+    public void testEmptyPortStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPPORTSTATS);\r
+        \r
+        MultipartReplyPortStatsCaseBuilder caseBuilder = new MultipartReplyPortStatsCaseBuilder();\r
+        MultipartReplyPortStatsBuilder statsBuilder = new MultipartReplyPortStatsBuilder();\r
+        List<PortStats> portStats = new ArrayList<>();\r
+        statsBuilder.setPortStats(portStats);\r
+        caseBuilder.setMultipartReplyPortStats(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        NodeConnectorStatisticsUpdate statUpdate = (NodeConnectorStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong port stats size", 0, statUpdate.getNodeConnectorStatisticsAndPortNumberMap().size());\r
+    }\r
+\r
+    /**\r
+     * Test port stats\r
+     */\r
+    @Test\r
+    public void testPortStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPPORTSTATS);\r
+        \r
+        MultipartReplyPortStatsCaseBuilder caseBuilder = new MultipartReplyPortStatsCaseBuilder();\r
+        MultipartReplyPortStatsBuilder statsBuilder = new MultipartReplyPortStatsBuilder();\r
+        List<PortStats> portStats = new ArrayList<>();\r
+        PortStatsBuilder builder = new PortStatsBuilder();\r
+        builder.setPortNo(1L);\r
+        builder.setRxPackets(new BigInteger("2"));\r
+        builder.setTxPackets(new BigInteger("3"));\r
+        builder.setRxBytes(new BigInteger("4"));\r
+        builder.setTxBytes(new BigInteger("5"));\r
+        builder.setRxDropped(new BigInteger("6"));\r
+        builder.setTxDropped(new BigInteger("7"));\r
+        builder.setRxErrors(new BigInteger("8"));\r
+        builder.setTxErrors(new BigInteger("9"));\r
+        builder.setRxFrameErr(new BigInteger("10"));\r
+        builder.setRxOverErr(new BigInteger("11"));\r
+        builder.setRxCrcErr(new BigInteger("12"));\r
+        builder.setCollisions(new BigInteger("13"));\r
+        builder.setDurationSec(14L);\r
+        builder.setDurationNsec(15L);\r
+        portStats.add(builder.build());\r
+        builder = new PortStatsBuilder();\r
+        builder.setPortNo(BinContent.intToUnsignedLong(PortNumberValues.CONTROLLER.getIntValue()));\r
+        builder.setRxPackets(new BigInteger("20"));\r
+        builder.setTxPackets(new BigInteger("30"));\r
+        builder.setRxBytes(new BigInteger("40"));\r
+        builder.setTxBytes(new BigInteger("50"));\r
+        builder.setRxDropped(new BigInteger("60"));\r
+        builder.setTxDropped(new BigInteger("70"));\r
+        builder.setRxErrors(new BigInteger("80"));\r
+        builder.setTxErrors(new BigInteger("90"));\r
+        builder.setRxFrameErr(new BigInteger("100"));\r
+        builder.setRxOverErr(new BigInteger("110"));\r
+        builder.setRxCrcErr(new BigInteger("120"));\r
+        builder.setCollisions(new BigInteger("130"));\r
+        portStats.add(builder.build());\r
+        statsBuilder.setPortStats(portStats);\r
+        caseBuilder.setMultipartReplyPortStats(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        NodeConnectorStatisticsUpdate statUpdate = (NodeConnectorStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong port stats size", 2, statUpdate.getNodeConnectorStatisticsAndPortNumberMap().size());\r
+        NodeConnectorStatisticsAndPortNumberMap stat = statUpdate.getNodeConnectorStatisticsAndPortNumberMap().get(0);\r
+        Assert.assertEquals("Wrong port number", "openflow:42:1", stat.getNodeConnectorId().getValue());\r
+        Assert.assertEquals("Wrong rx packets", 2, stat.getPackets().getReceived().intValue());\r
+        Assert.assertEquals("Wrong tx packets", 3, stat.getPackets().getTransmitted().intValue());\r
+        Assert.assertEquals("Wrong rx bytes", 4, stat.getBytes().getReceived().intValue());\r
+        Assert.assertEquals("Wrong tx bytes", 5, stat.getBytes().getTransmitted().intValue());\r
+        Assert.assertEquals("Wrong rx dropped", 6, stat.getReceiveDrops().intValue());\r
+        Assert.assertEquals("Wrong tx dropped", 7, stat.getTransmitDrops().intValue());\r
+        Assert.assertEquals("Wrong rx errors", 8, stat.getReceiveErrors().intValue());\r
+        Assert.assertEquals("Wrong tx errors", 9, stat.getTransmitErrors().intValue());\r
+        Assert.assertEquals("Wrong rx frame error", 10, stat.getReceiveFrameError().intValue());\r
+        Assert.assertEquals("Wrong rx over error", 11, stat.getReceiveOverRunError().intValue());\r
+        Assert.assertEquals("Wrong rx crc error", 12, stat.getReceiveCrcError().intValue());\r
+        Assert.assertEquals("Wrong collision count", 13, stat.getCollisionCount().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 14, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 15, stat.getDuration().getNanosecond().getValue().intValue());\r
+        stat = statUpdate.getNodeConnectorStatisticsAndPortNumberMap().get(1);\r
+        Assert.assertEquals("Wrong port number", "openflow:42:CONTROLLER", stat.getNodeConnectorId().getValue());\r
+        Assert.assertEquals("Wrong rx packets", 20, stat.getPackets().getReceived().intValue());\r
+        Assert.assertEquals("Wrong tx packets", 30, stat.getPackets().getTransmitted().intValue());\r
+        Assert.assertEquals("Wrong rx bytes", 40, stat.getBytes().getReceived().intValue());\r
+        Assert.assertEquals("Wrong tx bytes", 50, stat.getBytes().getTransmitted().intValue());\r
+        Assert.assertEquals("Wrong rx dropped", 60, stat.getReceiveDrops().intValue());\r
+        Assert.assertEquals("Wrong tx dropped", 70, stat.getTransmitDrops().intValue());\r
+        Assert.assertEquals("Wrong rx errors", 80, stat.getReceiveErrors().intValue());\r
+        Assert.assertEquals("Wrong tx errors", 90, stat.getTransmitErrors().intValue());\r
+        Assert.assertEquals("Wrong rx frame error", 100, stat.getReceiveFrameError().intValue());\r
+        Assert.assertEquals("Wrong rx over error", 110, stat.getReceiveOverRunError().intValue());\r
+        Assert.assertEquals("Wrong rx crc error", 120, stat.getReceiveCrcError().intValue());\r
+        Assert.assertEquals("Wrong collision count", 130, stat.getCollisionCount().intValue());\r
+        Assert.assertEquals("Wrong duration sec", null, stat.getDuration().getSecond());\r
+        Assert.assertEquals("Wrong duration n sec", null, stat.getDuration().getNanosecond());\r
+    }\r
+\r
+    /**\r
+     * Test empty table stats\r
+     */\r
+    @Test\r
+    public void testEmptyTableStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPTABLE);\r
+        \r
+        MultipartReplyTableCaseBuilder caseBuilder = new MultipartReplyTableCaseBuilder();\r
+        MultipartReplyTableBuilder statsBuilder = new MultipartReplyTableBuilder();\r
+        List<TableStats> tableStats = new ArrayList<>();\r
+        statsBuilder.setTableStats(tableStats);\r
+        caseBuilder.setMultipartReplyTable(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        FlowTableStatisticsUpdate statUpdate = (FlowTableStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong table stats size", 0, statUpdate.getFlowTableAndStatisticsMap().size());\r
+    }\r
+\r
+    /**\r
+     * Test table stats\r
+     */\r
+    @Test\r
+    public void testTableStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPTABLE);\r
+        \r
+        MultipartReplyTableCaseBuilder caseBuilder = new MultipartReplyTableCaseBuilder();\r
+        MultipartReplyTableBuilder statsBuilder = new MultipartReplyTableBuilder();\r
+        List<TableStats> tableStats = new ArrayList<>();\r
+        TableStatsBuilder builder = new TableStatsBuilder();\r
+        builder.setTableId((short) 1);\r
+        builder.setActiveCount(2L);\r
+        builder.setLookupCount(new BigInteger("3"));\r
+        builder.setMatchedCount(new BigInteger("4"));\r
+        tableStats.add(builder.build());\r
+        builder = new TableStatsBuilder();\r
+        builder.setTableId((short) 10);\r
+        builder.setActiveCount(20L);\r
+        builder.setLookupCount(new BigInteger("30"));\r
+        builder.setMatchedCount(new BigInteger("40"));\r
+        tableStats.add(builder.build());\r
+        statsBuilder.setTableStats(tableStats);\r
+        caseBuilder.setMultipartReplyTable(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        FlowTableStatisticsUpdate statUpdate = (FlowTableStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong table stats size", 2, statUpdate.getFlowTableAndStatisticsMap().size());\r
+        FlowTableAndStatisticsMap stat = statUpdate.getFlowTableAndStatisticsMap().get(0);\r
+        Assert.assertEquals("Wrong table-id", 1, stat.getTableId().getValue().intValue());\r
+        Assert.assertEquals("Wrong active count", 2, stat.getActiveFlows().getValue().intValue());\r
+        Assert.assertEquals("Wrong lookup count", 3, stat.getPacketsLookedUp().getValue().intValue());\r
+        Assert.assertEquals("Wrong matched count", 4, stat.getPacketsMatched().getValue().intValue());\r
+        stat = statUpdate.getFlowTableAndStatisticsMap().get(1);\r
+        Assert.assertEquals("Wrong table-id", 10, stat.getTableId().getValue().intValue());\r
+        Assert.assertEquals("Wrong active count", 20, stat.getActiveFlows().getValue().intValue());\r
+        Assert.assertEquals("Wrong lookup count", 30, stat.getPacketsLookedUp().getValue().intValue());\r
+        Assert.assertEquals("Wrong matched count", 40, stat.getPacketsMatched().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test empty queue stats\r
+     */\r
+    @Test\r
+    public void testEmptyQueueStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPQUEUE);\r
+        \r
+        MultipartReplyQueueCaseBuilder caseBuilder = new MultipartReplyQueueCaseBuilder();\r
+        MultipartReplyQueueBuilder statsBuilder = new MultipartReplyQueueBuilder();\r
+        List<QueueStats> queueStats = new ArrayList<>();\r
+        statsBuilder.setQueueStats(queueStats);\r
+        caseBuilder.setMultipartReplyQueue(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        QueueStatisticsUpdate statUpdate = (QueueStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong queue stats size", 0, statUpdate.getQueueIdAndStatisticsMap().size());\r
+    }\r
+\r
+    /**\r
+     * Test queue stats\r
+     */\r
+    @Test\r
+    public void testQueueStats() {\r
+        MultipartReplyMessageBuilder mpBuilder = new MultipartReplyMessageBuilder();\r
+        mpBuilder.setVersion((short) EncodeConstants.OF13_VERSION_ID);\r
+        mpBuilder.setXid(123L);\r
+        mpBuilder.setFlags(new MultipartRequestFlags(false));\r
+        mpBuilder.setType(MultipartType.OFPMPQUEUE);\r
+        \r
+        MultipartReplyQueueCaseBuilder caseBuilder = new MultipartReplyQueueCaseBuilder();\r
+        MultipartReplyQueueBuilder statsBuilder = new MultipartReplyQueueBuilder();\r
+        List<QueueStats> queueStats = new ArrayList<>();\r
+        QueueStatsBuilder builder = new QueueStatsBuilder();\r
+        builder.setPortNo(BinContent.intToUnsignedLong(PortNumberValues.FLOOD.getIntValue()));\r
+        builder.setQueueId(2L);\r
+        builder.setTxPackets(new BigInteger("3"));\r
+        builder.setTxBytes(new BigInteger("4"));\r
+        builder.setTxErrors(new BigInteger("5"));\r
+        builder.setDurationSec(6L);\r
+        builder.setDurationNsec(7L);\r
+        queueStats.add(builder.build());\r
+        builder = new QueueStatsBuilder();\r
+        builder.setPortNo(BinContent.intToUnsignedLong(PortNumberValues.INPORT.getIntValue()));\r
+        builder.setQueueId(20L);\r
+        builder.setTxPackets(new BigInteger("30"));\r
+        builder.setTxBytes(new BigInteger("40"));\r
+        builder.setTxErrors(new BigInteger("50"));\r
+        builder.setDurationSec(60L);\r
+        builder.setDurationNsec(70L);\r
+        queueStats.add(builder.build());\r
+        statsBuilder.setQueueStats(queueStats);\r
+        caseBuilder.setMultipartReplyQueue(statsBuilder.build());\r
+        mpBuilder.setMultipartReplyBody(caseBuilder.build());\r
+        MultipartReplyMessage message = mpBuilder.build();\r
+        \r
+        List<DataObject> list = translator.translate(cookie, sc, message);\r
+\r
+        Assert.assertEquals("Wrong list size", 1, list.size());\r
+        QueueStatisticsUpdate statUpdate = (QueueStatisticsUpdate) list.get(0);\r
+        Assert.assertEquals("Wrong node-id", "openflow:42", statUpdate.getId().getValue());\r
+        Assert.assertEquals("Wrong more-replies", false, statUpdate.isMoreReplies());\r
+        Assert.assertEquals("Wrong transaction-id", 123, statUpdate.getTransactionId().getValue().intValue());\r
+        Assert.assertEquals("Wrong queue stats size", 2, statUpdate.getQueueIdAndStatisticsMap().size());\r
+        QueueIdAndStatisticsMap stat = statUpdate.getQueueIdAndStatisticsMap().get(0);\r
+        Assert.assertEquals("Wrong port number", "openflow:42:FLOOD", stat.getNodeConnectorId().getValue());\r
+        Assert.assertEquals("Wrong queue-id", 2, stat.getQueueId().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx packets", 3, stat.getTransmittedPackets().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx bytes", 4, stat.getTransmittedBytes().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx errors", 5, stat.getTransmissionErrors().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 6, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 7, stat.getDuration().getNanosecond().getValue().intValue());\r
+        stat = statUpdate.getQueueIdAndStatisticsMap().get(1);\r
+        Assert.assertEquals("Wrong port number", "openflow:42:INPORT", stat.getNodeConnectorId().getValue());\r
+        Assert.assertEquals("Wrong queue-id", 20, stat.getQueueId().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx packets", 30, stat.getTransmittedPackets().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx bytes", 40, stat.getTransmittedBytes().getValue().intValue());\r
+        Assert.assertEquals("Wrong tx errors", 50, stat.getTransmissionErrors().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration sec", 60, stat.getDuration().getSecond().getValue().intValue());\r
+        Assert.assertEquals("Wrong duration n sec", 70, stat.getDuration().getNanosecond().getValue().intValue());\r
+    }\r
+}
\ No newline at end of file