Merge "Bug 1277 - Move ByteBuffUtils to separate bundle"
[openflowjava.git] / openflow-protocol-impl / src / test / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsSerializerTest.java
1 /*\r
2  * Copyright (c) 2013 Pantheon Technologies s.r.o. and others.  All rights reserved.\r
3  *\r
4  * This program and the accompanying materials are made available under the\r
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
6  * and is available at http://www.eclipse.org/legal/epl-v10.html\r
7  */\r
8 package org.opendaylight.openflowjava.protocol.impl.util;\r
9 \r
10 import io.netty.buffer.ByteBuf;\r
11 import io.netty.buffer.UnpooledByteBufAllocator;\r
12 \r
13 import java.util.ArrayList;\r
14 import java.util.List;\r
15 \r
16 import org.junit.Assert;\r
17 import org.junit.Before;\r
18 import org.junit.Test;\r
19 import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;\r
20 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;\r
21 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;\r
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosAction;\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTosActionBuilder;\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpAction;\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpActionBuilder;\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwDst;\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwSrc;\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTos;\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpDst;\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetTpSrc;\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanPcp;\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetVlanVid;\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.StripVlan;\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
58 \r
59 /**\r
60  * @author michal.polkorab\r
61  *\r
62  */\r
63 public class OF10ActionsSerializerTest {\r
64 \r
65     private SerializerRegistry registry;\r
66 \r
67     /**\r
68      * Initializes serializer table and stores correct factory in field\r
69      */\r
70     @Before\r
71     public void startUp() {\r
72         registry = new SerializerRegistryImpl();\r
73         registry.init();\r
74     }\r
75 \r
76     /**\r
77      * Testing correct serialization of actions (OF v1.0) \r
78      */\r
79     @Test\r
80     public void test() {\r
81         List<Action> actions = new ArrayList<>();\r
82         ActionBuilder actionBuilder = new ActionBuilder();\r
83         actionBuilder.setType(Output.class);\r
84         PortActionBuilder portBuilder = new PortActionBuilder();\r
85         portBuilder.setPort(new PortNumber(42L));\r
86         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
87         MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();\r
88         maxLen.setMaxLength(32);\r
89         actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());\r
90         actions.add(actionBuilder.build());\r
91         actionBuilder = new ActionBuilder();\r
92         actionBuilder.setType(SetVlanVid.class);\r
93         VlanVidActionBuilder vlanBuilder = new VlanVidActionBuilder();\r
94         vlanBuilder.setVlanVid(15);\r
95         actionBuilder.addAugmentation(VlanVidAction.class, vlanBuilder.build());\r
96         actions.add(actionBuilder.build());\r
97         actionBuilder = new ActionBuilder();\r
98         actionBuilder.setType(SetVlanPcp.class);\r
99         VlanPcpActionBuilder pcpBuilder = new VlanPcpActionBuilder();\r
100         pcpBuilder.setVlanPcp((short) 16);\r
101         actionBuilder.addAugmentation(VlanPcpAction.class, pcpBuilder.build());\r
102         actions.add(actionBuilder.build());\r
103         actionBuilder = new ActionBuilder();\r
104         actionBuilder.setType(StripVlan.class);\r
105         actions.add(actionBuilder.build());\r
106         actionBuilder = new ActionBuilder();\r
107         actionBuilder.setType(SetDlSrc.class);\r
108         DlAddressActionBuilder dlBuilder = new DlAddressActionBuilder();\r
109         dlBuilder.setDlAddress(new MacAddress("00:00:00:02:03:04"));\r
110         actionBuilder.addAugmentation(DlAddressAction.class, dlBuilder.build());\r
111         actions.add(actionBuilder.build());\r
112         actionBuilder = new ActionBuilder();\r
113         actionBuilder.setType(SetDlDst.class);\r
114         dlBuilder = new DlAddressActionBuilder();\r
115         dlBuilder.setDlAddress(new MacAddress("00:00:00:01:02:03"));\r
116         actionBuilder.addAugmentation(DlAddressAction.class, dlBuilder.build());\r
117         actions.add(actionBuilder.build());\r
118         actionBuilder = new ActionBuilder();\r
119         actionBuilder.setType(SetNwSrc.class);\r
120         IpAddressActionBuilder ipBuilder = new IpAddressActionBuilder();\r
121         ipBuilder.setIpAddress(new Ipv4Address("10.0.0.1"));\r
122         actionBuilder.addAugmentation(IpAddressAction.class, ipBuilder.build());\r
123         actions.add(actionBuilder.build());\r
124         actionBuilder = new ActionBuilder();\r
125         actionBuilder.setType(SetNwDst.class);\r
126         ipBuilder = new IpAddressActionBuilder();\r
127         ipBuilder.setIpAddress(new Ipv4Address("10.0.0.3"));\r
128         actionBuilder.addAugmentation(IpAddressAction.class, ipBuilder.build());\r
129         actions.add(actionBuilder.build());\r
130         actionBuilder = new ActionBuilder();\r
131         actionBuilder.setType(SetNwTos.class);\r
132         NwTosActionBuilder tosBuilder = new NwTosActionBuilder();\r
133         tosBuilder.setNwTos((short) 204);\r
134         actionBuilder.addAugmentation(NwTosAction.class, tosBuilder.build());\r
135         actions.add(actionBuilder.build());\r
136         actionBuilder = new ActionBuilder();\r
137         actionBuilder.setType(SetTpSrc.class);\r
138         portBuilder = new PortActionBuilder();\r
139         portBuilder.setPort(new PortNumber(6653L));\r
140         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
141         actions.add(actionBuilder.build());\r
142         actionBuilder = new ActionBuilder();\r
143         actionBuilder.setType(SetTpDst.class);\r
144         portBuilder = new PortActionBuilder();\r
145         portBuilder.setPort(new PortNumber(6633L));\r
146         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
147         actions.add(actionBuilder.build());\r
148         actionBuilder = new ActionBuilder();\r
149         actionBuilder.setType(Enqueue.class);\r
150         portBuilder = new PortActionBuilder();\r
151         portBuilder.setPort(new PortNumber(6613L));\r
152         actionBuilder.addAugmentation(PortAction.class, portBuilder.build());\r
153         QueueIdActionBuilder queueBuilder = new QueueIdActionBuilder();\r
154         queueBuilder.setQueueId(400L);\r
155         actionBuilder.addAugmentation(QueueIdAction.class, queueBuilder.build());\r
156         actions.add(actionBuilder.build());\r
157         actionBuilder = new ActionBuilder();\r
158         actionBuilder.setType(Experimenter.class);\r
159         ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();\r
160         expBuilder.setExperimenter(82L);\r
161         byte[] expData = new byte[]{0, 0, 0, 0, 0, 0, 0, 1};\r
162         expBuilder.setData(expData);\r
163         actionBuilder.addAugmentation(ExperimenterAction.class, expBuilder.build());\r
164         actions.add(actionBuilder.build());\r
165         actionBuilder = new ActionBuilder();\r
166         actionBuilder.setType(Experimenter.class);\r
167         expBuilder = new ExperimenterActionBuilder();\r
168         expBuilder.setExperimenter(102L);\r
169         actionBuilder.addAugmentation(ExperimenterAction.class, expBuilder.build());\r
170         actions.add(actionBuilder.build());\r
171         \r
172         ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();\r
173         ListSerializer.serializeList(actions, EnhancedTypeKeyMakerFactory\r
174                 .createActionKeyMaker(EncodeConstants.OF10_VERSION_ID), registry, out);\r
175         \r
176         Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());\r
177         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
178         Assert.assertEquals("Wrong port", 42, out.readUnsignedShort());\r
179         Assert.assertEquals("Wrong max-length", 32, out.readUnsignedShort());\r
180         Assert.assertEquals("Wrong action type", 1, out.readUnsignedShort());\r
181         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
182         Assert.assertEquals("Wrong vlan-vid", 15, out.readUnsignedShort());\r
183         out.skipBytes(2);\r
184         Assert.assertEquals("Wrong action type", 2, out.readUnsignedShort());\r
185         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
186         Assert.assertEquals("Wrong vlan-pcp", 16, out.readUnsignedByte());\r
187         out.skipBytes(3);\r
188         Assert.assertEquals("Wrong action type", 3, out.readUnsignedShort());\r
189         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
190         out.skipBytes(4);\r
191         Assert.assertEquals("Wrong action type", 4, out.readUnsignedShort());\r
192         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
193         byte[] data = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
194         out.readBytes(data);\r
195         Assert.assertArrayEquals("Wrong dl-address", ByteBufUtils.macAddressToBytes("00:00:00:02:03:04"), data);\r
196         out.skipBytes(6);\r
197         Assert.assertEquals("Wrong action type", 5, out.readUnsignedShort());\r
198         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
199         data = new byte[EncodeConstants.MAC_ADDRESS_LENGTH];\r
200         out.readBytes(data);\r
201         Assert.assertArrayEquals("Wrong dl-address", ByteBufUtils.macAddressToBytes("00:00:00:01:02:03"), data);\r
202         out.skipBytes(6);\r
203         Assert.assertEquals("Wrong action type", 6, out.readUnsignedShort());\r
204         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
205         Assert.assertEquals("Wrong ip-address(1)", 10, out.readUnsignedByte());\r
206         Assert.assertEquals("Wrong ip-address(2)", 0, out.readUnsignedByte());\r
207         Assert.assertEquals("Wrong ip-address(3)", 0, out.readUnsignedByte());\r
208         Assert.assertEquals("Wrong ip-address(4)", 1, out.readUnsignedByte());\r
209         Assert.assertEquals("Wrong action type", 7, out.readUnsignedShort());\r
210         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
211         Assert.assertEquals("Wrong ip-address(1)", 10, out.readUnsignedByte());\r
212         Assert.assertEquals("Wrong ip-address(2)", 0, out.readUnsignedByte());\r
213         Assert.assertEquals("Wrong ip-address(3)", 0, out.readUnsignedByte());\r
214         Assert.assertEquals("Wrong ip-address(4)", 3, out.readUnsignedByte());\r
215         Assert.assertEquals("Wrong action type", 8, out.readUnsignedShort());\r
216         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
217         Assert.assertEquals("Wrong nw-tos", 204, out.readUnsignedByte());\r
218         out.skipBytes(3);\r
219         Assert.assertEquals("Wrong action type", 9, out.readUnsignedShort());\r
220         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
221         Assert.assertEquals("Wrong port", 6653, out.readUnsignedShort());\r
222         out.skipBytes(2);\r
223         Assert.assertEquals("Wrong action type", 10, out.readUnsignedShort());\r
224         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
225         Assert.assertEquals("Wrong port", 6633, out.readUnsignedShort());\r
226         out.skipBytes(2);\r
227         Assert.assertEquals("Wrong action type", 11, out.readUnsignedShort());\r
228         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
229         Assert.assertEquals("Wrong port", 6613, out.readUnsignedShort());\r
230         out.skipBytes(6);\r
231         Assert.assertEquals("Wrong queue-id", 400, out.readUnsignedInt());\r
232         Assert.assertEquals("Wrong action type", 65535, out.readUnsignedShort());\r
233         Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());\r
234         Assert.assertEquals("Wrong experimenter", 82, out.readUnsignedInt());\r
235         byte[] tmp = new byte[8];\r
236         out.readBytes(tmp);\r
237         Assert.assertArrayEquals("Wrong data", expData, tmp);\r
238         Assert.assertEquals("Wrong action type", 65535, out.readUnsignedShort());\r
239         Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());\r
240         Assert.assertEquals("Wrong experimenter", 102, out.readUnsignedInt());\r
241         Assert.assertTrue("Written more bytes than needed", out.readableBytes() == 0);\r
242     }\r
243     \r
244 }