Merge "Error code support for ErrorMessage"
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / MeterModInputMessageFactoryTest.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.serialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 import io.netty.buffer.UnpooledByteBufAllocator;\r
6 \r
7 import java.util.ArrayList;\r
8 import java.util.List;\r
9 \r
10 import junit.framework.Assert;\r
11 \r
12 import org.junit.Test;\r
13 import org.opendaylight.openflowjava.protocol.impl.deserialization.factories.HelloMessageFactoryTest;\r
14 import org.opendaylight.openflowjava.protocol.impl.util.BufferHelper;\r
15 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterBandType;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterFlags;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterId;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModCommand;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInput;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MeterModInputBuilder;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDropBuilder;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandDscpRemarkBuilder;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterBuilder;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.Bands;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.mod.BandsBuilder;\r
27 \r
28 /**\r
29  * @author timotej.kubas\r
30  * @author michal.polkorab\r
31  */\r
32 public class MeterModInputMessageFactoryTest {\r
33 \r
34     /**\r
35      * @throws Exception \r
36      * Testing of {@link MeterModInputMessageFactory} for correct translation from POJO\r
37      */\r
38     @Test\r
39     public void testMeterModInputMessage() throws Exception {\r
40         MeterModInputBuilder builder = new MeterModInputBuilder();\r
41         BufferHelper.setupHeader(builder, EncodeConstants.OF13_VERSION_ID);\r
42         builder.setCommand(MeterModCommand.forValue(1));\r
43         builder.setFlags(new MeterFlags(false, true, true, false));\r
44         builder.setMeterId(new MeterId(2248L));\r
45         builder.setBands(createBandsList());\r
46         MeterModInput message = builder.build();\r
47         \r
48         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
49         MeterModInputMessageFactory factory = MeterModInputMessageFactory.getInstance();\r
50         factory.messageToBuffer(HelloMessageFactoryTest.VERSION_YET_SUPPORTED, out, message);\r
51         \r
52         BufferHelper.checkHeaderV13(out, factory.getMessageType(), 64);\r
53         Assert.assertEquals("Wrong meterModCommand", message.getCommand().getIntValue(), out.readUnsignedShort());\r
54         Assert.assertEquals("Wrong meterFlags", message.getFlags(), decodeMeterModFlags(out.readShort()));\r
55         Assert.assertEquals("Wrong meterId", message.getMeterId().getValue().intValue(), out.readUnsignedInt());\r
56         Assert.assertEquals("Wrong bands", message.getBands(), decodeBandsList(out));\r
57     }\r
58     \r
59     private static MeterFlags decodeMeterModFlags(short input){\r
60         final Boolean _oFPMFKBPS = (input & (1 << 0)) > 0;\r
61         final Boolean _oFPMFPKTPS = (input & (1 << 1)) > 0;\r
62         final Boolean _oFPMFBURST = (input & (1 << 2)) > 0; \r
63         final Boolean _oFPMFSTATS = (input & (1 << 3)) > 0;\r
64         return new MeterFlags(_oFPMFBURST, _oFPMFKBPS, _oFPMFPKTPS, _oFPMFSTATS);\r
65     }\r
66     \r
67     private static List<Bands> createBandsList(){\r
68         List<Bands> bandsList = new ArrayList<>();\r
69         BandsBuilder bandsBuilder = new BandsBuilder();\r
70         MeterBandDropBuilder dropBand = new MeterBandDropBuilder();\r
71         dropBand.setType(MeterBandType.OFPMBTDROP);\r
72         dropBand.setRate(1L);\r
73         dropBand.setBurstSize(2L);\r
74         bandsList.add(bandsBuilder.setMeterBand(dropBand.build()).build());\r
75         MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();\r
76         dscpRemarkBand.setType(MeterBandType.OFPMBTDSCPREMARK);\r
77         dscpRemarkBand.setRate(1L);\r
78         dscpRemarkBand.setBurstSize(2L);\r
79         dscpRemarkBand.setPrecLevel((short) 3);\r
80         bandsList.add(bandsBuilder.setMeterBand(dscpRemarkBand.build()).build());\r
81         MeterBandExperimenterBuilder experimenterBand = new MeterBandExperimenterBuilder();\r
82         experimenterBand.setType(MeterBandType.OFPMBTEXPERIMENTER);\r
83         experimenterBand.setRate(1L);\r
84         experimenterBand.setBurstSize(2L);\r
85         experimenterBand.setExperimenter(4L);\r
86         bandsList.add(bandsBuilder.setMeterBand(experimenterBand.build()).build());\r
87         return bandsList;\r
88     }\r
89     \r
90     private static List<Bands> decodeBandsList(ByteBuf input){\r
91         List<Bands> bandsList = new ArrayList<>();\r
92         BandsBuilder bandsBuilder = new BandsBuilder();\r
93         MeterBandDropBuilder dropBand = new MeterBandDropBuilder();\r
94         dropBand.setType(MeterBandType.forValue(input.readUnsignedShort()));\r
95         input.skipBytes(Short.SIZE/Byte.SIZE);\r
96         dropBand.setRate(input.readUnsignedInt());\r
97         dropBand.setBurstSize(input.readUnsignedInt());\r
98         input.skipBytes(4);\r
99         bandsList.add(bandsBuilder.setMeterBand(dropBand.build()).build());\r
100         MeterBandDscpRemarkBuilder dscpRemarkBand = new MeterBandDscpRemarkBuilder();\r
101         dscpRemarkBand.setType(MeterBandType.forValue(input.readUnsignedShort()));\r
102         input.skipBytes(Short.SIZE/Byte.SIZE);\r
103         dscpRemarkBand.setRate(input.readUnsignedInt());\r
104         dscpRemarkBand.setBurstSize(input.readUnsignedInt());\r
105         dscpRemarkBand.setPrecLevel(input.readUnsignedByte());\r
106         input.skipBytes(3);\r
107         bandsList.add(bandsBuilder.setMeterBand(dscpRemarkBand.build()).build());\r
108         MeterBandExperimenterBuilder experimenterBand = new MeterBandExperimenterBuilder();\r
109         experimenterBand.setType(MeterBandType.forValue(input.readUnsignedShort()));\r
110         input.skipBytes(Short.SIZE/Byte.SIZE);\r
111         experimenterBand.setRate(input.readUnsignedInt());\r
112         experimenterBand.setBurstSize(input.readUnsignedInt());\r
113         experimenterBand.setExperimenter(input.readUnsignedInt());\r
114         bandsList.add(bandsBuilder.setMeterBand(experimenterBand.build()).build());\r
115         return bandsList;\r
116     }\r
117     \r
118 }\r