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