/* * Copyright (c) 2016 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.openflowplugin.impl.protocol.serialization.messages; import static org.junit.Assert.assertEquals; import com.google.common.collect.ImmutableMap; import io.netty.buffer.ByteBuf; import io.netty.buffer.UnpooledByteBufAllocator; import org.junit.Test; import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey; import org.opendaylight.openflowjava.protocol.api.util.BinContent; import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants; import org.opendaylight.openflowjava.util.ByteBufUtils; import org.opendaylight.openflowplugin.impl.protocol.serialization.AbstractSerializerTest; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortConfig; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortFeatures; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.PortNumberUni; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.OutputPortValues; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumberValues; public class PortMessageSerializerTest extends AbstractSerializerTest { private static final byte PADDING_IN_PORT_MOD_MESSAGE_01 = 4; private static final byte PADDING_IN_PORT_MOD_MESSAGE_02 = 2; private static final byte PADDING_IN_PORT_MOD_MESSAGE_03 = 4; private static final short LENGTH = 40; private static final Long XID = 42L; private static final short VERSION = EncodeConstants.OF13_VERSION_ID; private static final String PORT_NUMBER = OutputPortValues.ALL.toString(); private static final Long PORT_NUMBER_VAL = BinContent.intToUnsignedLong(PortNumberValues.ALL.getIntValue()); private static final String MAC_ADDRESS = "E9:2A:55:BA:FA:4D"; // Port config private static final Boolean IS_NOFWD = false; private static final Boolean IS_NOPACKETIN = false; private static final Boolean IS_NORECV = true; private static final Boolean IS_PORTDOWN = false; // Port features private static final Boolean IS_AUTOENG = true; private static final Boolean IS_COPPER = false; private static final Boolean IS_FIBER = true; private static final Boolean IS_40GBFD = true; private static final Boolean IS_100GBFD = false; private static final Boolean IS_100MBFD = false; private static final Boolean IS_100MBHD = false; private static final Boolean IS_1GBFD = false; private static final Boolean IS_1GBHD = false; private static final Boolean IS_1TBFD = false; private static final Boolean IS_OTHER = false; private static final Boolean IS_PAUSE = false; private static final Boolean IS_PAUSE_ASYM = false; private static final Boolean IS_10GBFD = false; private static final Boolean IS_10MBFD = false; private static final Boolean IS_10MBHD = false; private static final PortMessage MESSAGE = new PortMessageBuilder() .setXid(XID) .setVersion(VERSION) .setPortNumber(new PortNumberUni(PORT_NUMBER)) .setConfiguration(new PortConfig(IS_NOFWD, IS_NOPACKETIN, IS_NORECV, IS_PORTDOWN)) .setAdvertisedFeatures(new PortFeatures( IS_AUTOENG, IS_COPPER, IS_FIBER, IS_40GBFD, IS_100GBFD, IS_100MBFD, IS_100MBHD, IS_1GBFD, IS_1GBHD, IS_1TBFD, IS_OTHER, IS_PAUSE, IS_PAUSE_ASYM, IS_10GBFD, IS_10MBFD, IS_10MBHD)) .setHardwareAddress(new MacAddress(MAC_ADDRESS)) .build(); private PortMessageSerializer serializer; @Override protected void init() { serializer = getRegistry().getSerializer(new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, PortMessage.class)); } @Test public void testSerialize() throws Exception { final ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer(); serializer.serialize(MESSAGE, out); // Header assertEquals(out.readByte(), VERSION); assertEquals(out.readByte(), serializer.getMessageType()); assertEquals(out.readShort(), LENGTH); assertEquals(out.readInt(), XID.intValue()); // Body assertEquals(out.readInt(), PORT_NUMBER_VAL.intValue()); out.skipBytes(PADDING_IN_PORT_MOD_MESSAGE_01); byte[] address = new byte[6]; out.readBytes(address); assertEquals( new MacAddress(ByteBufUtils.macAddressToString(address)).getValue(), new MacAddress(MAC_ADDRESS).getValue()); out.skipBytes(PADDING_IN_PORT_MOD_MESSAGE_02); // Port config final int config = ByteBufUtils.fillBitMaskFromMap(ImmutableMap .<Integer, Boolean>builder() .put(0, IS_PORTDOWN) .put(2, IS_NORECV) .put(5, IS_NOFWD) .put(6, IS_NOPACKETIN) .build()); assertEquals(out.readInt(), config); assertEquals(out.readInt(), config); // Port features assertEquals(out.readInt(), ByteBufUtils.fillBitMask(0, IS_10MBHD, IS_10MBFD, IS_100MBHD, IS_100MBFD, IS_1GBHD, IS_1GBFD, IS_10GBFD, IS_40GBFD, IS_100GBFD, IS_1TBFD, IS_OTHER, IS_COPPER, IS_FIBER, IS_AUTOENG, IS_PAUSE, IS_PAUSE_ASYM)); out.skipBytes(PADDING_IN_PORT_MOD_MESSAGE_03); assertEquals(out.readableBytes(), 0); } }