Bug 2245 Fixed Avoid cycle between java packages
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartRequestInputFactoryTest.java
1 /*
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
10
11 import io.netty.buffer.ByteBuf;
12 import io.netty.buffer.UnpooledByteBufAllocator;
13
14 import java.math.BigInteger;
15
16 import org.junit.Assert;
17 import org.junit.Before;
18 import org.junit.Test;
19 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
20 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
21 import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
22 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
23 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
24 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInput;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestInputBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCase;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCase;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowCaseBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCase;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupCaseBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCase;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterCaseBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCase;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigCaseBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCase;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsCaseBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCase;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueCaseBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.aggregate._case.MultipartRequestAggregateBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.desc._case.MultipartRequestDescBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.flow._case.MultipartRequestFlowBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.group._case.MultipartRequestGroupBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter._case.MultipartRequestMeterBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.meter.config._case.MultipartRequestMeterConfigBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.port.stats._case.MultipartRequestPortStatsBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.queue._case.MultipartRequestQueueBuilder;
55
56 /**
57  * @author timotej.kubas
58  * @author michal.polkorab
59  */
60 public class MultipartRequestInputFactoryTest {
61     /** padding in MultipartRequest message */
62     public static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;
63     private SerializerRegistry registry;
64     private OFSerializer<MultipartRequestInput> multipartFactory;
65
66     /**
67      * Initializes serializer registry and stores correct factory in field
68      */
69     @Before
70     public void startUp() {
71         registry = new SerializerRegistryImpl();
72         registry.init();
73         multipartFactory = registry.getSerializer(
74                 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MultipartRequestInput.class));
75     }
76
77     /**
78      * @throws Exception
79      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
80      */
81     @Test
82     public void testMultipartRequestFlowInputFactory() throws Exception {
83         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
84         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
85         builder.setType(MultipartType.forValue(1));
86         builder.setFlags(new MultipartRequestFlags(true));
87         builder.setMultipartRequestBody(createRequestFlow());
88         MultipartRequestInput message = builder.build();
89
90         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
91         multipartFactory.serialize(message, out);
92
93         BufferHelper.checkHeaderV13(out, (byte) 18, 48);
94         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
95         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
96         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
97         Assert.assertEquals("Wrong flow", message.getMultipartRequestBody(), decodeRequestFlow(out));
98     }
99
100     private static MultipartRequestFlowCase createRequestFlow() {
101         MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();
102         MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
103         builder.setTableId((short) 8);
104         builder.setOutPort(85L);
105         builder.setOutGroup(95L);
106         byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
107         builder.setCookie(new BigInteger(1, cookie));
108         byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
109         builder.setCookieMask(new BigInteger(1, cookieMask));
110         caseBuilder.setMultipartRequestFlow(builder.build());
111         //TODO match field
112         return caseBuilder.build();
113     }
114
115     private static MultipartRequestFlowCase decodeRequestFlow(ByteBuf output) {
116         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;
117         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;
118         MultipartRequestFlowCaseBuilder caseBuilder = new MultipartRequestFlowCaseBuilder();
119         MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();
120         builder.setTableId(output.readUnsignedByte());
121         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);
122         builder.setOutPort(output.readUnsignedInt());
123         builder.setOutGroup(output.readUnsignedInt());
124         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);
125         byte[] cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
126         output.readBytes(cookie);
127         builder.setCookie(new BigInteger(1, cookie));
128         byte[] cookieMask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
129         output.readBytes(cookieMask);
130         builder.setCookieMask(new BigInteger(1, cookieMask));
131         caseBuilder.setMultipartRequestFlow(builder.build());
132         return caseBuilder.build();
133     }
134
135     /**
136      * @throws Exception
137      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
138      */
139     @Test
140     public void testMultipartRequestInputAggregateBodyFactory() throws Exception {
141         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
142         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
143         builder.setType(MultipartType.forValue(2));
144         builder.setFlags(new MultipartRequestFlags(true));
145         builder.setMultipartRequestBody(createRequestAggregate());
146         MultipartRequestInput message = builder.build();
147
148         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
149         multipartFactory.serialize(message, out);
150
151         BufferHelper.checkHeaderV13(out, (byte) 18, 48);
152         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
153         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
154         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
155         Assert.assertEquals("Wrong aggregate", message.getMultipartRequestBody(), decodeRequestAggregate(out));
156     }
157
158     private static MultipartRequestFlags decodeMultipartRequestFlags(short input){
159         final Boolean _oFPMPFREQMORE = (input & (1 << 0)) > 0;
160         return new MultipartRequestFlags(_oFPMPFREQMORE);
161     }
162
163
164     private static MultipartRequestAggregateCase createRequestAggregate() {
165         MultipartRequestAggregateCaseBuilder caseBuilder = new MultipartRequestAggregateCaseBuilder();
166         MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
167         builder.setTableId((short) 8);
168         builder.setOutPort(85L);
169         builder.setOutGroup(95L);
170         byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
171         builder.setCookie(new BigInteger(1, cookie));
172         byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
173         builder.setCookieMask(new BigInteger(1, cookieMask));
174         caseBuilder.setMultipartRequestAggregate(builder.build());
175       //TODO match field
176         return caseBuilder.build();
177     }
178
179     private static MultipartRequestAggregateCase decodeRequestAggregate(ByteBuf output) {
180         final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;
181         final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;
182         MultipartRequestAggregateCaseBuilder caseBuilder = new MultipartRequestAggregateCaseBuilder();
183         MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();
184         builder.setTableId(output.readUnsignedByte());
185         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01);
186         builder.setOutPort(output.readUnsignedInt());
187         builder.setOutGroup(output.readUnsignedInt());
188         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02);
189         byte[] cookie = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
190         output.readBytes(cookie);
191         builder.setCookie(new BigInteger(1, cookie));
192         byte[] cookieMask = new byte[EncodeConstants.SIZE_OF_LONG_IN_BYTES];
193         output.readBytes(cookieMask);
194         builder.setCookieMask(new BigInteger(1, cookieMask));
195         caseBuilder.setMultipartRequestAggregate(builder.build());
196         return caseBuilder.build();
197     }
198
199     /**
200      * @throws Exception
201      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
202      */
203     @Test
204     public void testMultipartRequestInputTableFactory() throws Exception {
205         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
206         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
207         builder.setType(MultipartType.forValue(3));
208         builder.setFlags(new MultipartRequestFlags(true));
209         //multipart request for registry does not have body
210         MultipartRequestInput message = builder.build();
211
212         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
213         multipartFactory.serialize(message, out);
214
215         BufferHelper.checkHeaderV13(out, (byte) 18, 16);
216         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
217         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
218         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
219     }
220
221     /**
222      * @throws Exception
223      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
224      */
225     @Test
226     public void testMultipartRequestPortStatsMessageFactory() throws Exception {
227         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
228         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
229         builder.setType(MultipartType.forValue(4));
230         builder.setFlags(new MultipartRequestFlags(true));
231         builder.setMultipartRequestBody(createRequestPortStats());
232         MultipartRequestInput message = builder.build();
233
234         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
235         multipartFactory.serialize(message, out);
236
237         BufferHelper.checkHeaderV13(out, (byte) 18, 24);
238         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
239         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
240         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
241         Assert.assertEquals("Wrong portStatsBody", message.getMultipartRequestBody(), decodeRequestPortStats(out));
242     }
243
244     private static MultipartRequestPortStatsCase createRequestPortStats() {
245         MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
246         MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
247         builder.setPortNo(2251L);
248         caseBuilder.setMultipartRequestPortStats(builder.build());
249         return caseBuilder.build();
250     }
251
252     private static MultipartRequestPortStatsCase decodeRequestPortStats(ByteBuf output) {
253         final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;
254         MultipartRequestPortStatsCaseBuilder caseBuilder = new MultipartRequestPortStatsCaseBuilder();
255         MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();
256         builder.setPortNo(output.readUnsignedInt());
257         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);
258         caseBuilder.setMultipartRequestPortStats(builder.build());
259         return caseBuilder.build();
260     }
261
262     /**
263      * @throws Exception
264      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
265      */
266     @Test
267     public void testMultipartRequestQueueMessageFactory() throws Exception {
268         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
269         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
270         builder.setType(MultipartType.forValue(5));
271         builder.setFlags(new MultipartRequestFlags(true));
272         builder.setMultipartRequestBody(createRequestQueue());
273         MultipartRequestInput message = builder.build();
274
275         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
276         multipartFactory.serialize(message, out);
277
278         BufferHelper.checkHeaderV13(out, (byte) 18, 24);
279         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
280         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
281         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
282         Assert.assertEquals("Wrong queueBody", message.getMultipartRequestBody(), decodeRequestQueue(out));
283     }
284
285     private static MultipartRequestQueueCase createRequestQueue() {
286         MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
287         MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
288         builder.setPortNo(2256L);
289         builder.setQueueId(2211L);
290         caseBuilder.setMultipartRequestQueue(builder.build());
291         return caseBuilder.build();
292     }
293
294     private static MultipartRequestQueueCase decodeRequestQueue(ByteBuf output) {
295         MultipartRequestQueueCaseBuilder caseBuilder = new MultipartRequestQueueCaseBuilder();
296         MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();
297         builder.setPortNo(output.readUnsignedInt());
298         builder.setQueueId(output.readUnsignedInt());
299         caseBuilder.setMultipartRequestQueue(builder.build());
300         return caseBuilder.build();
301     }
302
303     /**
304      * @throws Exception
305      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
306      */
307     @Test
308     public void testMultipartRequestGroupMessageFactory() throws Exception {
309         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
310         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
311         builder.setType(MultipartType.forValue(6));
312         builder.setFlags(new MultipartRequestFlags(true));
313         builder.setMultipartRequestBody(createRequestGroup());
314         MultipartRequestInput message = builder.build();
315
316         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
317         multipartFactory.serialize(message, out);
318
319         BufferHelper.checkHeaderV13(out, (byte) 18, 24);
320         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
321         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
322         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
323         Assert.assertEquals("Wrong groupBody", message.getMultipartRequestBody(), decodeRequestGroup(out));
324     }
325
326     private static MultipartRequestGroupCase createRequestGroup() {
327         MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
328         MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
329         builder.setGroupId(new GroupId(2258L));
330         caseBuilder.setMultipartRequestGroup(builder.build());
331         return caseBuilder.build();
332     }
333
334     private static MultipartRequestGroupCase decodeRequestGroup(ByteBuf output) {
335         final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;
336         MultipartRequestGroupCaseBuilder caseBuilder = new MultipartRequestGroupCaseBuilder();
337         MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();
338         builder.setGroupId(new GroupId(output.readUnsignedInt()));
339         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);
340         caseBuilder.setMultipartRequestGroup(builder.build());
341         return caseBuilder.build();
342     }
343
344     /**
345      * @throws Exception
346      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
347      */
348     @Test
349     public void testMultipartRequestMeterMessageFactory() throws Exception {
350         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
351         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
352         builder.setType(MultipartType.forValue(9));
353         builder.setFlags(new MultipartRequestFlags(true));
354         builder.setMultipartRequestBody(createRequestMeter());
355         MultipartRequestInput message = builder.build();
356
357         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
358         multipartFactory.serialize(message, out);
359
360         BufferHelper.checkHeaderV13(out, (byte) 18, 24);
361         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
362         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
363         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
364         Assert.assertEquals("Wrong meterBody", message.getMultipartRequestBody(), decodeRequestMeter(out));
365     }
366
367     private static MultipartRequestMeterCase createRequestMeter() {
368         MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
369         MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
370         builder.setMeterId(new MeterId(1121L));
371         caseBuilder.setMultipartRequestMeter(builder.build());
372         return caseBuilder.build();
373     }
374
375     private static MultipartRequestMeterCase decodeRequestMeter(ByteBuf output) {
376         final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;
377         MultipartRequestMeterCaseBuilder caseBuilder = new MultipartRequestMeterCaseBuilder();
378         MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();
379         builder.setMeterId(new MeterId(output.readUnsignedInt()));
380         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);
381         caseBuilder.setMultipartRequestMeter(builder.build());
382         return caseBuilder.build();
383     }
384
385     /**
386      * @throws Exception
387      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
388      */
389     @Test
390     public void testMultipartRequestMeterConfigMessageFactory() throws Exception {
391         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
392         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
393         builder.setType(MultipartType.forValue(10));
394         builder.setFlags(new MultipartRequestFlags(true));
395         builder.setMultipartRequestBody(createRequestMeterConfig());
396         MultipartRequestInput message = builder.build();
397
398         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
399         multipartFactory.serialize(message, out);
400
401         BufferHelper.checkHeaderV13(out, (byte) 18, 24);
402         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());
403         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
404         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);
405         Assert.assertEquals("Wrong meterConfigBody", message.getMultipartRequestBody(), decodeRequestMeterConfig(out));
406     }
407
408     private static MultipartRequestMeterConfigCase createRequestMeterConfig() {
409         MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
410         MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
411         builder.setMeterId(new MeterId(1133L));
412         caseBuilder.setMultipartRequestMeterConfig(builder.build());
413         return caseBuilder.build();
414     }
415
416     private static MultipartRequestMeterConfigCase decodeRequestMeterConfig(ByteBuf output) {
417         final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;
418         MultipartRequestMeterConfigCaseBuilder caseBuilder = new MultipartRequestMeterConfigCaseBuilder();
419         MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();
420         builder.setMeterId(new MeterId(output.readUnsignedInt()));
421         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);
422         caseBuilder.setMultipartRequestMeterConfig(builder.build());
423         return caseBuilder.build();
424     }
425
426     /**
427      * @throws Exception
428      * Testing of {@link MultipartRequestInputFactory} for correct translation from POJO
429      */
430     @Test
431     public void testMultipartRequestDescMessageFactory() throws Exception {
432         MultipartRequestInputBuilder builder = new MultipartRequestInputBuilder();
433         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
434         builder.setType(MultipartType.forValue(0));
435         builder.setFlags(new MultipartRequestFlags(true));
436         builder.setMultipartRequestBody(createRequestDesc());
437         MultipartRequestInput message = builder.build();
438
439         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
440         multipartFactory.serialize(message, out);
441
442         BufferHelper.checkHeaderV13(out, (byte) 18, 16);
443         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());
444         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));
445     }
446
447     private static MultipartRequestBody createRequestDesc() {
448         MultipartRequestDescCaseBuilder caseBuilder = new MultipartRequestDescCaseBuilder();
449         MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();
450         caseBuilder.setMultipartRequestDesc(builder.build());
451         return caseBuilder.build();
452     }
453
454 }