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