Quickfix - Hello versionBitmap
[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 testWith4BitVersionBitmap() throws Exception {\r
54         int lengthOfBitmap = 4;\r
55         HelloInputBuilder builder = new HelloInputBuilder();\r
56         BufferHelper.setupHeader(builder);\r
57         List<Elements> expectedElement = createElement(lengthOfBitmap);\r
58         builder.setElements(expectedElement);\r
59         HelloInput message = builder.build();\r
60         \r
61         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
62         HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
63         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
64         LOGGER.debug("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
65         \r
66         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
67         Elements element = readElement(out).get(0);\r
68         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
69         Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
70         Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
71     }\r
72     \r
73     /**\r
74      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
75      * @throws Exception \r
76      */\r
77     @Test\r
78     public void testWith64BitVersionBitmap() throws Exception {\r
79         int lengthOfBitmap = 64;\r
80         HelloInputBuilder builder = new HelloInputBuilder();\r
81         BufferHelper.setupHeader(builder);\r
82         List<Elements> expectedElement = createElement(lengthOfBitmap);\r
83         builder.setElements(expectedElement);\r
84         HelloInput message = builder.build();\r
85         \r
86         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
87         HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
88         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
89         LOGGER.debug("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
90         \r
91         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
92         Elements element = readElement(out).get(0);\r
93         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
94         Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
95         Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
96     }\r
97     \r
98     private static List<Elements> createElement(int lengthOfBitmap) {\r
99         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
100         List<Elements> elementsList = new ArrayList<>();\r
101         List<Boolean> booleanList = new ArrayList<>();\r
102         for (int i = 0; i < lengthOfBitmap; i++) {\r
103             booleanList.add(true);\r
104         }\r
105         elementsBuilder.setType(HelloElementType.forValue(1));\r
106         elementsBuilder.setVersionBitmap(booleanList);\r
107         elementsList.add(elementsBuilder.build());\r
108         return elementsList;\r
109     }\r
110     \r
111     private static List<Elements> createComparationElement(int lengthOfBitmap) {\r
112         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
113         List<Elements> elementsList = new ArrayList<>();\r
114         List<Boolean> booleanList = new ArrayList<>();\r
115         for (int i = 0; i < lengthOfBitmap; i++) {\r
116             booleanList.add(true);\r
117         }\r
118         if ((lengthOfBitmap % Integer.SIZE) != 0) {\r
119             for (int i = 0; i < (Integer.SIZE - (lengthOfBitmap % Integer.SIZE)); i++) {\r
120                 booleanList.add(false);\r
121             }\r
122         }\r
123         LOGGER.debug("boolsize " + booleanList.size());\r
124         elementsBuilder.setType(HelloElementType.forValue(1));\r
125         elementsBuilder.setVersionBitmap(booleanList);\r
126         elementsList.add(elementsBuilder.build());\r
127         return elementsList;\r
128     }\r
129     \r
130     private static List<Elements> readElement(ByteBuf input) {\r
131         List<Elements> elementsList = new ArrayList<>();\r
132         while (input.readableBytes() > 0) {\r
133             ElementsBuilder elementsBuilder = new ElementsBuilder();\r
134             int type = input.readUnsignedShort();\r
135             int elementLength = input.readUnsignedShort();\r
136             if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {\r
137                 elementsBuilder.setType(HelloElementType.forValue(type));\r
138                 int[] versionBitmap = new int[(elementLength - HelloInputMessageFactory.HELLO_ELEMENT_HEADER_SIZE) / 4];\r
139                 for (int i = 0; i < versionBitmap.length; i++) {\r
140                     versionBitmap[i] = (int) input.readUnsignedInt();\r
141                 }\r
142                 elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
143                 int paddingRemainder = elementLength % EncodeConstants.PADDING;\r
144                 if (paddingRemainder != 0) {\r
145                     input.readBytes(EncodeConstants.PADDING - paddingRemainder);\r
146                 }\r
147             }\r
148             elementsList.add(elementsBuilder.build());\r
149         }\r
150         return elementsList;\r
151     }\r
152     \r
153     private static List<Boolean> readVersionBitmap(int[] input){\r
154         List<Boolean> versionBitmapList = new ArrayList<>();\r
155         for (int i = 0; i < input.length; i++) {\r
156             int mask = input[i];\r
157             for (int j = 0; j < Integer.SIZE; j++) {\r
158                     versionBitmapList.add((mask & (1<<j)) != 0);\r
159             }\r
160         }\r
161         return versionBitmapList;\r
162     }\r
163 \r
164 }\r