Copyright update
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartRequestInputFactoryTest.java
index e725e64b35c3bc47f40d0d859cd06a05cee72455..3b949bc3703596add1b78872953ff926f28ac70c 100644 (file)
-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-import io.netty.buffer.UnpooledByteBufAllocator;\r
-\r
-import java.math.BigInteger;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-\r
-import junit.framework.Assert;\r
-\r
-import org.junit.Test;\r
-import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
-import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
-import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\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.MeterId;\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
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeaturesBuilder;\r
-\r
-/**\r
- * @author timotej.kubas\r
- * @author michal.polkorab\r
- */\r
-public class MultipartRequestInputFactoryTest {\r
-    private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestInputFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(1));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestFlow());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong flow", message.getMultipartRequestBody(), decodeRequestFlow(out));\r
-    }\r
-\r
-    private static MultipartRequestFlow createRequestFlow() {\r
-        MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();\r
-        builder.setTableId((short) 8);\r
-        builder.setOutPort(85L);\r
-        builder.setOutGroup(95L);\r
-        byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
-        builder.setCookie(new BigInteger(cookie));\r
-        byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
-        builder.setCookieMask(new BigInteger(cookieMask));\r
-        MultipartRequestFlow flow = builder.build();\r
-        //TODO match field\r
-        return flow;\r
-    }\r
-\r
-    private static MultipartRequestFlow decodeRequestFlow(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;\r
-        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;\r
-        MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();\r
-        builder.setTableId(output.readUnsignedByte());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);\r
-        builder.setOutPort(output.readUnsignedInt());\r
-        builder.setOutGroup(output.readUnsignedInt());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);\r
-        byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(cookie);\r
-        builder.setCookie(new BigInteger(cookie));\r
-        byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(cookieMask);\r
-        builder.setCookieMask(new BigInteger(cookieMask));\r
-        MultipartRequestFlow flow = builder.build();\r
-        return flow;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestInputAggregateBodyFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(2));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestAggregate());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong aggregate", message.getMultipartRequestBody(), decodeRequestAggregate(out));\r
-    }\r
-\r
-    private static MultipartRequestFlags decodeMultipartRequestFlags(short input){\r
-        final Boolean _oFPMPFREQMORE = (input & (1 << 0)) > 0;\r
-        return new MultipartRequestFlags(_oFPMPFREQMORE);\r
-    }\r
-\r
-\r
-    private static MultipartRequestAggregate createRequestAggregate() {\r
-        MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();\r
-        builder.setTableId((short) 8);\r
-        builder.setOutPort(85L);\r
-        builder.setOutGroup(95L);\r
-        byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
-        builder.setCookie(new BigInteger(cookie));\r
-        byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
-        builder.setCookieMask(new BigInteger(cookieMask));\r
-        MultipartRequestAggregate aggregate = builder.build();\r
-      //TODO match field\r
-        return aggregate;\r
-    }\r
-\r
-    private static MultipartRequestAggregate decodeRequestAggregate(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;\r
-        final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;\r
-        MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();\r
-        builder.setTableId(output.readUnsignedByte());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01);\r
-        builder.setOutPort(output.readUnsignedInt());\r
-        builder.setOutGroup(output.readUnsignedInt());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02);\r
-        byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(cookie);\r
-        builder.setCookie(new BigInteger(cookie));\r
-        byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(cookieMask);\r
-        builder.setCookieMask(new BigInteger(cookieMask));\r
-        MultipartRequestAggregate flow = builder.build();\r
-        return flow;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestInputTableFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(3));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        //multipart request for table does not have body\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestPortStatsMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(4));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestPortStats());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong portStatsBody", message.getMultipartRequestBody(), decodeRequestPortStats(out));\r
-    }\r
-\r
-    private static MultipartRequestPortStats createRequestPortStats() {\r
-        MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();\r
-        builder.setPortNo(2251L);\r
-        MultipartRequestPortStats portStats = builder.build();\r
-        return portStats;\r
-    }\r
-\r
-    private static MultipartRequestPortStats decodeRequestPortStats(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;\r
-        MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();\r
-        builder.setPortNo(output.readUnsignedInt());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);\r
-        MultipartRequestPortStats portRequest = builder.build();\r
-        return portRequest;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestQueueMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(5));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestQueue());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong queueBody", message.getMultipartRequestBody(), decodeRequestQueue(out));\r
-    }\r
-\r
-    private static MultipartRequestQueue createRequestQueue() {\r
-        MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();\r
-        builder.setPortNo(2256L);\r
-        builder.setQueueId(2211L);\r
-        MultipartRequestQueue queue = builder.build();\r
-        return queue;\r
-    }\r
-\r
-    private static MultipartRequestQueue decodeRequestQueue(ByteBuf output) {\r
-        MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();\r
-        builder.setPortNo(output.readUnsignedInt());\r
-        builder.setQueueId(output.readUnsignedInt());\r
-        MultipartRequestQueue queue = builder.build();\r
-        return queue;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestGroupMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(6));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestGroup());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong groupBody", message.getMultipartRequestBody(), decodeRequestGroup(out));\r
-    }\r
-\r
-    private static MultipartRequestGroup createRequestGroup() {\r
-        MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();\r
-        builder.setGroupId(new GroupId(2258L));\r
-        MultipartRequestGroup group = builder.build();\r
-        return group;\r
-    }\r
-\r
-    private static MultipartRequestGroup decodeRequestGroup(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;\r
-        MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();\r
-        builder.setGroupId(new GroupId(output.readUnsignedInt()));\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);\r
-        MultipartRequestGroup group = builder.build();\r
-        return group;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestMeterMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(9));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestMeter());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong meterBody", message.getMultipartRequestBody(), decodeRequestMeter(out));\r
-    }\r
-\r
-    private static MultipartRequestMeter createRequestMeter() {\r
-        MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();\r
-        builder.setMeterId(new MeterId(1121L));\r
-        MultipartRequestMeter meter = builder.build();\r
-        return meter;\r
-    }\r
-\r
-    private static MultipartRequestMeter decodeRequestMeter(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;\r
-        MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();\r
-        builder.setMeterId(new MeterId(output.readUnsignedInt()));\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);\r
-        MultipartRequestMeter meter = builder.build();\r
-        return meter;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestMeterConfigMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(10));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestMeterConfig());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong meterConfigBody", message.getMultipartRequestBody(), decodeRequestMeterConfig(out));\r
-    }\r
-\r
-    private static MultipartRequestMeterConfig createRequestMeterConfig() {\r
-        MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();\r
-        builder.setMeterId(new MeterId(1133L));\r
-        MultipartRequestMeterConfig meterConfig = builder.build();\r
-        return meterConfig;\r
-    }\r
-\r
-    private static MultipartRequestMeterConfig decodeRequestMeterConfig(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;\r
-        MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();\r
-        builder.setMeterId(new MeterId(output.readUnsignedInt()));\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);\r
-        MultipartRequestMeterConfig meterConfig = builder.build();\r
-        return meterConfig;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestExperimenterMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(0xffff));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestExperimenter());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-        Assert.assertEquals("Wrong experimenterBody", message.getMultipartRequestBody(), decodeRequestExperimenter(out));\r
-    }\r
-\r
-    private static MultipartRequestExperimenter createRequestExperimenter() {\r
-        MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();\r
-        builder.setExperimenter(1133L);\r
-        builder.setExpType(1135L);\r
-        MultipartRequestExperimenter experimenter = builder.build();\r
-        return experimenter;\r
-    }\r
-\r
-    private static MultipartRequestExperimenter decodeRequestExperimenter(ByteBuf output) {\r
-        MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();\r
-        builder.setExperimenter(output.readUnsignedInt());\r
-        builder.setExpType(output.readUnsignedInt());\r
-        MultipartRequestExperimenter experimenter = builder.build();\r
-        return experimenter;\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestDescMessageFactory() throws Exception {\r
-        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();\r
-        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
-        builder.setType(MultipartType.forValue(0));\r
-        builder.setFlags(new MultipartRequestFlags(true));\r
-        builder.setMultipartRequestBody(createRequestDesc());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-    }\r
-\r
-    private static MultipartRequestBody createRequestDesc() {\r
-        MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();\r
-        return builder.build();\r
-    }\r
-\r
-    /**\r
-     * @throws Exception\r
-     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO\r
-     */\r
-    @Test\r
-    public void testMultipartRequestTableFeaturesMessageFactory() throws Exception {\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
-        builder.setMultipartRequestBody(createRequestTableFeatures());\r
-        MultipartRequestInput message = builder.build();\r
-\r
-        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
-        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();\r
-        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
-\r
-        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
-        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
-        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
-        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
-\r
-        MultipartRequestTableFeatures messageTableFeatures = (MultipartRequestTableFeatures) message.getMultipartRequestBody();\r
-        Assert.assertEquals("Wrong tableFeaturesBody", messageTableFeatures.getTableFeatures(), decodeRequestTableFeatures(out).getTableFeatures());\r
-    }\r
-\r
-    private static MultipartRequestTableFeatures createRequestTableFeatures() {\r
-        MultipartRequestTableFeaturesBuilder builder = 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, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));\r
-        tableFeaturesBuilder.setMetadataWrite(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));\r
-        tableFeaturesBuilder.setConfig(new TableConfig(true));\r
-        tableFeaturesBuilder.setMaxEntries(65L);\r
-        TableFeatures tableFeature = tableFeaturesBuilder.build();\r
-        tableFeaturesList.add(tableFeature);\r
-        builder.setTableFeatures(tableFeaturesList);\r
-        MultipartRequestTableFeatures tableFeaturesRequest = builder.build();\r
-        return tableFeaturesRequest;\r
-    }\r
-\r
-    private static MultipartRequestTableFeatures decodeRequestTableFeatures(ByteBuf output) {\r
-        final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;\r
-        final byte OFP_MAX_TABLE_NAME_LEN = 32;\r
-        MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();\r
-        List<TableFeatures> tableFeaturesList = new ArrayList<>();\r
-        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();\r
-        tableFeaturesBuilder.setTableId(output.readUnsignedByte());\r
-        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY);\r
-        byte[] tableNameBytes = new byte[OFP_MAX_TABLE_NAME_LEN];\r
-        output.readBytes(tableNameBytes);\r
-        String tableName = new String(tableNameBytes);\r
-        tableFeaturesBuilder.setName(tableName.trim());\r
-        byte[] metadataMatch = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(metadataMatch);\r
-        tableFeaturesBuilder.setMetadataMatch(new BigInteger(metadataMatch));\r
-        byte[] metadataWrite = new byte[Long.SIZE/Byte.SIZE];\r
-        output.readBytes(metadataWrite);\r
-        tableFeaturesBuilder.setMetadataWrite(new BigInteger(metadataWrite));\r
-        tableFeaturesBuilder.setConfig(decodeTableConfig(output.readInt()));\r
-        tableFeaturesBuilder.setMaxEntries(output.readUnsignedInt());\r
-        TableFeatures tableFeature = tableFeaturesBuilder.build();\r
-        tableFeaturesList.add(tableFeature);\r
-        builder.setTableFeatures(tableFeaturesList);\r
-        MultipartRequestTableFeatures tableFeaturesRequest = builder.build();\r
-        return tableFeaturesRequest;\r
-    }\r
-\r
-    private static TableConfig decodeTableConfig(int input) {\r
-        final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0;\r
-        return new TableConfig(_oFPTCDEPRECATEDMASK);\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.UnpooledByteBufAllocator;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
+import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeaturesBuilder;
+
+/**
+ * @author timotej.kubas
+ * @author michal.polkorab
+ */
+public class MultipartRequestInputFactoryTest {
+    private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestInputFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(1));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestFlow());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong flow", message.getMultipartRequestBody(), decodeRequestFlow(out));
+    }
+
+    private static MultipartRequestFlow createRequestFlow() {
+        MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
+        builder.setTableId((short) 8);
+        builder.setOutPort(85L);
+        builder.setOutGroup(95L);
+        byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+        builder.setCookie(new BigInteger(cookie));
+        byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+        builder.setCookieMask(new BigInteger(cookieMask));
+        MultipartRequestFlow flow = builder.build();
+        //TODO match field
+        return flow;
+    }
+
+    private static MultipartRequestFlow decodeRequestFlow(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
+        final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
+        MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
+        builder.setTableId(output.readUnsignedByte());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);
+        builder.setOutPort(output.readUnsignedInt());
+        builder.setOutGroup(output.readUnsignedInt());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);
+        byte[] cookie = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(cookie);
+        builder.setCookie(new BigInteger(cookie));
+        byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(cookieMask);
+        builder.setCookieMask(new BigInteger(cookieMask));
+        MultipartRequestFlow flow = builder.build();
+        return flow;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestInputAggregateBodyFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(2));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestAggregate());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong aggregate", message.getMultipartRequestBody(), decodeRequestAggregate(out));
+    }
+
+    private static MultipartRequestFlags decodeMultipartRequestFlags(short input){
+        final Boolean _oFPMPFREQMORE = (input & (1 << 0)) > 0;
+        return new MultipartRequestFlags(_oFPMPFREQMORE);
+    }
+
+
+    private static MultipartRequestAggregate createRequestAggregate() {
+        MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
+        builder.setTableId((short) 8);
+        builder.setOutPort(85L);
+        builder.setOutGroup(95L);
+        byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+        builder.setCookie(new BigInteger(cookie));
+        byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+        builder.setCookieMask(new BigInteger(cookieMask));
+        MultipartRequestAggregate aggregate = builder.build();
+      //TODO match field
+        return aggregate;
+    }
+
+    private static MultipartRequestAggregate decodeRequestAggregate(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;
+        final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;
+        MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
+        builder.setTableId(output.readUnsignedByte());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01);
+        builder.setOutPort(output.readUnsignedInt());
+        builder.setOutGroup(output.readUnsignedInt());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02);
+        byte[] cookie = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(cookie);
+        builder.setCookie(new BigInteger(cookie));
+        byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(cookieMask);
+        builder.setCookieMask(new BigInteger(cookieMask));
+        MultipartRequestAggregate flow = builder.build();
+        return flow;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestInputTableFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(3));
+        builder.setFlags(new MultipartRequestFlags(true));
+        //multipart request for table does not have body
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestPortStatsMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(4));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestPortStats());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong portStatsBody", message.getMultipartRequestBody(), decodeRequestPortStats(out));
+    }
+
+    private static MultipartRequestPortStats createRequestPortStats() {
+        MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
+        builder.setPortNo(2251L);
+        MultipartRequestPortStats portStats = builder.build();
+        return portStats;
+    }
+
+    private static MultipartRequestPortStats decodeRequestPortStats(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;
+        MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
+        builder.setPortNo(output.readUnsignedInt());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);
+        MultipartRequestPortStats portRequest = builder.build();
+        return portRequest;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestQueueMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(5));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestQueue());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong queueBody", message.getMultipartRequestBody(), decodeRequestQueue(out));
+    }
+
+    private static MultipartRequestQueue createRequestQueue() {
+        MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
+        builder.setPortNo(2256L);
+        builder.setQueueId(2211L);
+        MultipartRequestQueue queue = builder.build();
+        return queue;
+    }
+
+    private static MultipartRequestQueue decodeRequestQueue(ByteBuf output) {
+        MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
+        builder.setPortNo(output.readUnsignedInt());
+        builder.setQueueId(output.readUnsignedInt());
+        MultipartRequestQueue queue = builder.build();
+        return queue;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestGroupMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(6));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestGroup());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong groupBody", message.getMultipartRequestBody(), decodeRequestGroup(out));
+    }
+
+    private static MultipartRequestGroup createRequestGroup() {
+        MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
+        builder.setGroupId(new GroupId(2258L));
+        MultipartRequestGroup group = builder.build();
+        return group;
+    }
+
+    private static MultipartRequestGroup decodeRequestGroup(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;
+        MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
+        builder.setGroupId(new GroupId(output.readUnsignedInt()));
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);
+        MultipartRequestGroup group = builder.build();
+        return group;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestMeterMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(9));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestMeter());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong meterBody", message.getMultipartRequestBody(), decodeRequestMeter(out));
+    }
+
+    private static MultipartRequestMeter createRequestMeter() {
+        MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
+        builder.setMeterId(new MeterId(1121L));
+        MultipartRequestMeter meter = builder.build();
+        return meter;
+    }
+
+    private static MultipartRequestMeter decodeRequestMeter(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;
+        MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
+        builder.setMeterId(new MeterId(output.readUnsignedInt()));
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);
+        MultipartRequestMeter meter = builder.build();
+        return meter;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestMeterConfigMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(10));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestMeterConfig());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong meterConfigBody", message.getMultipartRequestBody(), decodeRequestMeterConfig(out));
+    }
+
+    private static MultipartRequestMeterConfig createRequestMeterConfig() {
+        MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
+        builder.setMeterId(new MeterId(1133L));
+        MultipartRequestMeterConfig meterConfig = builder.build();
+        return meterConfig;
+    }
+
+    private static MultipartRequestMeterConfig decodeRequestMeterConfig(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;
+        MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
+        builder.setMeterId(new MeterId(output.readUnsignedInt()));
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);
+        MultipartRequestMeterConfig meterConfig = builder.build();
+        return meterConfig;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestExperimenterMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(0xffff));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestExperimenter());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+        Assert.assertEquals("Wrong experimenterBody", message.getMultipartRequestBody(), decodeRequestExperimenter(out));
+    }
+
+    private static MultipartRequestExperimenter createRequestExperimenter() {
+        MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();
+        builder.setExperimenter(1133L);
+        builder.setExpType(1135L);
+        MultipartRequestExperimenter experimenter = builder.build();
+        return experimenter;
+    }
+
+    private static MultipartRequestExperimenter decodeRequestExperimenter(ByteBuf output) {
+        MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();
+        builder.setExperimenter(output.readUnsignedInt());
+        builder.setExpType(output.readUnsignedInt());
+        MultipartRequestExperimenter experimenter = builder.build();
+        return experimenter;
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestDescMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(0));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestDesc());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+    }
+
+    private static MultipartRequestBody createRequestDesc() {
+        MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();
+        return builder.build();
+    }
+
+    /**
+     * @throws Exception
+     * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+     */
+    @Test
+    public void testMultipartRequestTableFeaturesMessageFactory() throws Exception {
+        MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+        BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
+        builder.setType(MultipartType.forValue(12));
+        builder.setFlags(new MultipartRequestFlags(true));
+        builder.setMultipartRequestBody(createRequestTableFeatures());
+        MultipartRequestInput message = builder.build();
+
+        ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+        MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
+        factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
+
+        BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
+        Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
+        Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+        out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
+
+        MultipartRequestTableFeatures messageTableFeatures = (MultipartRequestTableFeatures) message.getMultipartRequestBody();
+        Assert.assertEquals("Wrong tableFeaturesBody", messageTableFeatures.getTableFeatures(), decodeRequestTableFeatures(out).getTableFeatures());
+    }
+
+    private static MultipartRequestTableFeatures createRequestTableFeatures() {
+        MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();
+        List<TableFeatures> tableFeaturesList = new ArrayList<>();
+        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
+        tableFeaturesBuilder.setTableId((short) 8);
+        tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");
+        tableFeaturesBuilder.setMetadataMatch(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));
+        tableFeaturesBuilder.setMetadataWrite(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));
+        tableFeaturesBuilder.setConfig(new TableConfig(true));
+        tableFeaturesBuilder.setMaxEntries(65L);
+        TableFeatures tableFeature = tableFeaturesBuilder.build();
+        tableFeaturesList.add(tableFeature);
+        builder.setTableFeatures(tableFeaturesList);
+        MultipartRequestTableFeatures tableFeaturesRequest = builder.build();
+        return tableFeaturesRequest;
+    }
+
+    private static MultipartRequestTableFeatures decodeRequestTableFeatures(ByteBuf output) {
+        final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;
+        final byte OFP_MAX_TABLE_NAME_LEN = 32;
+        MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();
+        List<TableFeatures> tableFeaturesList = new ArrayList<>();
+        TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
+        tableFeaturesBuilder.setTableId(output.readUnsignedByte());
+        output.skipBytes(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY);
+        byte[] tableNameBytes = new byte[OFP_MAX_TABLE_NAME_LEN];
+        output.readBytes(tableNameBytes);
+        String tableName = new String(tableNameBytes);
+        tableFeaturesBuilder.setName(tableName.trim());
+        byte[] metadataMatch = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(metadataMatch);
+        tableFeaturesBuilder.setMetadataMatch(new BigInteger(metadataMatch));
+        byte[] metadataWrite = new byte[Long.SIZE/Byte.SIZE];
+        output.readBytes(metadataWrite);
+        tableFeaturesBuilder.setMetadataWrite(new BigInteger(metadataWrite));
+        tableFeaturesBuilder.setConfig(decodeTableConfig(output.readInt()));
+        tableFeaturesBuilder.setMaxEntries(output.readUnsignedInt());
+        TableFeatures tableFeature = tableFeaturesBuilder.build();
+        tableFeaturesList.add(tableFeature);
+        builder.setTableFeatures(tableFeaturesList);
+        MultipartRequestTableFeatures tableFeaturesRequest = builder.build();
+        return tableFeaturesRequest;
+    }
+
+    private static TableConfig decodeTableConfig(int input) {
+        final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0;
+        return new TableConfig(_oFPTCDEPRECATEDMASK);
+    }
+
+}