hello-VersionBitmap fixed
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / HelloInputMessageFactoryTest.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.util.ArrayList;\r
8 import java.util.List;\r
9 \r
10 import org.junit.Assert;\r
11 import org.junit.Test;\r
12 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
13 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
14 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInputBuilder;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;\r
20 import org.slf4j.Logger;\r
21 import org.slf4j.LoggerFactory;\r
22 \r
23 /**\r
24  * @author michal.polkorab\r
25  *\r
26  */\r
27 public class HelloInputMessageFactoryTest {\r
28 \r
29     private static final Logger LOGGER = LoggerFactory.getLogger(HelloInputMessageFactoryTest.class);\r
30     \r
31     /**\r
32      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
33      * @throws Exception \r
34      */\r
35     @Test\r
36     public void testWithoutElementsSet() throws Exception {\r
37         HelloInputBuilder hib = new HelloInputBuilder();\r
38         BufferHelper.setupHeader(hib);\r
39         HelloInput hi = hib.build();\r
40         \r
41         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
42         HelloInputMessageFactory himf = HelloInputMessageFactory.getInstance();\r
43         himf.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, hi);\r
44         \r
45         BufferHelper.checkHeaderV13(out, himf.getMessageType(), himf.computeLength(hi));\r
46     }\r
47     \r
48     /**\r
49      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
50      * @throws Exception \r
51      */\r
52     @Test\r
53     public void testWithElementsSet() throws Exception {\r
54         HelloInputBuilder builder = new HelloInputBuilder();\r
55         BufferHelper.setupHeader(builder);\r
56         List<Elements> expectedElement = createElement();\r
57         builder.setElements(expectedElement);\r
58         HelloInput message = builder.build();\r
59         \r
60         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
61         HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
62         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
63         LOGGER.info("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
64         \r
65         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
66         Elements element = readElement(out).get(0);\r
67         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
68         LOGGER.info(expectedElement.get(0).getVersionBitmap().toString());\r
69         LOGGER.info(element.getVersionBitmap().toString());\r
70         Assert.assertArrayEquals("Wrong element bitmap", expectedElement.get(0).getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
71     }\r
72     \r
73     private static List<Elements> createElement() {\r
74         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
75         List<Elements> elementsList = new ArrayList<>();\r
76         List<Boolean> booleanList = new ArrayList<>();\r
77 \r
78         for (int i = 0; i < 64; i++) {\r
79             booleanList.add(true);\r
80         }\r
81 \r
82         elementsBuilder.setType(HelloElementType.forValue(1));\r
83         elementsBuilder.setVersionBitmap(booleanList);\r
84         elementsList.add(elementsBuilder.build());\r
85         \r
86         return elementsList;\r
87     }\r
88     \r
89     private static List<Elements> readElement(ByteBuf input) {\r
90         List<Elements> elementsList = new ArrayList<>();\r
91         while (input.readableBytes() > 0) {\r
92             ElementsBuilder elementsBuilder = new ElementsBuilder();\r
93             int type = input.readUnsignedShort();\r
94             int elementLength = input.readUnsignedShort();\r
95             if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {\r
96                 elementsBuilder.setType(HelloElementType.forValue(type));\r
97                 int[] versionBitmap = new int[(elementLength - HelloInputMessageFactory.HELLO_ELEMENT_HEADER_SIZE) / 4];\r
98                 for (int i = 0; i < versionBitmap.length; i++) {\r
99                     versionBitmap[i] = (int) input.readUnsignedInt();\r
100                 }\r
101                 elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
102                 int paddingRemainder = elementLength % EncodeConstants.PADDING;\r
103                 if (paddingRemainder != 0) {\r
104                     input.readBytes(EncodeConstants.PADDING - paddingRemainder);\r
105                 }\r
106             }\r
107             elementsList.add(elementsBuilder.build());\r
108         }\r
109         return elementsList;\r
110     }\r
111     \r
112     private static List<Boolean> readVersionBitmap(int[] input){\r
113         LOGGER.info("input.length: " + input.length);\r
114         List<Boolean> versionBitmapList = new ArrayList<>();\r
115         for (int i = 0; i < input.length; i++) {\r
116             int mask = input[i];\r
117             for (int j = 0; j < Integer.SIZE; j++) {\r
118                     versionBitmapList.add((mask & (1<<j)) != 0);\r
119             }\r
120         }\r
121         LOGGER.info("versionbitmaplist.size: " + versionBitmapList.size());\r
122         return versionBitmapList;\r
123     }\r
124 \r
125 }\r