/*
* Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v1.0 which accompanies this distribution,
* and is available at http://www.eclipse.org/legal/epl-v10.html
*/
package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
import org.opendaylight.openflowjava.protocol.impl.util.DefaultDeserializerFactoryTest;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;
/**
* Test for {@link org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactory}.
* @author michal.polkorab
* @author timotej.kubas
* @author madamjak
*/
public class HelloMessageFactoryTest extends DefaultDeserializerFactoryTest<HelloMessage> {
/**
* Initializes deserializer registry and lookups OF13 deserializer.
*/
public HelloMessageFactoryTest() {
super(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, 0, HelloMessage.class));
}
/**
* Testing {@link HelloMessageFactory} for correct header version.
*/
@Test
public void testVersion() {
List<Byte> versions = new ArrayList<>(Arrays.asList(
EncodeConstants.OF13_VERSION_ID,
EncodeConstants.OF14_VERSION_ID,
EncodeConstants.OF15_VERSION_ID
));
ByteBuf bb = BufferHelper.buildBuffer("00 01 " // type
+ "00 08 " // length
+ "00 00 00 11" // bitmap 1
);
testHeaderVersions(versions, bb);
}
/**
* Testing {@link HelloMessageFactory} for correct length without padding.
*/
@Test
public void testWithoutPadding() {
ByteBuf bb = BufferHelper.buildBuffer("00 01 " // type
+ "00 08 " // length
+ "00 00 00 11" // bitmap 1
);
HelloMessage builtByFactory = BufferHelper.deserialize(factory, bb);
List<Elements> element = createElement(4,HelloElementType.VERSIONBITMAP.getIntValue());
Assert.assertEquals("Wrong type", element.get(0).getType(), builtByFactory.getElements().get(0).getType());
Assert.assertEquals("Wrong versionBitmap", element.get(0).getVersionBitmap(), builtByFactory.getElements().get(0).getVersionBitmap());
}
/**
* Testing {@link HelloMessageFactory} for correct length with padding.
*/
@Test
public void testWithPadding() {
ByteBuf bb = BufferHelper.buildBuffer("00 01 " // type
+ "00 0c " // length
+ "00 00 00 11 " // bitmap 1
+ "00 00 00 00 " // bitmap 2
+ "00 00 00 00" // padding
);
HelloMessage builtByFactory = BufferHelper.deserialize(factory, bb);
List<Elements> element = createElement(8,HelloElementType.VERSIONBITMAP.getIntValue());
Assert.assertEquals("Wrong type", element.get(0).getType(), builtByFactory.getElements().get(0).getType());
Assert.assertEquals("Wrong versionBitmap", element.get(0).getVersionBitmap(), builtByFactory.getElements().get(0).getVersionBitmap());
}
/**
* Testing {@link HelloMessageFactory} if incorrect version is set.
*/
@Test
public void testBadType(){
ByteBuf bb = BufferHelper.buildBuffer("00 02 " // type
+ "00 0c " // length
+ "00 00 00 11 " // bitmap 1
+ "00 00 00 00 " // bitmap 2
+ "00 00 00 00" // padding
);
HelloMessage builtByFactory = BufferHelper.deserialize(factory, bb);
Assert.assertEquals("Wrong - no element has been expected", 0, builtByFactory.getElements().size());
}
private static List<Elements> createElement(int lengthInByte, int type) {
ElementsBuilder elementsBuilder = new ElementsBuilder();
List<Elements> elementsList = new ArrayList<>();
List<Boolean> booleanList = new ArrayList<>();
booleanList.add(true);
booleanList.add(false);
booleanList.add(false);
booleanList.add(false);
booleanList.add(true);
int inSize = booleanList.size();
for (int i = 1; i < ((lengthInByte * 8) - inSize + 1); i++) {
booleanList.add(false);
}
elementsBuilder.setType(HelloElementType.forValue(type));
elementsBuilder.setVersionBitmap(booleanList);
elementsList.add(elementsBuilder.build());
return elementsList;
}
}