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