-/* 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 org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
+import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
+import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
+import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
+import org.opendaylight.openflowjava.protocol.api.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.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.MultipartRequestAggregateCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.desc._case.MultipartRequestDescBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.experimenter._case.MultipartRequestExperimenterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
+
+/**
+ * @author timotej.kubas
+ * @author michal.polkorab
+ */
+public class MultipartRequestInputFactoryTest {
+ /** padding in MultipartRequest message */
+ public static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;
+ private SerializerRegistry registry;
+ private OFSerializer<MultipartRequestInput> multipartFactory;
+
+ /**
+ * Initializes serializer registry and stores correct factory in field
+ */
+ @Before
+ public void startUp() {
+ registry = new SerializerRegistryImpl();
+ registry.init();
+ multipartFactory = registry.getSerializer(
+ new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartRequestInput.class));
+ }
+
+ /**
+ * @throws Exception
+ * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
+ */
+ @Test
+ public void testMultipartRequestFlowInputFactory() 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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 48);
+ 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 MultipartRequestFlowCase createRequestFlow() {
+ MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();
+ 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(1, cookie));
+ byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+ builder.setCookieMask(new BigInteger(1, cookieMask));
+ caseBuilder.setMultipartRequestFlow(builder.build());
+ //TODO match field
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestFlowCase decodeRequestFlow(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
+ final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
+ MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();
+ 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[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
+ output.readBytes(cookie);
+ builder.setCookie(new BigInteger(1, cookie));
+ byte[] cookieMask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
+ output.readBytes(cookieMask);
+ builder.setCookieMask(new BigInteger(1, cookieMask));
+ caseBuilder.setMultipartRequestFlow(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 48);
+ 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 MultipartRequestAggregateCase createRequestAggregate() {
+ MultipartRequestAggregateCaseBuilder caseBuilder = new MultipartRequestAggregateCaseBuilder();
+ 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(1, cookie));
+ byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
+ builder.setCookieMask(new BigInteger(1, cookieMask));
+ caseBuilder.setMultipartRequestAggregate(builder.build());
+ //TODO match field
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestAggregateCase decodeRequestAggregate(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;
+ final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;
+ MultipartRequestAggregateCaseBuilder caseBuilder = new MultipartRequestAggregateCaseBuilder();
+ 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[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
+ output.readBytes(cookie);
+ builder.setCookie(new BigInteger(1, cookie));
+ byte[] cookieMask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
+ output.readBytes(cookieMask);
+ builder.setCookieMask(new BigInteger(1, cookieMask));
+ caseBuilder.setMultipartRequestAggregate(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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 registry does not have body
+ MultipartRequestInput message = builder.build();
+
+ ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 16);
+ 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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 24);
+ 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 MultipartRequestPortStatsCase createRequestPortStats() {
+ MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
+ MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
+ builder.setPortNo(2251L);
+ caseBuilder.setMultipartRequestPortStats(builder.build());
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestPortStatsCase decodeRequestPortStats(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;
+ MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
+ MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
+ builder.setPortNo(output.readUnsignedInt());
+ output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);
+ caseBuilder.setMultipartRequestPortStats(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 24);
+ 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 MultipartRequestQueueCase createRequestQueue() {
+ MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+ MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
+ builder.setPortNo(2256L);
+ builder.setQueueId(2211L);
+ caseBuilder.setMultipartRequestQueue(builder.build());
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestQueueCase decodeRequestQueue(ByteBuf output) {
+ MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
+ MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
+ builder.setPortNo(output.readUnsignedInt());
+ builder.setQueueId(output.readUnsignedInt());
+ caseBuilder.setMultipartRequestQueue(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 24);
+ 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 MultipartRequestGroupCase createRequestGroup() {
+ MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
+ MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
+ builder.setGroupId(new GroupId(2258L));
+ caseBuilder.setMultipartRequestGroup(builder.build());
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestGroupCase decodeRequestGroup(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;
+ MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
+ MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
+ builder.setGroupId(new GroupId(output.readUnsignedInt()));
+ output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);
+ caseBuilder.setMultipartRequestGroup(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 24);
+ 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 MultipartRequestMeterCase createRequestMeter() {
+ MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
+ MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
+ builder.setMeterId(new MeterId(1121L));
+ caseBuilder.setMultipartRequestMeter(builder.build());
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestMeterCase decodeRequestMeter(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;
+ MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
+ MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
+ builder.setMeterId(new MeterId(output.readUnsignedInt()));
+ output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);
+ caseBuilder.setMultipartRequestMeter(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 24);
+ 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 MultipartRequestMeterConfigCase createRequestMeterConfig() {
+ MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
+ MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
+ builder.setMeterId(new MeterId(1133L));
+ caseBuilder.setMultipartRequestMeterConfig(builder.build());
+ return caseBuilder.build();
+ }
+
+ private static MultipartRequestMeterConfigCase decodeRequestMeterConfig(ByteBuf output) {
+ final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;
+ MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
+ MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
+ builder.setMeterId(new MeterId(output.readUnsignedInt()));
+ output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);
+ caseBuilder.setMultipartRequestMeterConfig(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * @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();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV13(out, (byte) 18, 16);
+ Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
+ Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
+ }
+
+ private static MultipartRequestBody createRequestDesc() {
+ MultipartRequestDescCaseBuilder caseBuilder = new MultipartRequestDescCaseBuilder();
+ MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();
+ caseBuilder.setMultipartRequestDesc(builder.build());
+ return caseBuilder.build();
+ }
+
+ /**
+ * Testing OF10StatsRequestInputFactory (Vendor) for correct serialization
+ * @throws Exception
+ */
+ @Test
+ public void testExperimenter() throws Exception {
+ MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+ BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);
+ builder.setType(MultipartType.OFPMPEXPERIMENTER);
+ builder.setFlags(new MultipartRequestFlags(false));
+ MultipartRequestExperimenterCaseBuilder caseBuilder = new MultipartRequestExperimenterCaseBuilder();
+ MultipartRequestExperimenterBuilder expBuilder = new MultipartRequestExperimenterBuilder();
+ expBuilder.setExperimenter(56L);
+ expBuilder.setExpType(148L);
+ byte[] expData = new byte[]{0, 1, 2, 3, 4, 5, 6, 7};
+ expBuilder.setData(expData);
+ caseBuilder.setMultipartRequestExperimenter(expBuilder.build());
+ builder.setMultipartRequestBody(caseBuilder.build());
+ MultipartRequestInput message = builder.build();
+
+ ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV10(out, (byte) 18, 32);
+ Assert.assertEquals("Wrong type", 0xFFFF, out.readUnsignedShort());
+ Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());
+ out.skipBytes(EncodeConstants.SIZE_OF_INT_IN_BYTES);
+ Assert.assertEquals("Wrong experimenter", 56, out.readUnsignedInt());
+ Assert.assertEquals("Wrong exp-type", 148, out.readUnsignedInt());
+ byte[] temp = new byte[8];
+ out.readBytes(temp);
+ Assert.assertArrayEquals("Wrong data", expData, temp);
+ Assert.assertTrue("Unread data", out.readableBytes() == 0);
+ }
+
+ /**
+ * Testing OF10StatsRequestInputFactory (Vendor) for correct serialization
+ * @throws Exception
+ */
+ @Test
+ public void testExperimenterWithoutData() throws Exception {
+ MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
+ BufferHelper.setupHeader(builder, EncodeConstants.OF10_VERSION_ID);
+ builder.setType(MultipartType.OFPMPEXPERIMENTER);
+ builder.setFlags(new MultipartRequestFlags(false));
+ MultipartRequestExperimenterCaseBuilder caseBuilder = new MultipartRequestExperimenterCaseBuilder();
+ MultipartRequestExperimenterBuilder expBuilder = new MultipartRequestExperimenterBuilder();
+ expBuilder.setExperimenter(56L);
+ expBuilder.setExpType(152L);
+ caseBuilder.setMultipartRequestExperimenter(expBuilder.build());
+ builder.setMultipartRequestBody(caseBuilder.build());
+ MultipartRequestInput message = builder.build();
+
+ ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
+ multipartFactory.serialize(message, out);
+
+ BufferHelper.checkHeaderV10(out, (byte) 18, 24);
+ Assert.assertEquals("Wrong type", 0xFFFF, out.readUnsignedShort());
+ Assert.assertEquals("Wrong flags", 0, out.readUnsignedShort());
+ out.skipBytes(EncodeConstants.SIZE_OF_INT_IN_BYTES);
+ Assert.assertEquals("Wrong experimenter", 56, out.readUnsignedInt());
+ Assert.assertEquals("Wrong exp-type", 152, out.readUnsignedInt());
+ Assert.assertTrue("Unread data", out.readableBytes() == 0);
+ }
+
+}