Fixing OF Multipart messages
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MultipartRequestMessageFactoryTest.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 import io.netty.buffer.UnpooledByteBufAllocator;\r
6 \r
7 import java.math.BigInteger;\r
8 import java.util.ArrayList;\r
9 import java.util.List;\r
10 \r
11 import junit.framework.Assert;\r
12 \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.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartRequestFlags;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableConfig;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessage;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartRequestMessageBuilder;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.MultipartRequestBody;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregate;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestAggregateBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestDescBuilder;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenter;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestExperimenterBuilder;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlow;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestFlowBuilder;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroup;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestGroupBuilder;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeter;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterBuilder;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfig;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestMeterConfigBuilder;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStats;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestPortStatsBuilder;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueue;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestQueueBuilder;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeatures;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.MultipartRequestTableFeaturesBuilder;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeatures;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.request.multipart.request.body.multipart.request.table.features.TableFeaturesBuilder;\r
43 \r
44 /**\r
45  * @author timotej.kubas\r
46  * @author michal.polkorab\r
47  */\r
48 public class MultipartRequestMessageFactoryTest {\r
49     private static final byte PADDING_IN_MULTIPART_REQUEST_MESSAGE = 4;\r
50 \r
51     /**\r
52      * @throws Exception\r
53      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
54      */\r
55     @Test\r
56     public void testMultipartRequestMessageFactory() throws Exception {\r
57         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
58         BufferHelper.setupHeader(builder);\r
59         builder.setType(MultipartType.forValue(1));\r
60         builder.setFlags(new MultipartRequestFlags(true));\r
61         builder.setMultipartRequestBody(createRequestFlow());\r
62         MultipartRequestMessage message = builder.build();\r
63 \r
64         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
65         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
66         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
67 \r
68         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
69         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
70         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
71         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
72         Assert.assertEquals("Wrong flow", message.getMultipartRequestBody(), decodeRequestFlow(out));\r
73     }\r
74 \r
75     private static MultipartRequestFlow createRequestFlow() {\r
76         MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();\r
77         builder.setTableId((short) 8);\r
78         builder.setOutPort(85L);\r
79         builder.setOutGroup(95L);\r
80         byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
81         builder.setCookie(new BigInteger(cookie));\r
82         byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
83         builder.setCookieMask(new BigInteger(cookieMask));\r
84         MultipartRequestFlow flow = builder.build();\r
85         //TODO match field\r
86         return flow;\r
87     }\r
88 \r
89     private static MultipartRequestFlow decodeRequestFlow(ByteBuf output) {\r
90         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01 = 3;\r
91         final byte PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02 = 4;\r
92         MultipartRequestFlowBuilder builder = new MultipartRequestFlowBuilder();\r
93         builder.setTableId(output.readUnsignedByte());\r
94         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_01);\r
95         builder.setOutPort(output.readUnsignedInt());\r
96         builder.setOutGroup(output.readUnsignedInt());\r
97         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_FLOW_BODY_02);\r
98         byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
99         output.readBytes(cookie);\r
100         builder.setCookie(new BigInteger(cookie));\r
101         byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];\r
102         output.readBytes(cookieMask);\r
103         builder.setCookieMask(new BigInteger(cookieMask));\r
104         MultipartRequestFlow flow = builder.build();\r
105         return flow;\r
106     }\r
107 \r
108     /**\r
109      * @throws Exception\r
110      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
111      */\r
112     @Test\r
113     public void testMultipartRequestMessageAggregateBodyFactory() throws Exception {\r
114         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
115         BufferHelper.setupHeader(builder);\r
116         builder.setType(MultipartType.forValue(2));\r
117         builder.setFlags(new MultipartRequestFlags(true));\r
118         builder.setMultipartRequestBody(createRequestAggregate());\r
119         MultipartRequestMessage message = builder.build();\r
120 \r
121         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
122         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
123         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
124 \r
125         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
126         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
127         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
128         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
129         Assert.assertEquals("Wrong aggregate", message.getMultipartRequestBody(), decodeRequestAggregate(out));\r
130     }\r
131 \r
132     private static MultipartRequestFlags decodeMultipartRequestFlags(short input){\r
133         final Boolean _oFPMPFREQMORE = (input & (1 << 0)) > 0;\r
134         return new MultipartRequestFlags(_oFPMPFREQMORE);\r
135     }\r
136 \r
137 \r
138     private static MultipartRequestAggregate createRequestAggregate() {\r
139         MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();\r
140         builder.setTableId((short) 8);\r
141         builder.setOutPort(85L);\r
142         builder.setOutGroup(95L);\r
143         byte[] cookie = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
144         builder.setCookie(new BigInteger(cookie));\r
145         byte[] cookieMask = new byte[]{0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};\r
146         builder.setCookieMask(new BigInteger(cookieMask));\r
147         MultipartRequestAggregate aggregate = builder.build();\r
148       //TODO match field\r
149         return aggregate;\r
150     }\r
151 \r
152     private static MultipartRequestAggregate decodeRequestAggregate(ByteBuf output) {\r
153         final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01 = 3;\r
154         final byte PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02 = 4;\r
155         MultipartRequestAggregateBuilder builder = new MultipartRequestAggregateBuilder();\r
156         builder.setTableId(output.readUnsignedByte());\r
157         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_01);\r
158         builder.setOutPort(output.readUnsignedInt());\r
159         builder.setOutGroup(output.readUnsignedInt());\r
160         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_AGGREGATE_BODY_02);\r
161         byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
162         output.readBytes(cookie);\r
163         builder.setCookie(new BigInteger(cookie));\r
164         byte[] cookieMask = new byte[Long.SIZE/Byte.SIZE];\r
165         output.readBytes(cookieMask);\r
166         builder.setCookieMask(new BigInteger(cookieMask));\r
167         MultipartRequestAggregate flow = builder.build();\r
168         return flow;\r
169     }\r
170 \r
171     /**\r
172      * @throws Exception\r
173      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
174      */\r
175     @Test\r
176     public void testMultipartRequestMessageTableFactory() throws Exception {\r
177         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
178         BufferHelper.setupHeader(builder);\r
179         builder.setType(MultipartType.forValue(3));\r
180         builder.setFlags(new MultipartRequestFlags(true));\r
181         //multipart request for table does not have body\r
182         MultipartRequestMessage message = builder.build();\r
183 \r
184         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
185         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
186         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
187 \r
188         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
189         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
190         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
191         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
192     }\r
193 \r
194     /**\r
195      * @throws Exception\r
196      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
197      */\r
198     @Test\r
199     public void testMultipartRequestPortStatsMessageFactory() throws Exception {\r
200         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
201         BufferHelper.setupHeader(builder);\r
202         builder.setType(MultipartType.forValue(4));\r
203         builder.setFlags(new MultipartRequestFlags(true));\r
204         builder.setMultipartRequestBody(createRequestPortStats());\r
205         MultipartRequestMessage message = builder.build();\r
206 \r
207         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
208         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
209         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
210 \r
211         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
212         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
213         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
214         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
215         Assert.assertEquals("Wrong portStatsBody", message.getMultipartRequestBody(), decodeRequestPortStats(out));\r
216     }\r
217 \r
218     private static MultipartRequestPortStats createRequestPortStats() {\r
219         MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();\r
220         builder.setPortNo(2251L);\r
221         MultipartRequestPortStats portStats = builder.build();\r
222         return portStats;\r
223     }\r
224 \r
225     private static MultipartRequestPortStats decodeRequestPortStats(ByteBuf output) {\r
226         final byte PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY = 4;\r
227         MultipartRequestPortStatsBuilder builder = new MultipartRequestPortStatsBuilder();\r
228         builder.setPortNo(output.readUnsignedInt());\r
229         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_PORTSTATS_BODY);\r
230         MultipartRequestPortStats portRequest = builder.build();\r
231         return portRequest;\r
232     }\r
233 \r
234     /**\r
235      * @throws Exception\r
236      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
237      */\r
238     @Test\r
239     public void testMultipartRequestQueueMessageFactory() throws Exception {\r
240         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
241         BufferHelper.setupHeader(builder);\r
242         builder.setType(MultipartType.forValue(5));\r
243         builder.setFlags(new MultipartRequestFlags(true));\r
244         builder.setMultipartRequestBody(createRequestQueue());\r
245         MultipartRequestMessage message = builder.build();\r
246 \r
247         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
248         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
249         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
250 \r
251         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
252         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
253         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
254         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
255         Assert.assertEquals("Wrong queueBody", message.getMultipartRequestBody(), decodeRequestQueue(out));\r
256     }\r
257 \r
258     private static MultipartRequestQueue createRequestQueue() {\r
259         MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();\r
260         builder.setPortNo(2256L);\r
261         builder.setQueueId(2211L);\r
262         MultipartRequestQueue queue = builder.build();\r
263         return queue;\r
264     }\r
265 \r
266     private static MultipartRequestQueue decodeRequestQueue(ByteBuf output) {\r
267         MultipartRequestQueueBuilder builder = new MultipartRequestQueueBuilder();\r
268         builder.setPortNo(output.readUnsignedInt());\r
269         builder.setQueueId(output.readUnsignedInt());\r
270         MultipartRequestQueue queue = builder.build();\r
271         return queue;\r
272     }\r
273 \r
274     /**\r
275      * @throws Exception\r
276      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
277      */\r
278     @Test\r
279     public void testMultipartRequestGroupMessageFactory() throws Exception {\r
280         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
281         BufferHelper.setupHeader(builder);\r
282         builder.setType(MultipartType.forValue(6));\r
283         builder.setFlags(new MultipartRequestFlags(true));\r
284         builder.setMultipartRequestBody(createRequestGroup());\r
285         MultipartRequestMessage message = builder.build();\r
286 \r
287         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
288         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
289         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
290 \r
291         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
292         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
293         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
294         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
295         Assert.assertEquals("Wrong groupBody", message.getMultipartRequestBody(), decodeRequestGroup(out));\r
296     }\r
297 \r
298     private static MultipartRequestGroup createRequestGroup() {\r
299         MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();\r
300         builder.setGroupId(2258L);\r
301         MultipartRequestGroup group = builder.build();\r
302         return group;\r
303     }\r
304 \r
305     private static MultipartRequestGroup decodeRequestGroup(ByteBuf output) {\r
306         final byte PADDING_IN_MULTIPART_REQUEST_GROUP_BODY = 4;\r
307         MultipartRequestGroupBuilder builder = new MultipartRequestGroupBuilder();\r
308         builder.setGroupId(output.readUnsignedInt());\r
309         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_GROUP_BODY);\r
310         MultipartRequestGroup group = builder.build();\r
311         return group;\r
312     }\r
313 \r
314     /**\r
315      * @throws Exception\r
316      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
317      */\r
318     @Test\r
319     public void testMultipartRequestMeterMessageFactory() throws Exception {\r
320         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
321         BufferHelper.setupHeader(builder);\r
322         builder.setType(MultipartType.forValue(9));\r
323         builder.setFlags(new MultipartRequestFlags(true));\r
324         builder.setMultipartRequestBody(createRequestMeter());\r
325         MultipartRequestMessage message = builder.build();\r
326 \r
327         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
328         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
329         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
330 \r
331         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
332         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
333         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
334         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
335         Assert.assertEquals("Wrong meterBody", message.getMultipartRequestBody(), decodeRequestMeter(out));\r
336     }\r
337 \r
338     private static MultipartRequestMeter createRequestMeter() {\r
339         MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();\r
340         builder.setMeterId(1121L);\r
341         MultipartRequestMeter meter = builder.build();\r
342         return meter;\r
343     }\r
344 \r
345     private static MultipartRequestMeter decodeRequestMeter(ByteBuf output) {\r
346         final byte PADDING_IN_MULTIPART_REQUEST_METER_BODY = 4;\r
347         MultipartRequestMeterBuilder builder = new MultipartRequestMeterBuilder();\r
348         builder.setMeterId(output.readUnsignedInt());\r
349         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_BODY);\r
350         MultipartRequestMeter meter = builder.build();\r
351         return meter;\r
352     }\r
353 \r
354     /**\r
355      * @throws Exception\r
356      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
357      */\r
358     @Test\r
359     public void testMultipartRequestMeterConfigMessageFactory() throws Exception {\r
360         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
361         BufferHelper.setupHeader(builder);\r
362         builder.setType(MultipartType.forValue(10));\r
363         builder.setFlags(new MultipartRequestFlags(true));\r
364         builder.setMultipartRequestBody(createRequestMeterConfig());\r
365         MultipartRequestMessage message = builder.build();\r
366 \r
367         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
368         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
369         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
370 \r
371         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
372         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readShort());\r
373         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
374         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
375         Assert.assertEquals("Wrong meterConfigBody", message.getMultipartRequestBody(), decodeRequestMeterConfig(out));\r
376     }\r
377 \r
378     private static MultipartRequestMeterConfig createRequestMeterConfig() {\r
379         MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();\r
380         builder.setMeterId(1133L);\r
381         MultipartRequestMeterConfig meterConfig = builder.build();\r
382         return meterConfig;\r
383     }\r
384 \r
385     private static MultipartRequestMeterConfig decodeRequestMeterConfig(ByteBuf output) {\r
386         final byte PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY = 4;\r
387         MultipartRequestMeterConfigBuilder builder = new MultipartRequestMeterConfigBuilder();\r
388         builder.setMeterId(output.readUnsignedInt());\r
389         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_METER_CONFIG_BODY);\r
390         MultipartRequestMeterConfig meterConfig = builder.build();\r
391         return meterConfig;\r
392     }\r
393 \r
394     /**\r
395      * @throws Exception\r
396      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
397      */\r
398     @Test\r
399     public void testMultipartRequestExperimenterMessageFactory() throws Exception {\r
400         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
401         BufferHelper.setupHeader(builder);\r
402         builder.setType(MultipartType.forValue(0xffff));\r
403         builder.setFlags(new MultipartRequestFlags(true));\r
404         builder.setMultipartRequestBody(createRequestExperimenter());\r
405         MultipartRequestMessage message = builder.build();\r
406 \r
407         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
408         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
409         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
410 \r
411         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
412         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
413         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
414         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
415         Assert.assertEquals("Wrong experimenterBody", message.getMultipartRequestBody(), decodeRequestExperimenter(out));\r
416     }\r
417 \r
418     private static MultipartRequestExperimenter createRequestExperimenter() {\r
419         MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();\r
420         builder.setExperimenter(1133L);\r
421         builder.setExpType(1135L);\r
422         MultipartRequestExperimenter experimenter = builder.build();\r
423         return experimenter;\r
424     }\r
425 \r
426     private static MultipartRequestExperimenter decodeRequestExperimenter(ByteBuf output) {\r
427         MultipartRequestExperimenterBuilder builder = new MultipartRequestExperimenterBuilder();\r
428         builder.setExperimenter(output.readUnsignedInt());\r
429         builder.setExpType(output.readUnsignedInt());\r
430         MultipartRequestExperimenter experimenter = builder.build();\r
431         return experimenter;\r
432     }\r
433 \r
434     /**\r
435      * @throws Exception\r
436      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
437      */\r
438     @Test\r
439     public void testMultipartRequestDescMessageFactory() throws Exception {\r
440         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
441         BufferHelper.setupHeader(builder);\r
442         builder.setType(MultipartType.forValue(0));\r
443         builder.setFlags(new MultipartRequestFlags(true));\r
444         builder.setMultipartRequestBody(createRequestDesc());\r
445         MultipartRequestMessage message = builder.build();\r
446 \r
447         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
448         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
449         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
450 \r
451         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
452         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
453         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
454     }\r
455 \r
456     private MultipartRequestBody createRequestDesc() {\r
457         MultipartRequestDescBuilder builder = new MultipartRequestDescBuilder();\r
458         return builder.build();\r
459     }\r
460 \r
461     /**\r
462      * @throws Exception\r
463      * Testing of {@link MultipartRequestMessageFactory} for correct translation from POJO\r
464      */\r
465     @Test\r
466     public void testMultipartRequestTableFeaturesMessageFactory() throws Exception {\r
467         MultipartRequestMessageBuilder builder = new MultipartRequestMessageBuilder();\r
468         BufferHelper.setupHeader(builder);\r
469         builder.setType(MultipartType.forValue(12));\r
470         builder.setFlags(new MultipartRequestFlags(true));\r
471         builder.setMultipartRequestBody(createRequestTableFeatures());\r
472         MultipartRequestMessage message = builder.build();\r
473 \r
474         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
475         MultipartRequestMessageFactory factory = MultipartRequestMessageFactory.getInstance();\r
476         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
477 \r
478         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
479         Assert.assertEquals("Wrong type", message.getType().getIntValue(), out.readUnsignedShort());\r
480         Assert.assertEquals("Wrong flags", message.getFlags(), decodeMultipartRequestFlags(out.readShort()));\r
481         out.skipBytes(PADDING_IN_MULTIPART_REQUEST_MESSAGE);\r
482 \r
483         MultipartRequestTableFeatures messageTableFeatures = (MultipartRequestTableFeatures) message.getMultipartRequestBody();\r
484         Assert.assertEquals("Wrong tableFeaturesBody", messageTableFeatures.getTableFeatures(), decodeRequestTableFeatures(out).getTableFeatures());\r
485     }\r
486 \r
487     private static MultipartRequestTableFeatures createRequestTableFeatures() {\r
488         MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();\r
489         List<TableFeatures> tableFeaturesList = new ArrayList<>();\r
490         TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();\r
491         tableFeaturesBuilder.setTableId((short) 8);\r
492         tableFeaturesBuilder.setName("AAAABBBBCCCCDDDDEEEEFFFFGGGG");\r
493         tableFeaturesBuilder.setMetadataMatch(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));\r
494         tableFeaturesBuilder.setMetadataWrite(new BigInteger(new byte[] {0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01}));\r
495         tableFeaturesBuilder.setConfig(new TableConfig(true));\r
496         tableFeaturesBuilder.setMaxEntries(65L);\r
497         TableFeatures tableFeature = tableFeaturesBuilder.build();\r
498         tableFeaturesList.add(tableFeature);\r
499         builder.setTableFeatures(tableFeaturesList);\r
500         MultipartRequestTableFeatures tableFeaturesRequest = builder.build();\r
501         return tableFeaturesRequest;\r
502     }\r
503 \r
504     private static MultipartRequestTableFeatures decodeRequestTableFeatures(ByteBuf output) {\r
505         final byte PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY = 5;\r
506         final byte OFP_MAX_TABLE_NAME_LEN = 32;\r
507         MultipartRequestTableFeaturesBuilder builder = new MultipartRequestTableFeaturesBuilder();\r
508         List<TableFeatures> tableFeaturesList = new ArrayList<>();\r
509         TableFeaturesBuilder tableFeaturesBuilder = new TableFeaturesBuilder();\r
510         tableFeaturesBuilder.setTableId(output.readUnsignedByte());\r
511         output.skipBytes(PADDING_IN_MULTIPART_REQUEST_TABLE_FEATURES_BODY);\r
512         byte[] tableNameBytes = new byte[OFP_MAX_TABLE_NAME_LEN];\r
513         output.readBytes(tableNameBytes);\r
514         String tableName = new String(tableNameBytes);\r
515         tableFeaturesBuilder.setName(tableName.trim());\r
516         byte[] metadataMatch = new byte[Long.SIZE/Byte.SIZE];\r
517         output.readBytes(metadataMatch);\r
518         tableFeaturesBuilder.setMetadataMatch(new BigInteger(metadataMatch));\r
519         byte[] metadataWrite = new byte[Long.SIZE/Byte.SIZE];\r
520         output.readBytes(metadataWrite);\r
521         tableFeaturesBuilder.setMetadataWrite(new BigInteger(metadataWrite));\r
522         tableFeaturesBuilder.setConfig(decodeTableConfig(output.readInt()));\r
523         tableFeaturesBuilder.setMaxEntries(output.readUnsignedInt());\r
524         TableFeatures tableFeature = tableFeaturesBuilder.build();\r
525         tableFeaturesList.add(tableFeature);\r
526         builder.setTableFeatures(tableFeaturesList);\r
527         MultipartRequestTableFeatures tableFeaturesRequest = builder.build();\r
528         return tableFeaturesRequest;\r
529     }\r
530 \r
531     private static TableConfig decodeTableConfig(int input) {\r
532         final Boolean _oFPTCDEPRECATEDMASK = (input & (1 << 3)) > 0;\r
533         return new TableConfig(_oFPTCDEPRECATEDMASK);\r
534     }\r
535 \r
536 }\r