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