Increased unit test coverage of serialization factories
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / multipart / MultipartRequestTableFeaturesTest.java
@@ -17,15 +17,24 @@ import java.util.List;
 import org.junit.Assert;\r
 import org.junit.Before;\r
 import org.junit.Test;\r
+import org.junit.runner.RunWith;\r
+import org.mockito.Matchers;\r
+import org.mockito.Mock;\r
+import org.mockito.Mockito;\r
+import org.mockito.runners.MockitoJUnitRunner;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;\r
 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;\r
 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.MultipartRequestInputFactory;\r
 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.MultipartRequestInputFactoryTest;\r
 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
 import org.opendaylight.openflowjava.util.ByteBufUtils;\r
-import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\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.ExperimenterIdTableFeatureProperty;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterIdTableFeaturePropertyBuilder;\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
@@ -34,6 +43,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 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.Output;\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
@@ -42,6 +54,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.instruction
 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.ExperimenterId;\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.TableConfig;\r
@@ -66,17 +79,24 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  * @author michal.polkorab\r
  *\r
  */\r
-public class TableFeaturesTest {\r
+@RunWith(MockitoJUnitRunner.class)\r
+public class MultipartRequestTableFeaturesTest {\r
+\r
     private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE =\r
             MultipartRequestInputFactoryTest.PADDING_IN_MULTIPART_REQUEST_MESSAGE;\r
     private SerializerRegistry registry;\r
     private OFSerializer<MultipartRequestInput> multipartFactory;\r
 \r
+    @Mock SerializerRegistry mockRegistry;\r
+    @Mock OFSerializer<TableFeatureProperties> serializer;\r
+\r
     /**\r
      * Initializes serializer registry and stores correct factory in field\r
      */\r
     @Before\r
     public void startUp() {\r
+        Mockito.when(mockRegistry.getSerializer((MessageTypeKey<?>)Matchers.any()))\r
+        .thenReturn(serializer);\r
         registry = new SerializerRegistryImpl();\r
         registry.init();\r
         multipartFactory = registry.getSerializer(\r
@@ -118,7 +138,6 @@ public class TableFeaturesTest {
         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
@@ -169,6 +188,37 @@ public class TableFeaturesTest {
         tableFeaturesBuilder.setMaxEntries(67L);\r
         properties = new ArrayList<>();\r
         propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTWRITEACTIONS);\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
+        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
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTAPPLYACTIONS);\r
+        actBuilder = new ActionRelatedTableFeaturePropertyBuilder();\r
+        actions = new ArrayList<>();\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
+        actBuilder.setAction(actions);\r
+        propBuilder.addAugmentation(ActionRelatedTableFeatureProperty.class, actBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
         propBuilder.setType(TableFeaturesPropType.OFPTFPTMATCH);\r
         OxmRelatedTableFeaturePropertyBuilder oxmBuilder = new OxmRelatedTableFeaturePropertyBuilder();\r
         List<MatchEntries> entries = new ArrayList<>();\r
@@ -186,6 +236,27 @@ public class TableFeaturesTest {
         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
+        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
+        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
+        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
@@ -202,6 +273,13 @@ public class TableFeaturesTest {
         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
+        oxmBuilder.setMatchEntries(entries);\r
+        propBuilder.addAugmentation(OxmRelatedTableFeatureProperty.class, oxmBuilder.build());\r
+        properties.add(propBuilder.build());\r
         tableFeaturesBuilder.setTableFeatureProperties(properties);\r
         tableFeaturesList.add(tableFeaturesBuilder.build());\r
         featuresBuilder.setTableFeatures(tableFeaturesList);\r
@@ -212,7 +290,7 @@ public class TableFeaturesTest {
         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
         multipartFactory.serialize(message, out);\r
 \r
-        BufferHelper.checkHeaderV13(out, (byte) 18, 232);\r
+        BufferHelper.checkHeaderV13(out, (byte) 18, 296);\r
         Assert.assertEquals("Wrong type", 12, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong flags", 1, out.readUnsignedShort());\r
         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
@@ -237,9 +315,8 @@ public class TableFeaturesTest {
         Assert.assertEquals("Wrong next-registry-id", 2, out.readUnsignedByte());\r
         out.skipBytes(2);\r
         Assert.assertEquals("Wrong property type", 3, out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong property length", 5, out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong next-registry-id", 3, out.readUnsignedByte());\r
-        out.skipBytes(3);\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
         Assert.assertEquals("Wrong property type", 0, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong property length", 12, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong instruction type", 3, out.readUnsignedShort());\r
@@ -259,7 +336,7 @@ public class TableFeaturesTest {
         Assert.assertEquals("Wrong instruction length", 4, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong instruction type", 1, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong instruction length", 4, out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong length", 96, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong length", 160, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong registry-id", 8, out.readUnsignedByte());\r
         out.skipBytes(5);\r
         Assert.assertEquals("Wrong name", "AAAABBBBCCCCDDDDEEEEFFFFGGGG",\r
@@ -274,6 +351,19 @@ public class TableFeaturesTest {
                 new byte[] {0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01}, metadataWrite);\r
         Assert.assertEquals("Wrong config", 8, out.readUnsignedInt());\r
         Assert.assertEquals("Wrong max-entries", 67, out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong property type", 4, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 8, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong action length", 4, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property type", 5, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 6, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 7, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
         Assert.assertEquals("Wrong property type", 8, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong property length", 12, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong match class", 0x8000, out.readUnsignedShort());\r
@@ -283,6 +373,15 @@ public class TableFeaturesTest {
         Assert.assertEquals("Wrong match field&mask", 0, out.readUnsignedByte());\r
         Assert.assertEquals("Wrong match length", 4, out.readUnsignedByte());\r
         out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 10, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 12, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 13, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
         Assert.assertEquals("Wrong property type", 14, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong property length", 12, out.readUnsignedShort());\r
         Assert.assertEquals("Wrong match class", 0x8000, out.readUnsignedShort());\r
@@ -292,7 +391,77 @@ public class TableFeaturesTest {
         Assert.assertEquals("Wrong match field&mask", 18, out.readUnsignedByte());\r
         Assert.assertEquals("Wrong match length", 1, out.readUnsignedByte());\r
         out.skipBytes(4);\r
+        Assert.assertEquals("Wrong property type", 15, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong property length", 4, out.readUnsignedShort());\r
+        out.skipBytes(4);\r
         Assert.assertTrue("Unread data", out.readableBytes() == 0);\r
     }\r
 \r
-}\r
+    /**\r
+     * @throws Exception\r
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
+     */\r
+    @Test\r
+    public void testMultipartRequestTableFeaturesExperimenter() throws Exception {\r
+        MultipartRequestInputFactory factory = new MultipartRequestInputFactory();\r
+        factory.injectSerializerRegistry(mockRegistry);\r
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
+        builder.setType(MultipartType.forValue(12));\r
+        builder.setFlags(new MultipartRequestFlags(true));\r
+        MultipartRequestTableFeaturesCaseBuilder caseBuilder = new MultipartRequestTableFeaturesCaseBuilder();\r
+        MultipartRequestTableFeaturesBuilder featuresBuilder = new MultipartRequestTableFeaturesBuilder();\r
+        List<TableFeatures> tableFeaturesList = new ArrayList<>();\r
+        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();\r
+        tableFeaturesBuilder.setTableId((short) 8);\r
+        tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");\r
+        tableFeaturesBuilder.setMetadataMatch(new BigInteger(new byte[] {0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01}));\r
+        tableFeaturesBuilder.setMetadataWrite(new BigInteger(new byte[] {0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01}));\r
+        tableFeaturesBuilder.setConfig(new TableConfig(true));\r
+        tableFeaturesBuilder.setMaxEntries(65L);\r
+        List<TableFeatureProperties> properties = new ArrayList<>();\r
+        TableFeaturePropertiesBuilder propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTEXPERIMENTER);\r
+        ExperimenterIdTableFeaturePropertyBuilder expBuilder = new ExperimenterIdTableFeaturePropertyBuilder();\r
+        expBuilder.setExperimenter(new ExperimenterId(42L));\r
+        propBuilder.addAugmentation(ExperimenterIdTableFeatureProperty.class, expBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        propBuilder = new TableFeaturePropertiesBuilder();\r
+        propBuilder.setType(TableFeaturesPropType.OFPTFPTEXPERIMENTERMISS);\r
+        expBuilder = new ExperimenterIdTableFeaturePropertyBuilder();\r
+        expBuilder.setExperimenter(new ExperimenterId(43L));\r
+        propBuilder.addAugmentation(ExperimenterIdTableFeatureProperty.class, expBuilder.build());\r
+        properties.add(propBuilder.build());\r
+        tableFeaturesBuilder.setTableFeatureProperties(properties);\r
+        tableFeaturesList.add(tableFeaturesBuilder.build());\r
+        featuresBuilder.setTableFeatures(tableFeaturesList);\r
+        caseBuilder.setMultipartRequestTableFeatures(featuresBuilder.build());\r
+        builder.setMultipartRequestBody(caseBuilder.build());\r
+        MultipartRequestInput message = builder.build();\r
+\r
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
+        factory.serialize(message, out);\r
+\r
+        BufferHelper.checkHeaderV13(out, (byte) 18, 80);\r
+        Assert.assertEquals("Wrong type", 12, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong flags", 1, out.readUnsignedShort());\r
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
+        Assert.assertEquals("Wrong length", 64, out.readUnsignedShort());\r
+        Assert.assertEquals("Wrong registry-id", 8, out.readUnsignedByte());\r
+        out.skipBytes(5);\r
+        Assert.assertEquals("Wrong name", "AAAABBBBCCCCDDDDEEEEFFFFGGGG",\r
+                ByteBufUtils.decodeNullTerminatedString(out, 32));\r
+        byte[] metadataMatch = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
+        out.readBytes(metadataMatch);\r
+        Assert.assertArrayEquals("Wrong metadata-match",\r
+                new byte[] {0x00, 0x01, 0x02, 0x03, 0x01, 0x04, 0x08, 0x01}, metadataMatch);\r
+        byte[] metadataWrite = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];\r
+        out.readBytes(metadataWrite);\r
+        Assert.assertArrayEquals("Wrong metadata-write",\r
+                new byte[] {0x00, 0x07, 0x01, 0x05, 0x01, 0x00, 0x03, 0x01}, metadataWrite);\r
+        Assert.assertEquals("Wrong config", 8, out.readUnsignedInt());\r
+        Assert.assertEquals("Wrong max-entries", 65, out.readUnsignedInt());\r
+        Mockito.verify(serializer, Mockito.times(2)).serialize(Matchers.any(TableFeatureProperties.class),\r
+                Matchers.any(ByteBuf.class));\r
+    }\r
+}
\ No newline at end of file