Error code support for ErrorMessage
[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.openflowjava.protocol.impl.util.EncodeConstants;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInput;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloInputBuilder;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;\r
21 import org.slf4j.Logger;\r
22 import org.slf4j.LoggerFactory;\r
23 \r
24 /**\r
25  * @author michal.polkorab\r
26  *\r
27  */\r
28 public class HelloInputMessageFactoryTest {\r
29 \r
30     private static final Logger LOGGER = LoggerFactory.getLogger(HelloInputMessageFactoryTest.class);\r
31     \r
32     /**\r
33      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
34      * @throws Exception \r
35      */\r
36     @Test\r
37     public void testWithoutElementsSet() throws Exception {\r
38         HelloInputBuilder hib = new HelloInputBuilder();\r
39         BufferHelper.setupHeader(hib, EncodeConstants.OF13_VERSION_ID);\r
40         HelloInput hi = hib.build();\r
41         \r
42         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
43         HelloInputMessageFactory himf = HelloInputMessageFactory.getInstance();\r
44         himf.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, hi);\r
45         \r
46         BufferHelper.checkHeaderV13(out, himf.getMessageType(), himf.computeLength(hi));\r
47     }\r
48     \r
49     /**\r
50      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
51      * @throws Exception \r
52      */\r
53     @Test\r
54     public void testWith4BitVersionBitmap() throws Exception {\r
55         int lengthOfBitmap = 4;\r
56         HelloInputBuilder builder = new HelloInputBuilder();\r
57         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
58         List<Elements> expectedElement = createElement(lengthOfBitmap);\r
59         builder.setElements(expectedElement);\r
60         HelloInput message = builder.build();\r
61         \r
62         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
63         HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
64         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
65         LOGGER.debug("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
66         \r
67         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
68         Elements element = readElement(out).get(0);\r
69         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
70         Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
71         Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
72     }\r
73     \r
74     /**\r
75      * Testing of {@link HelloInputMessageFactory} for correct translation from POJO\r
76      * @throws Exception \r
77      */\r
78     @Test\r
79     public void testWith64BitVersionBitmap() throws Exception {\r
80         int lengthOfBitmap = 64;\r
81         HelloInputBuilder builder = new HelloInputBuilder();\r
82         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
83         List<Elements> expectedElement = createElement(lengthOfBitmap);\r
84         builder.setElements(expectedElement);\r
85         HelloInput message = builder.build();\r
86         \r
87         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
88         HelloInputMessageFactory factory = HelloInputMessageFactory.getInstance();\r
89         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
90         LOGGER.debug("bytebuf: " + ByteBufUtils.byteBufToHexString(out));\r
91         \r
92         BufferHelper.checkHeaderV13(out, factory.getMessageType(), factory.computeLength(message));\r
93         Elements element = readElement(out).get(0);\r
94         Assert.assertEquals("Wrong element type", expectedElement.get(0).getType(), element.getType());\r
95         Elements comparation = createComparationElement(lengthOfBitmap).get(0);\r
96         Assert.assertArrayEquals("Wrong element bitmap", comparation.getVersionBitmap().toArray(), element.getVersionBitmap().toArray());\r
97     }\r
98     \r
99     private static List<Elements> createElement(int lengthOfBitmap) {\r
100         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
101         List<Elements> elementsList = new ArrayList<>();\r
102         List<Boolean> booleanList = new ArrayList<>();\r
103         for (int i = 0; i < lengthOfBitmap; i++) {\r
104             booleanList.add(true);\r
105         }\r
106         elementsBuilder.setType(HelloElementType.forValue(1));\r
107         elementsBuilder.setVersionBitmap(booleanList);\r
108         elementsList.add(elementsBuilder.build());\r
109         return elementsList;\r
110     }\r
111     \r
112     private static List<Elements> createComparationElement(int lengthOfBitmap) {\r
113         ElementsBuilder elementsBuilder = new ElementsBuilder();\r
114         List<Elements> elementsList = new ArrayList<>();\r
115         List<Boolean> booleanList = new ArrayList<>();\r
116         for (int i = 0; i < lengthOfBitmap; i++) {\r
117             booleanList.add(true);\r
118         }\r
119         if ((lengthOfBitmap % Integer.SIZE) != 0) {\r
120             for (int i = 0; i < (Integer.SIZE - (lengthOfBitmap % Integer.SIZE)); i++) {\r
121                 booleanList.add(false);\r
122             }\r
123         }\r
124         LOGGER.debug("boolsize " + booleanList.size());\r
125         elementsBuilder.setType(HelloElementType.forValue(1));\r
126         elementsBuilder.setVersionBitmap(booleanList);\r
127         elementsList.add(elementsBuilder.build());\r
128         return elementsList;\r
129     }\r
130     \r
131     private static List<Elements> readElement(ByteBuf input) {\r
132         List<Elements> elementsList = new ArrayList<>();\r
133         while (input.readableBytes() > 0) {\r
134             ElementsBuilder elementsBuilder = new ElementsBuilder();\r
135             int type = input.readUnsignedShort();\r
136             int elementLength = input.readUnsignedShort();\r
137             if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {\r
138                 elementsBuilder.setType(HelloElementType.forValue(type));\r
139                 int[] versionBitmap = new int[(elementLength - HelloInputMessageFactory.HELLO_ELEMENT_HEADER_SIZE) / 4];\r
140                 for (int i = 0; i < versionBitmap.length; i++) {\r
141                     versionBitmap[i] = (int) input.readUnsignedInt();\r
142                 }\r
143                 elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
144                 int paddingRemainder = elementLength % EncodeConstants.PADDING;\r
145                 if (paddingRemainder != 0) {\r
146                     input.readBytes(EncodeConstants.PADDING - paddingRemainder);\r
147                 }\r
148             }\r
149             elementsList.add(elementsBuilder.build());\r
150         }\r
151         return elementsList;\r
152     }\r
153     \r
154     private static List<Boolean> readVersionBitmap(int[] input){\r
155         List<Boolean> versionBitmapList = new ArrayList<>();\r
156         for (int i = 0; i < input.length; i++) {\r
157             int mask = input[i];\r
158             for (int j = 0; j < Integer.SIZE; j++) {\r
159                     versionBitmapList.add((mask & (1<<j)) != 0);\r
160             }\r
161         }\r
162         return versionBitmapList;\r
163     }\r
164 \r
165 }\r