/* * 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 io.netty.buffer.ByteBuf; import io.netty.buffer.UnpooledByteBufAllocator; import java.util.Arrays; import org.junit.Test; import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey; 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.opendaylight.meter.types.rev130918.BandId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterFlags; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterId; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessage; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.MeterMessageBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DropBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.band.type.band.type.DscpRemarkBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.MeterBandHeadersBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.MeterBandHeaderBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.meter.band.headers.meter.band.header.MeterBandTypesBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand; public class MeterMessageSerializerTest extends AbstractSerializerTest { // Meter message constants private static final short LENGTH = 48; private static final short LENGTH_OF_METER_BANDS = 16; private static final short PADDING_IN_METER_BAND_DROP = 4; private static final short PADDING_IN_METER_BAND_DSCP_REMARK = 3; private static final Long XID = 42L; private static final String CONTAINER_NAME = "container"; private static final String METER_NAME = "meter"; private static final Long METER_ID = 1L; private static final Boolean BARRIER = false; private static final short VERSION = EncodeConstants.OF13_VERSION_ID; private static final MeterModCommand COMMAND = MeterModCommand.OFPMCADD; // Flags private static final Boolean IS_METER_BURST = false; private static final Boolean IS_METER_KBPS = true; private static final Boolean IS_METER_PKTPS = false; private static final Boolean IS_METER_STATS = true; // Bands private static final Long BAND_BURST_SIZE = 50L; private static final Long BAND_ID = 8L; private static final Long BAND_RATE = 25L; private static final Long DROP_RATE = 12L; private static final Long DROP_BURST_SIZE = 24L; private static final Long DSCP_RATE = 13L; private static final Long DSCP_BURST_SIZE = 26L; private static final short DSCP_PREC_LEVEL = (short) 4; // Message private static final MeterMessage MESSAGE = new MeterMessageBuilder() .setBarrier(BARRIER) .setCommand(COMMAND) .setContainerName(CONTAINER_NAME) .setFlags(new MeterFlags(IS_METER_BURST, IS_METER_KBPS, IS_METER_PKTPS, IS_METER_STATS)) .setMeterId(new MeterId(METER_ID)) .setXid(XID) .setVersion(VERSION) .setMeterName(METER_NAME) .setMeterBandHeaders(new MeterBandHeadersBuilder() .setMeterBandHeader(Arrays.asList( new MeterBandHeaderBuilder() .setMeterBandTypes(new MeterBandTypesBuilder() .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918 .MeterBandType(true, false, false)) .build()) .setBandBurstSize(BAND_BURST_SIZE) .setBandId(new BandId(BAND_ID)) .setBandRate(BAND_RATE) .setBandType(new DropBuilder() .setDropRate(DROP_RATE) .setDropBurstSize(DROP_BURST_SIZE) .build()) .build(), new MeterBandHeaderBuilder() .setMeterBandTypes(new MeterBandTypesBuilder() .setFlags(new org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918 .MeterBandType(false, true, false)) .build()) .setBandBurstSize(BAND_BURST_SIZE) .setBandId(new BandId(BAND_ID)) .setBandRate(BAND_RATE) .setBandType(new DscpRemarkBuilder() .setDscpRemarkBurstSize(DSCP_BURST_SIZE) .setDscpRemarkRate(DSCP_RATE) .setPrecLevel(DSCP_PREC_LEVEL) .build()) .build())) .build()) .build(); private MeterMessageSerializer serializer; @Override protected void init() { serializer = getRegistry().getSerializer(new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MeterMessage.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.readShort(), COMMAND.getIntValue()); assertEquals(out.readShort(), ByteBufUtils.fillBitMask(0, IS_METER_KBPS, IS_METER_PKTPS, IS_METER_BURST, IS_METER_STATS)); assertEquals(out.readInt(), METER_ID.intValue()); // Drop band assertEquals(out.readShort(), MeterBandType.OFPMBTDROP.getIntValue()); assertEquals(out.readShort(), LENGTH_OF_METER_BANDS); assertEquals(out.readInt(), DROP_RATE.intValue()); assertEquals(out.readInt(), DROP_BURST_SIZE.intValue()); out.skipBytes(PADDING_IN_METER_BAND_DROP); // Dscp band assertEquals(out.readShort(), MeterBandType.OFPMBTDSCPREMARK.getIntValue()); assertEquals(out.readShort(), LENGTH_OF_METER_BANDS); assertEquals(out.readInt(), DSCP_RATE.intValue()); assertEquals(out.readInt(), DSCP_BURST_SIZE.intValue()); assertEquals(out.readByte(), DSCP_PREC_LEVEL); out.skipBytes(PADDING_IN_METER_BAND_DSCP_REMARK); assertEquals(out.readableBytes(), 0); } }