2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
11 import io.netty.buffer.ByteBuf;
12 import io.netty.buffer.UnpooledByteBufAllocator;
14 import java.util.ArrayList;
15 import java.util.List;
17 import junit.framework.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.openflowjava.protocol.api.extensibility.MessageTypeKey;
22 import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
23 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
24 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
25 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;
26 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropCaseBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkCaseBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
41 * @author timotej.kubas
42 * @author michal.polkorab
44 public class MeterModInputMessageFactoryTest {
46 private SerializerRegistry registry;
47 private OFSerializer<MeterModInput> meterModFactory;
50 * Initializes serializer registry and stores correct factory in field
53 public void startUp() {
54 registry = new SerializerRegistryImpl();
56 meterModFactory = registry.getSerializer(
57 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MeterModInput.class));
62 * Testing of {@link MeterModInputMessageFactory} for correct translation from POJO
65 public void testMeterModInputMessage() throws Exception {
66 MeterModInputBuilder builder = new MeterModInputBuilder();
67 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
68 builder.setCommand(MeterModCommand.forValue(1));
69 builder.setFlags(new MeterFlags(false, true, true, false));
70 builder.setMeterId(new MeterId(2248L));
71 builder.setBands(createBandsList());
72 MeterModInput message = builder.build();
74 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
75 meterModFactory.serialize(message, out);
77 BufferHelper.checkHeaderV13(out, (byte) 29, 48);
78 Assert.assertEquals("Wrong meterModCommand", message.getCommand().getIntValue(), out.readUnsignedShort());
79 Assert.assertEquals("Wrong meterFlags", message.getFlags(), decodeMeterModFlags(out.readShort()));
80 Assert.assertEquals("Wrong meterId", message.getMeterId().getValue().intValue(), out.readUnsignedInt());
81 Assert.assertEquals("Wrong bands", message.getBands(), decodeBandsList(out));
84 private static MeterFlags decodeMeterModFlags(short input){
85 final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;
86 final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;
87 final Boolean _oFPMFBURST = (input & (1 << 2)) > 0;
88 final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;
89 return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);
92 private static List<Bands> createBandsList(){
93 List<Bands> bandsList = new ArrayList<>();
94 BandsBuilder bandsBuilder = new BandsBuilder();
95 MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
96 MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
97 dropBand.setType(MeterBandType.OFPMBTDROP);
99 dropBand.setBurstSize(2L);
100 dropCaseBuilder.setMeterBandDrop(dropBand.build());
101 bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
102 MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
103 MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
104 dscpRemarkBand.setType(MeterBandType.OFPMBTDSCPREMARK);
105 dscpRemarkBand.setRate(1L);
106 dscpRemarkBand.setBurstSize(2L);
107 dscpRemarkBand.setPrecLevel((short) 3);
108 dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
109 bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
113 private static List<Bands> decodeBandsList(ByteBuf input){
114 List<Bands> bandsList = new ArrayList<>();
115 BandsBuilder bandsBuilder = new BandsBuilder();
116 MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
117 MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
118 dropBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
119 input.skipBytes(Short.SIZE/Byte.SIZE);
120 dropBand.setRate(input.readUnsignedInt());
121 dropBand.setBurstSize(input.readUnsignedInt());
123 dropCaseBuilder.setMeterBandDrop(dropBand.build());
124 bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
125 MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
126 MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
127 dscpRemarkBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
128 input.skipBytes(Short.SIZE/Byte.SIZE);
129 dscpRemarkBand.setRate(input.readUnsignedInt());
130 dscpRemarkBand.setBurstSize(input.readUnsignedInt());
131 dscpRemarkBand.setPrecLevel(input.readUnsignedByte());
133 dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
134 bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
140 * Testing of {@link MeterModInputMessageFactory} for correct translation from POJO
143 public void testMeterModInputMessageWithNoBands() throws Exception {
144 MeterModInputBuilder builder = new MeterModInputBuilder();
145 BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
146 builder.setCommand(MeterModCommand.forValue(1));
147 builder.setFlags(new MeterFlags(false, true, true, false));
148 builder.setMeterId(new MeterId(2248L));
149 builder.setBands(null);
150 MeterModInput message = builder.build();
152 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
153 meterModFactory.serialize(message, out);
155 BufferHelper.checkHeaderV13(out, (byte) 29, 16);
156 Assert.assertEquals("Wrong meterModCommand", message.getCommand().getIntValue(), out.readUnsignedShort());
157 Assert.assertEquals("Wrong meterFlags", message.getFlags(), decodeMeterModFlags(out.readShort()));
158 Assert.assertEquals("Wrong meterId", message.getMeterId().getValue().intValue(), out.readUnsignedInt());
159 Assert.assertTrue("Unexpected data", out.readableBytes() == 0);