Bug 1277 - Move ByteBuffUtils to separate bundle
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MeterModInputMessageFactoryTest.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 junit.framework.Assert;
18
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.MeterBandExperimenterCaseBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.drop._case.MeterBandDropBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.dscp.remark._case.MeterBandDscpRemarkBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.meter.band.experimenter._case.MeterBandExperimenterBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;
41
42 /**
43  * @author timotej.kubas
44  * @author michal.polkorab
45  */
46 public class MeterModInputMessageFactoryTest {
47
48     private SerializerRegistry registry;
49     private OFSerializer<MeterModInput> meterModFactory;
50
51     /**
52      * Initializes serializer registry and stores correct factory in field
53      */
54     @Before
55     public void startUp() {
56         registry = new SerializerRegistryImpl();
57         registry.init();
58         meterModFactory = registry.getSerializer(
59                 new MessageTypeKey<>(EncodeConstants.OF13_VERSION_ID, MeterModInput.class));
60     }
61
62     /**
63      * @throws Exception 
64      * Testing of {@link MeterModInputMessageFactory} for correct translation from POJO
65      */
66     @Test
67     public void testMeterModInputMessage() throws Exception {
68         MeterModInputBuilder builder = new MeterModInputBuilder();
69         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);
70         builder.setCommand(MeterModCommand.forValue(1));
71         builder.setFlags(new MeterFlags(false, true, true, false));
72         builder.setMeterId(new MeterId(2248L));
73         builder.setBands(createBandsList());
74         MeterModInput message = builder.build();
75         
76         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
77         meterModFactory.serialize(message, out);
78         
79         BufferHelper.checkHeaderV13(out, (byte) 29, 64);
80         Assert.assertEquals("Wrong meterModCommand", message.getCommand().getIntValue(), out.readUnsignedShort());
81         Assert.assertEquals("Wrong meterFlags", message.getFlags(), decodeMeterModFlags(out.readShort()));
82         Assert.assertEquals("Wrong meterId", message.getMeterId().getValue().intValue(), out.readUnsignedInt());
83         Assert.assertEquals("Wrong bands", message.getBands(), decodeBandsList(out));
84     }
85     
86     private static MeterFlags decodeMeterModFlags(short input){
87         final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;
88         final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;
89         final Boolean _oFPMFBURST = (input & (1 << 2)) > 0; 
90         final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;
91         return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);
92     }
93     
94     private static List<Bands> createBandsList(){
95         List<Bands> bandsList = new ArrayList<>();
96         BandsBuilder bandsBuilder = new BandsBuilder();
97         MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
98         MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
99         dropBand.setType(MeterBandType.OFPMBTDROP);
100         dropBand.setRate(1L);
101         dropBand.setBurstSize(2L);
102         dropCaseBuilder.setMeterBandDrop(dropBand.build());
103         bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
104         MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
105         MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
106         dscpRemarkBand.setType(MeterBandType.OFPMBTDSCPREMARK);
107         dscpRemarkBand.setRate(1L);
108         dscpRemarkBand.setBurstSize(2L);
109         dscpRemarkBand.setPrecLevel((short) 3);
110         dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
111         bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
112         MeterBandExperimenterCaseBuilder expCaseBuilder = new MeterBandExperimenterCaseBuilder();
113         MeterBandExperimenterBuilder experimenterBand = new MeterBandExperimenterBuilder();
114         experimenterBand.setType(MeterBandType.OFPMBTEXPERIMENTER);
115         experimenterBand.setRate(1L);
116         experimenterBand.setBurstSize(2L);
117         experimenterBand.setExperimenter(4L);
118         expCaseBuilder.setMeterBandExperimenter(experimenterBand.build());
119         bandsList.add(bandsBuilder.setMeterBand(expCaseBuilder.build()).build());
120         return bandsList;
121     }
122     
123     private static List<Bands> decodeBandsList(ByteBuf input){
124         List<Bands> bandsList = new ArrayList<>();
125         BandsBuilder bandsBuilder = new BandsBuilder();
126         MeterBandDropCaseBuilder dropCaseBuilder = new MeterBandDropCaseBuilder();
127         MeterBandDropBuilder dropBand = new MeterBandDropBuilder();
128         dropBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
129         input.skipBytes(Short.SIZE/Byte.SIZE);
130         dropBand.setRate(input.readUnsignedInt());
131         dropBand.setBurstSize(input.readUnsignedInt());
132         input.skipBytes(4);
133         dropCaseBuilder.setMeterBandDrop(dropBand.build());
134         bandsList.add(bandsBuilder.setMeterBand(dropCaseBuilder.build()).build());
135         MeterBandDscpRemarkCaseBuilder dscpCaseBuilder = new MeterBandDscpRemarkCaseBuilder();
136         MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();
137         dscpRemarkBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
138         input.skipBytes(Short.SIZE/Byte.SIZE);
139         dscpRemarkBand.setRate(input.readUnsignedInt());
140         dscpRemarkBand.setBurstSize(input.readUnsignedInt());
141         dscpRemarkBand.setPrecLevel(input.readUnsignedByte());
142         input.skipBytes(3);
143         dscpCaseBuilder.setMeterBandDscpRemark(dscpRemarkBand.build());
144         bandsList.add(bandsBuilder.setMeterBand(dscpCaseBuilder.build()).build());
145         MeterBandExperimenterCaseBuilder expCaseBuilder = new MeterBandExperimenterCaseBuilder();
146         MeterBandExperimenterBuilder experimenterBand = new MeterBandExperimenterBuilder();
147         experimenterBand.setType(MeterBandType.forValue(input.readUnsignedShort()));
148         input.skipBytes(Short.SIZE/Byte.SIZE);
149         experimenterBand.setRate(input.readUnsignedInt());
150         experimenterBand.setBurstSize(input.readUnsignedInt());
151         experimenterBand.setExperimenter(input.readUnsignedInt());
152         expCaseBuilder.setMeterBandExperimenter(experimenterBand.build());
153         bandsList.add(bandsBuilder.setMeterBand(expCaseBuilder.build()).build());
154         return bandsList;
155     }
156     
157 }