2 * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
\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
8 package org.opendaylight.openflowjava.protocol.impl.util;
\r
10 import io.netty.buffer.ByteBuf;
\r
11 import io.netty.buffer.UnpooledByteBufAllocator;
\r
13 import java.util.ArrayList;
\r
14 import java.util.List;
\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
60 * @author michal.polkorab
\r
63 public class OF10ActionsSerializerTest {
\r
65 private SerializerRegistry registry;
\r
68 * Initializes serializer table and stores correct factory in field
\r
71 public void startUp() {
\r
72 registry = new SerializerRegistryImpl();
\r
77 * Testing correct serialization of actions (OF v1.0)
\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
172 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
173 ListSerializer.serializeList(actions, EnhancedTypeKeyMakerFactory
\r
174 .createActionKeyMaker(EncodeConstants.OF10_VERSION_ID), registry, out);
\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
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
188 Assert.assertEquals("Wrong action type", 3, out.readUnsignedShort());
\r
189 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\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
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
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
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
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
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
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