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
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
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
* @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
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
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
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
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
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
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
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
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
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
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