From 19cc35a1f5b73e3c890e38958303541feffb1384 Mon Sep 17 00:00:00 2001 From: Ed Warnicke Date: Sat, 16 Nov 2013 14:45:26 -0600 Subject: [PATCH] Fixing OF Multipart messages 1) So we have a MultipartRequestDesc message 2) So we can send MultipartRequestDesc messages Change-Id: I678e2bbfd6c4271dd57e73948ef2edfd3a9262bc Signed-off-by: Ed Warnicke --- .../src/main/yang/openflow-protocol.yang | 12 ++ .../connection/ConnectionAdapterImpl.java | 104 +++++++------ .../MultipartRequestMessageFactory.java | 69 +++++---- .../MultipartRequestMessageFactoryTest.java | 139 +++++++++++------- 4 files changed, 190 insertions(+), 134 deletions(-) diff --git a/openflow-protocol-api/src/main/yang/openflow-protocol.yang b/openflow-protocol-api/src/main/yang/openflow-protocol.yang index 518d1973..659cc1ed 100644 --- a/openflow-protocol-api/src/main/yang/openflow-protocol.yang +++ b/openflow-protocol-api/src/main/yang/openflow-protocol.yang @@ -541,6 +541,11 @@ module openflow-protocol { type oft:multipart-request-flags; } choice multipart-request-body { + case multipart-request-desc { + leaf desc { + type empty; + } + } case multipart-request-flow { leaf table-id { type uint8; @@ -1306,9 +1311,16 @@ module openflow-protocol { /* Multipart messages. */ //FIXME: Arent this wire protocol specific? + rpc send-multipart-request-message { + input { + uses multipart-request; + } + } + notification multipart-request-message { uses multipart-request; // reference "OFPT_MULTIPART_REQUEST message in Openflow Switch 1.3 Spec" + // TODO: This should probably be deprecated as I think it should have been an rpc - eaw@cisco.com } /* Controller/switch message */ notification multipart-reply-message { diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImpl.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImpl.java index 499e76e5..c4651e9b 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImpl.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/connection/ConnectionAdapterImpl.java @@ -48,6 +48,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.RoleRequestOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SendMultipartRequestMessageInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetAsyncInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.SetConfigInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.TableModInput; @@ -76,13 +77,13 @@ import com.google.common.util.concurrent.SettableFuture; * @author michal.polkorab */ public class ConnectionAdapterImpl implements ConnectionFacade { - + /** after this time, rpc future response objects will be thrown away (in minutes) */ public static final int RPC_RESPONSE_EXPIRATION = 1; protected static final Logger LOG = LoggerFactory .getLogger(ConnectionAdapterImpl.class); - + private static final String APPLICATION_TAG = "OPENFLOW_LIBRARY"; private static final String TAG = "OPENFLOW"; private Channel channel; @@ -95,7 +96,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { protected ConnectionReadyListener connectionReadyListener; /** - * default ctor + * default ctor */ public ConnectionAdapterImpl() { responseCache = CacheBuilder.newBuilder() @@ -104,7 +105,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { .removalListener(new ResponseRemovalListener()).build(); LOG.debug("ConnectionAdapter created"); } - + /** * @param channel the channel to be set - used for communication */ @@ -179,6 +180,11 @@ public class ConnectionAdapterImpl implements ConnectionFacade { return sendToSwitchFuture(input, "packet-out-input sending failed"); } + @Override + public Future> sendMultipartRequestMessage(SendMultipartRequestMessageInput input) { + return sendToSwitchFuture(input, "multi-part-request sending failed"); + } + @Override public Future> portMod(PortModInput input) { return sendToSwitchFuture(input, "port-mod-input sending failed"); @@ -233,7 +239,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { public void setMessageListener(OpenflowProtocolListener messageListener) { this.messageListener = messageListener; } - + @Override public void consume(DataObject message) { LOG.debug("ConsumeIntern msg"); @@ -296,38 +302,38 @@ public class ConnectionAdapterImpl implements ConnectionFacade { /** * sends given message to switch, sending result will be reported via return value * @param input message to send - * @param failureInfo describes, what type of message caused failure by sending + * @param failureInfo describes, what type of message caused failure by sending * @return future object,
    - *
  • if send successful, {@link RpcResult} without errors and successful + *
  • if send successful, {@link RpcResult} without errors and successful * status will be returned,
  • *
  • else {@link RpcResult} will contain errors and failed status
  • - *
+ * */ private SettableFuture> sendToSwitchFuture( DataObject input, final String failureInfo) { LOG.debug("going to flush"); ChannelFuture resultFuture = channel.writeAndFlush(input); LOG.debug("flushed"); - + ErrorSeverity errorSeverity = ErrorSeverity.ERROR; String errorMessage = "check switch connection"; return handleRpcChannelFuture(resultFuture, failureInfo, errorSeverity, errorMessage); } - + /** * sends given message to switch, sending result or switch response will be reported via return value * @param input message to send * @param responseClazz type of response - * @param failureInfo describes, what type of message caused failure by sending + * @param failureInfo describes, what type of message caused failure by sending * @return future object,
    *
  • if send fails, {@link RpcResult} will contain errors and failed status
  • - *
  • else {@link RpcResult} will be stored in responseCache and wait for particular timeout - * ({@link ConnectionAdapterImpl#RPC_RESPONSE_EXPIRATION}), + *
  • else {@link RpcResult} will be stored in responseCache and wait for particular timeout + * ({@link ConnectionAdapterImpl#RPC_RESPONSE_EXPIRATION}), *
    • either switch will manage to answer * and then corresponding response message will be set into returned future
    • *
    • or response in cache will expire and returned future will be cancelled
    *
  • - *
+ * */ private SettableFuture> sendToSwitchExpectRpcResultFuture( IN input, Class responseClazz, final String failureInfo) { @@ -337,11 +343,11 @@ public class ConnectionAdapterImpl implements ConnectionFacade { responseCache.put(key, rpcResult); ChannelFuture resultFuture = channel.writeAndFlush(input); LOG.debug("flushed"); - + ErrorSeverity errorSeverity = ErrorSeverity.ERROR; String errorMessage = "check switch connection"; - - return handleRpcChannelFutureWithResponse(resultFuture, failureInfo, errorSeverity, + + return handleRpcChannelFutureWithResponse(resultFuture, failureInfo, errorSeverity, errorMessage, input, responseClazz, rpcResult, key); } @@ -351,37 +357,37 @@ public class ConnectionAdapterImpl implements ConnectionFacade { * @return */ private SettableFuture> handleRpcChannelFuture( - ChannelFuture resultFuture, final String failureInfo, + ChannelFuture resultFuture, final String failureInfo, final ErrorSeverity errorSeverity, final String errorMessage) { - + final SettableFuture> rpcResult = SettableFuture.create(); LOG.debug("handlerpcchannelfuture"); resultFuture.addListener(new GenericFutureListener>() { - + @Override public void operationComplete( io.netty.util.concurrent.Future future) throws Exception { LOG.debug("operation complete"); Collection errors = Collections.emptyList(); - + if (future.cause() != null) { LOG.debug("future.cause != null"); - RpcError rpcError = buildRpcError(failureInfo, + RpcError rpcError = buildRpcError(failureInfo, errorSeverity, errorMessage, future.cause()); errors = Lists.newArrayList(rpcError); } - + rpcResult.set(Rpcs.getRpcResult( - future.isSuccess(), - (Void) null, + future.isSuccess(), + (Void) null, errors) ); } }); return rpcResult; } - + /** * @param resultFuture * @param failureInfo @@ -397,24 +403,24 @@ public class ConnectionAdapterImpl implements ConnectionFacade { final ErrorSeverity errorSeverity, final String errorMessage, final IN input, Class responseClazz, final SettableFuture> rpcResult, final RpcResponseKey key) { LOG.debug("handleRpcchanfuture with response"); - + resultFuture.addListener(new GenericFutureListener>() { - + @Override public void operationComplete( io.netty.util.concurrent.Future future) throws Exception { - + LOG.debug("operation complete"); Collection errors = Collections.emptyList(); if (future.cause() != null) { LOG.debug("ChannelFuture.cause != null"); - RpcError rpcError = buildRpcError(failureInfo, + RpcError rpcError = buildRpcError(failureInfo, errorSeverity, errorMessage, future.cause()); errors = Lists.newArrayList(rpcError); rpcResult.set(Rpcs.getRpcResult( - future.isSuccess(), - (OUT) null, + future.isSuccess(), + (OUT) null, errors) ); responseCache.invalidate(key); @@ -432,18 +438,18 @@ public class ConnectionAdapterImpl implements ConnectionFacade { /** * @param resultFuture * @param failureInfo - * @param errorSeverity - * @param message + * @param errorSeverity + * @param message * @return */ private static SettableFuture handleTransportChannelFuture( - ChannelFuture resultFuture, final String failureInfo, + ChannelFuture resultFuture, final String failureInfo, final ErrorSeverity errorSeverity, final String message) { - + final SettableFuture transportResult = SettableFuture.create(); - + resultFuture.addListener(new GenericFutureListener>() { - + @Override public void operationComplete( io.netty.util.concurrent.Future future) @@ -461,20 +467,20 @@ public class ConnectionAdapterImpl implements ConnectionFacade { * @param cause * @return */ - protected RpcError buildRpcError(String info, ErrorSeverity severity, String message, + protected RpcError buildRpcError(String info, ErrorSeverity severity, String message, Throwable cause) { - RpcError error = RpcErrors.getRpcError(APPLICATION_TAG, TAG, info, severity, message, + RpcError error = RpcErrors.getRpcError(APPLICATION_TAG, TAG, info, severity, message, ErrorType.RPC, cause); return error; } - + /** * @param cause * @return */ - protected RpcError buildTransportError(String info, ErrorSeverity severity, String message, + protected RpcError buildTransportError(String info, ErrorSeverity severity, String message, Throwable cause) { - RpcError error = RpcErrors.getRpcError(APPLICATION_TAG, TAG, info, severity, message, + RpcError error = RpcErrors.getRpcError(APPLICATION_TAG, TAG, info, severity, message, ErrorType.TRANSPORT, cause); return error; } @@ -499,7 +505,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { public void setSystemListener(SystemNotificationsListener systemListener) { this.systemListener = systemListener; } - + @Override public void checkListeners() { StringBuffer buffer = new StringBuffer(); @@ -512,7 +518,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { if (connectionReadyListener == null) { buffer.append("ConnectionReadyListener "); } - + if (buffer.length() > 0) { throw new IllegalStateException("Missing listeners: " + buffer.toString()); } @@ -540,7 +546,7 @@ public class ConnectionAdapterImpl implements ConnectionFacade { return null; } } - + @Override public void fireConnectionReadyNotification() { new Thread(new Runnable() { @@ -550,12 +556,12 @@ public class ConnectionAdapterImpl implements ConnectionFacade { } }).start(); } - - + + @Override public void setConnectionReadyListener( ConnectionReadyListener connectionReadyListener) { this.connectionReadyListener = connectionReadyListener; } - + } diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactory.java index dd7d5df4..fdd75422 100644 --- a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactory.java +++ b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactory.java @@ -28,6 +28,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm. import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage; 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.MultipartRequestDesc; 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.MultipartRequestFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup; @@ -48,12 +49,12 @@ public class MultipartRequestMessageFactory implements OFSerializer multipartRequestFlagsMap = new HashMap<>(); multipartRequestFlagsMap.put(0, flags.isOFPMPFREQMORE()); - + multipartRequestFlagsBitmask = ByteBufUtils.fillBitMaskFromMap(multipartRequestFlagsMap); return multipartRequestFlagsBitmask; } - + + private void encodeDescBody(MultipartRequestBody multipartRequestBody, + ByteBuf output) { + // The body of MultiPartRequestDesc is empty + + } + private static void encodeFlowBody(MultipartRequestBody multipartRequestBody, ByteBuf output) { final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3; final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4; @@ -208,11 +217,11 @@ public class MultipartRequestMessageFactory implements OFSerializer props) { if (props != null) { for (TableFeatureProperties property : props) { @@ -341,7 +350,7 @@ public class MultipartRequestMessageFactory implements OFSerializer tableConfigMap = new HashMap<>(); tableConfigMap.put(3, tableConfig.isOFPTCDEPRECATEDMASK()); - + tableConfigBitmask = ByteBufUtils.fillBitMaskFromMap(tableConfigMap); return tableConfigBitmask; } diff --git a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactoryTest.java b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactoryTest.java index 68b7ca09..2c22529b 100644 --- a/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactoryTest.java +++ b/openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/serialization/factories/MultipartRequestMessageFactoryTest.java @@ -18,8 +18,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessageBuilder; +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; @@ -45,7 +47,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 */ public class MultipartRequestMessageFactoryTest { private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4; - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -58,18 +60,18 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestFlow()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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); @@ -83,7 +85,7 @@ public class MultipartRequestMessageFactoryTest { //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; @@ -102,7 +104,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestFlow flow = builder.build(); return flow; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -115,24 +117,24 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestAggregate()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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); @@ -146,7 +148,7 @@ public class MultipartRequestMessageFactoryTest { //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; @@ -165,7 +167,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestAggregate flow = builder.build(); return flow; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -178,17 +180,17 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); //multipart request for table does not have body MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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 MultipartRequestMessageFactory} for correct translation from POJO @@ -201,25 +203,25 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestPortStats()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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(); @@ -228,7 +230,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestPortStats portRequest = builder.build(); return portRequest; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -241,18 +243,18 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestQueue()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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); @@ -260,7 +262,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestQueue queue = builder.build(); return queue; } - + private static MultipartRequestQueue decodeRequestQueue(ByteBuf output) { MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder(); builder.setPortNo(output.readUnsignedInt()); @@ -268,7 +270,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestQueue queue = builder.build(); return queue; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -281,25 +283,25 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestGroup()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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(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(); @@ -308,7 +310,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestGroup group = builder.build(); return group; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -321,25 +323,25 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestMeter()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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(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(); @@ -348,7 +350,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestMeter meter = builder.build(); return meter; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -361,25 +363,25 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestMeterConfig()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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(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(); @@ -388,7 +390,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestMeterConfig meterConfig = builder.build(); return meterConfig; } - + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -401,18 +403,18 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestExperimenter()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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); @@ -420,7 +422,7 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestExperimenter experimenter = builder.build(); return experimenter; } - + private static MultipartRequestExperimenter decodeRequestExperimenter(ByteBuf output) { MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder(); builder.setExperimenter(output.readUnsignedInt()); @@ -428,7 +430,34 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestExperimenter experimenter = builder.build(); return experimenter; } - + + /** + * @throws Exception + * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO + */ + @Test + public void testMultipartRequestDescMessageFactory() throws Exception { + MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder(); + BufferHelper.setupHeader(builder); + builder.setType(MultipartType.forValue(0)); + builder.setFlags(new MultipartRequestFlags(true)); + builder.setMultipartRequestBody(createRequestDesc()); + MultipartRequestMessage message = builder.build(); + + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); + MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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 MultipartRequestBody createRequestDesc() { + MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder(); + return builder.build(); + } + /** * @throws Exception * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO @@ -441,24 +470,24 @@ public class MultipartRequestMessageFactoryTest { builder.setFlags(new MultipartRequestFlags(true)); builder.setMultipartRequestBody(createRequestTableFeatures()); MultipartRequestMessage message = builder.build(); - + ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.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 tableFeaturesList = new ArrayList<>(); - TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder(); + 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})); @@ -471,7 +500,7 @@ public class MultipartRequestMessageFactoryTest { 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; @@ -498,10 +527,10 @@ public class MultipartRequestMessageFactoryTest { MultipartRequestTableFeatures tableFeaturesRequest = builder.build(); return tableFeaturesRequest; } - + private static TableConfig decodeTableConfig(int input) { - final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0; + final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0; return new TableConfig(_oFPTCDEPRECATEDMASK); } - + } -- 2.36.6