1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */
\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
\r
4 import io.netty.buffer.ByteBuf;
\r
5 import io.netty.buffer.UnpooledByteBufAllocator;
\r
7 import java.math.BigInteger;
\r
8 import java.util.ArrayList;
\r
9 import java.util.List;
\r
11 import junit.framework.Assert;
\r
13 import org.junit.Test;
\r
14 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;
\r
15 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
\r
16 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;
\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateBuilder;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescBuilder;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowBuilder;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueBuilder;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeaturesBuilder;
\r
46 * @author timotej.kubas
\r
47 * @author michal.polkorab
\r
49 public class MultipartRequestInputFactoryTest {
\r
50 private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;
\r
54 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
57 public void testMultipartRequestInputFactory() throws Exception {
\r
58 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
59 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
60 builder.setType(MultipartType.forValue(1));
\r
61 builder.setFlags(new MultipartRequestFlags(true));
\r
62 builder.setMultipartRequestBody(createRequestFlow());
\r
63 MultipartRequestInput message = builder.build();
\r
65 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
66 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
67 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
69 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
70 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
71 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
72 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
73 Assert.assertEquals("Wrong flow", message.getMultipartRequestBody(), decodeRequestFlow(out));
\r
76 private static MultipartRequestFlow createRequestFlow() {
\r
77 MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
\r
78 builder.setTableId((short) 8);
\r
79 builder.setOutPort(85L);
\r
80 builder.setOutGroup(95L);
\r
81 byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
\r
82 builder.setCookie(new BigInteger(cookie));
\r
83 byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
\r
84 builder.setCookieMask(new BigInteger(cookieMask));
\r
85 MultipartRequestFlow flow = builder.build();
\r
90 private static MultipartRequestFlow decodeRequestFlow(ByteBuf output) {
\r
91 final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
\r
92 final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
\r
93 MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
\r
94 builder.setTableId(output.readUnsignedByte());
\r
95 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);
\r
96 builder.setOutPort(output.readUnsignedInt());
\r
97 builder.setOutGroup(output.readUnsignedInt());
\r
98 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);
\r
99 byte[] cookie = new byte[Long.SIZE/Byte.SIZE];
\r
100 output.readBytes(cookie);
\r
101 builder.setCookie(new BigInteger(cookie));
\r
102 byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];
\r
103 output.readBytes(cookieMask);
\r
104 builder.setCookieMask(new BigInteger(cookieMask));
\r
105 MultipartRequestFlow flow = builder.build();
\r
110 * @throws Exception
\r
111 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
114 public void testMultipartRequestInputAggregateBodyFactory() throws Exception {
\r
115 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
116 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
117 builder.setType(MultipartType.forValue(2));
\r
118 builder.setFlags(new MultipartRequestFlags(true));
\r
119 builder.setMultipartRequestBody(createRequestAggregate());
\r
120 MultipartRequestInput message = builder.build();
\r
122 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
123 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
124 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
126 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
127 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
128 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
129 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
130 Assert.assertEquals("Wrong aggregate", message.getMultipartRequestBody(), decodeRequestAggregate(out));
\r
133 private static MultipartRequestFlags decodeMultipartRequestFlags(short input){
\r
134 final Boolean _oFPMPFREQMORE = (input & (1 << 0)) > 0;
\r
135 return new MultipartRequestFlags(_oFPMPFREQMORE);
\r
139 private static MultipartRequestAggregate createRequestAggregate() {
\r
140 MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
\r
141 builder.setTableId((short) 8);
\r
142 builder.setOutPort(85L);
\r
143 builder.setOutGroup(95L);
\r
144 byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
\r
145 builder.setCookie(new BigInteger(cookie));
\r
146 byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
\r
147 builder.setCookieMask(new BigInteger(cookieMask));
\r
148 MultipartRequestAggregate aggregate = builder.build();
\r
153 private static MultipartRequestAggregate decodeRequestAggregate(ByteBuf output) {
\r
154 final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;
\r
155 final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;
\r
156 MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
\r
157 builder.setTableId(output.readUnsignedByte());
\r
158 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01);
\r
159 builder.setOutPort(output.readUnsignedInt());
\r
160 builder.setOutGroup(output.readUnsignedInt());
\r
161 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02);
\r
162 byte[] cookie = new byte[Long.SIZE/Byte.SIZE];
\r
163 output.readBytes(cookie);
\r
164 builder.setCookie(new BigInteger(cookie));
\r
165 byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];
\r
166 output.readBytes(cookieMask);
\r
167 builder.setCookieMask(new BigInteger(cookieMask));
\r
168 MultipartRequestAggregate flow = builder.build();
\r
173 * @throws Exception
\r
174 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
177 public void testMultipartRequestInputTableFactory() throws Exception {
\r
178 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
179 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
180 builder.setType(MultipartType.forValue(3));
\r
181 builder.setFlags(new MultipartRequestFlags(true));
\r
182 //multipart request for table does not have body
\r
183 MultipartRequestInput message = builder.build();
\r
185 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
186 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
187 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
189 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
190 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
191 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
192 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
196 * @throws Exception
\r
197 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
200 public void testMultipartRequestPortStatsMessageFactory() throws Exception {
\r
201 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
202 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
203 builder.setType(MultipartType.forValue(4));
\r
204 builder.setFlags(new MultipartRequestFlags(true));
\r
205 builder.setMultipartRequestBody(createRequestPortStats());
\r
206 MultipartRequestInput message = builder.build();
\r
208 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
209 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
210 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
212 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
213 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
214 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
215 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
216 Assert.assertEquals("Wrong portStatsBody", message.getMultipartRequestBody(), decodeRequestPortStats(out));
\r
219 private static MultipartRequestPortStats createRequestPortStats() {
\r
220 MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
\r
221 builder.setPortNo(2251L);
\r
222 MultipartRequestPortStats portStats = builder.build();
\r
226 private static MultipartRequestPortStats decodeRequestPortStats(ByteBuf output) {
\r
227 final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;
\r
228 MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
\r
229 builder.setPortNo(output.readUnsignedInt());
\r
230 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);
\r
231 MultipartRequestPortStats portRequest = builder.build();
\r
232 return portRequest;
\r
236 * @throws Exception
\r
237 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
240 public void testMultipartRequestQueueMessageFactory() throws Exception {
\r
241 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
242 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
243 builder.setType(MultipartType.forValue(5));
\r
244 builder.setFlags(new MultipartRequestFlags(true));
\r
245 builder.setMultipartRequestBody(createRequestQueue());
\r
246 MultipartRequestInput message = builder.build();
\r
248 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
249 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
250 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
252 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
253 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
254 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
255 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
256 Assert.assertEquals("Wrong queueBody", message.getMultipartRequestBody(), decodeRequestQueue(out));
\r
259 private static MultipartRequestQueue createRequestQueue() {
\r
260 MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
\r
261 builder.setPortNo(2256L);
\r
262 builder.setQueueId(2211L);
\r
263 MultipartRequestQueue queue = builder.build();
\r
267 private static MultipartRequestQueue decodeRequestQueue(ByteBuf output) {
\r
268 MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
\r
269 builder.setPortNo(output.readUnsignedInt());
\r
270 builder.setQueueId(output.readUnsignedInt());
\r
271 MultipartRequestQueue queue = builder.build();
\r
276 * @throws Exception
\r
277 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
280 public void testMultipartRequestGroupMessageFactory() throws Exception {
\r
281 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
282 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
283 builder.setType(MultipartType.forValue(6));
\r
284 builder.setFlags(new MultipartRequestFlags(true));
\r
285 builder.setMultipartRequestBody(createRequestGroup());
\r
286 MultipartRequestInput message = builder.build();
\r
288 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
289 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
290 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
292 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
293 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
294 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
295 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
296 Assert.assertEquals("Wrong groupBody", message.getMultipartRequestBody(), decodeRequestGroup(out));
\r
299 private static MultipartRequestGroup createRequestGroup() {
\r
300 MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
\r
301 builder.setGroupId(2258L);
\r
302 MultipartRequestGroup group = builder.build();
\r
306 private static MultipartRequestGroup decodeRequestGroup(ByteBuf output) {
\r
307 final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;
\r
308 MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
\r
309 builder.setGroupId(output.readUnsignedInt());
\r
310 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);
\r
311 MultipartRequestGroup group = builder.build();
\r
316 * @throws Exception
\r
317 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
320 public void testMultipartRequestMeterMessageFactory() throws Exception {
\r
321 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
322 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
323 builder.setType(MultipartType.forValue(9));
\r
324 builder.setFlags(new MultipartRequestFlags(true));
\r
325 builder.setMultipartRequestBody(createRequestMeter());
\r
326 MultipartRequestInput message = builder.build();
\r
328 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
329 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
330 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
332 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
333 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
334 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
335 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
336 Assert.assertEquals("Wrong meterBody", message.getMultipartRequestBody(), decodeRequestMeter(out));
\r
339 private static MultipartRequestMeter createRequestMeter() {
\r
340 MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
\r
341 builder.setMeterId(1121L);
\r
342 MultipartRequestMeter meter = builder.build();
\r
346 private static MultipartRequestMeter decodeRequestMeter(ByteBuf output) {
\r
347 final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;
\r
348 MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
\r
349 builder.setMeterId(output.readUnsignedInt());
\r
350 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);
\r
351 MultipartRequestMeter meter = builder.build();
\r
356 * @throws Exception
\r
357 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
360 public void testMultipartRequestMeterConfigMessageFactory() throws Exception {
\r
361 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
362 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
363 builder.setType(MultipartType.forValue(10));
\r
364 builder.setFlags(new MultipartRequestFlags(true));
\r
365 builder.setMultipartRequestBody(createRequestMeterConfig());
\r
366 MultipartRequestInput message = builder.build();
\r
368 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
369 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
370 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
372 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
373 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
\r
374 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
375 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
376 Assert.assertEquals("Wrong meterConfigBody", message.getMultipartRequestBody(), decodeRequestMeterConfig(out));
\r
379 private static MultipartRequestMeterConfig createRequestMeterConfig() {
\r
380 MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
\r
381 builder.setMeterId(1133L);
\r
382 MultipartRequestMeterConfig meterConfig = builder.build();
\r
383 return meterConfig;
\r
386 private static MultipartRequestMeterConfig decodeRequestMeterConfig(ByteBuf output) {
\r
387 final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;
\r
388 MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
\r
389 builder.setMeterId(output.readUnsignedInt());
\r
390 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);
\r
391 MultipartRequestMeterConfig meterConfig = builder.build();
\r
392 return meterConfig;
\r
396 * @throws Exception
\r
397 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
400 public void testMultipartRequestExperimenterMessageFactory() throws Exception {
\r
401 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
402 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
403 builder.setType(MultipartType.forValue(0xffff));
\r
404 builder.setFlags(new MultipartRequestFlags(true));
\r
405 builder.setMultipartRequestBody(createRequestExperimenter());
\r
406 MultipartRequestInput message = builder.build();
\r
408 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
409 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
410 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
412 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
413 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
\r
414 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
415 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
416 Assert.assertEquals("Wrong experimenterBody", message.getMultipartRequestBody(), decodeRequestExperimenter(out));
\r
419 private static MultipartRequestExperimenter createRequestExperimenter() {
\r
420 MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();
\r
421 builder.setExperimenter(1133L);
\r
422 builder.setExpType(1135L);
\r
423 MultipartRequestExperimenter experimenter = builder.build();
\r
424 return experimenter;
\r
427 private static MultipartRequestExperimenter decodeRequestExperimenter(ByteBuf output) {
\r
428 MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();
\r
429 builder.setExperimenter(output.readUnsignedInt());
\r
430 builder.setExpType(output.readUnsignedInt());
\r
431 MultipartRequestExperimenter experimenter = builder.build();
\r
432 return experimenter;
\r
436 * @throws Exception
\r
437 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
440 public void testMultipartRequestDescMessageFactory() throws Exception {
\r
441 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
442 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
443 builder.setType(MultipartType.forValue(0));
\r
444 builder.setFlags(new MultipartRequestFlags(true));
\r
445 builder.setMultipartRequestBody(createRequestDesc());
\r
446 MultipartRequestInput message = builder.build();
\r
448 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
449 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
450 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
452 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
453 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
\r
454 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
457 private static MultipartRequestBody createRequestDesc() {
\r
458 MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();
\r
459 return builder.build();
\r
463 * @throws Exception
\r
464 * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
\r
467 public void testMultipartRequestTableFeaturesMessageFactory() throws Exception {
\r
468 MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
\r
469 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
\r
470 builder.setType(MultipartType.forValue(12));
\r
471 builder.setFlags(new MultipartRequestFlags(true));
\r
472 builder.setMultipartRequestBody(createRequestTableFeatures());
\r
473 MultipartRequestInput message = builder.build();
\r
475 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
476 MultipartRequestInputFactory factory = MultipartRequestInputFactory.getInstance();
\r
477 factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);
\r
479 BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));
\r
480 Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
\r
481 Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
\r
482 out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
\r
484 MultipartRequestTableFeatures messageTableFeatures = (MultipartRequestTableFeatures) message.getMultipartRequestBody();
\r
485 Assert.assertEquals("Wrong tableFeaturesBody", messageTableFeatures.getTableFeatures(), decodeRequestTableFeatures(out).getTableFeatures());
\r
488 private static MultipartRequestTableFeatures createRequestTableFeatures() {
\r
489 MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();
\r
490 List<TableFeatures> tableFeaturesList = new ArrayList<>();
\r
491 TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
\r
492 tableFeaturesBuilder.setTableId((short) 8);
\r
493 tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");
\r
494 tableFeaturesBuilder.setMetadataMatch(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));
\r
495 tableFeaturesBuilder.setMetadataWrite(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));
\r
496 tableFeaturesBuilder.setConfig(new TableConfig(true));
\r
497 tableFeaturesBuilder.setMaxEntries(65L);
\r
498 TableFeatures tableFeature = tableFeaturesBuilder.build();
\r
499 tableFeaturesList.add(tableFeature);
\r
500 builder.setTableFeatures(tableFeaturesList);
\r
501 MultipartRequestTableFeatures tableFeaturesRequest = builder.build();
\r
502 return tableFeaturesRequest;
\r
505 private static MultipartRequestTableFeatures decodeRequestTableFeatures(ByteBuf output) {
\r
506 final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;
\r
507 final byte OFP_MAX_TABLE_NAME_LEN = 32;
\r
508 MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();
\r
509 List<TableFeatures> tableFeaturesList = new ArrayList<>();
\r
510 TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();
\r
511 tableFeaturesBuilder.setTableId(output.readUnsignedByte());
\r
512 output.skipBytes(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY);
\r
513 byte[] tableNameBytes = new byte[OFP_MAX_TABLE_NAME_LEN];
\r
514 output.readBytes(tableNameBytes);
\r
515 String tableName = new String(tableNameBytes);
\r
516 tableFeaturesBuilder.setName(tableName.trim());
\r
517 byte[] metadataMatch = new byte[Long.SIZE/Byte.SIZE];
\r
518 output.readBytes(metadataMatch);
\r
519 tableFeaturesBuilder.setMetadataMatch(new BigInteger(metadataMatch));
\r
520 byte[] metadataWrite = new byte[Long.SIZE/Byte.SIZE];
\r
521 output.readBytes(metadataWrite);
\r
522 tableFeaturesBuilder.setMetadataWrite(new BigInteger(metadataWrite));
\r
523 tableFeaturesBuilder.setConfig(decodeTableConfig(output.readInt()));
\r
524 tableFeaturesBuilder.setMaxEntries(output.readUnsignedInt());
\r
525 TableFeatures tableFeature = tableFeaturesBuilder.build();
\r
526 tableFeaturesList.add(tableFeature);
\r
527 builder.setTableFeatures(tableFeaturesList);
\r
528 MultipartRequestTableFeatures tableFeaturesRequest = builder.build();
\r
529 return tableFeaturesRequest;
\r
532 private static TableConfig decodeTableConfig(int input) {
\r
533 final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0;
\r
534 return new TableConfig(_oFPTCDEPRECATEDMASK);
\r