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.impl.serialization.SerializerRegistryImpl;
\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeAction;
\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthertypeActionBuilder;
\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdAction;
\r
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.GroupIdActionBuilder;
\r
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
\r
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthActionBuilder;
\r
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlAction;
\r
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsTtlActionBuilder;
\r
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlAction;
\r
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.NwTtlActionBuilder;
\r
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsAction;
\r
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OxmFieldsActionBuilder;
\r
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortAction;
\r
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortActionBuilder;
\r
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;
\r
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;
\r
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdAction;
\r
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.QueueIdActionBuilder;
\r
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlIn;
\r
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.CopyTtlOut;
\r
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecMplsTtl;
\r
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.DecNwTtl;
\r
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
\r
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Group;
\r
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
\r
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopMpls;
\r
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopPbb;
\r
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PopVlan;
\r
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushMpls;
\r
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushPbb;
\r
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.PushVlan;
\r
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetField;
\r
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetMplsTtl;
\r
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetNwTtl;
\r
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetQueue;
\r
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
\r
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.ActionBuilder;
\r
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;
\r
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;
\r
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;
\r
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;
\r
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;
\r
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;
\r
68 * @author michal.polkorab
\r
71 public class OF13ActionsSerializerTest {
\r
73 private SerializerRegistry registry;
\r
76 * Initializes serializer table and stores correct factory in field
\r
79 public void startUp() {
\r
80 registry = new SerializerRegistryImpl();
\r
85 * Testing correct serialization of actions
\r
88 public void test() {
\r
89 List<Action> actions = new ArrayList<>();
\r
90 ActionBuilder actionBuilder = new ActionBuilder();
\r
91 actionBuilder.setType(Output.class);
\r
92 PortActionBuilder port = new PortActionBuilder();
\r
93 port.setPort(new PortNumber(42L));
\r
94 actionBuilder.addAugmentation(PortAction.class, port.build());
\r
95 MaxLengthActionBuilder maxLen = new MaxLengthActionBuilder();
\r
96 maxLen.setMaxLength(52);
\r
97 actionBuilder.addAugmentation(MaxLengthAction.class, maxLen.build());
\r
98 actions.add(actionBuilder.build());
\r
99 actionBuilder = new ActionBuilder();
\r
100 actionBuilder.setType(CopyTtlOut.class);
\r
101 actions.add(actionBuilder.build());
\r
102 actionBuilder = new ActionBuilder();
\r
103 actionBuilder.setType(CopyTtlIn.class);
\r
104 actions.add(actionBuilder.build());
\r
105 actionBuilder = new ActionBuilder();
\r
106 actionBuilder.setType(SetMplsTtl.class);
\r
107 MplsTtlActionBuilder mplsTtl = new MplsTtlActionBuilder();
\r
108 mplsTtl.setMplsTtl((short) 4);
\r
109 actionBuilder.addAugmentation(MplsTtlAction.class, mplsTtl.build());
\r
110 actions.add(actionBuilder.build());
\r
111 actionBuilder = new ActionBuilder();
\r
112 actionBuilder.setType(DecMplsTtl.class);
\r
113 actions.add(actionBuilder.build());
\r
114 actionBuilder = new ActionBuilder();
\r
115 actionBuilder.setType(PushVlan.class);
\r
116 EthertypeActionBuilder etherType = new EthertypeActionBuilder();
\r
117 etherType.setEthertype(new EtherType(16));
\r
118 actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());
\r
119 actions.add(actionBuilder.build());
\r
120 actionBuilder = new ActionBuilder();
\r
121 actionBuilder.setType(PopVlan.class);
\r
122 actions.add(actionBuilder.build());
\r
123 actionBuilder = new ActionBuilder();
\r
124 actionBuilder.setType(PushMpls.class);
\r
125 etherType = new EthertypeActionBuilder();
\r
126 etherType.setEthertype(new EtherType(17));
\r
127 actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());
\r
128 actions.add(actionBuilder.build());
\r
129 actionBuilder = new ActionBuilder();
\r
130 actionBuilder.setType(PopMpls.class);
\r
131 etherType = new EthertypeActionBuilder();
\r
132 etherType.setEthertype(new EtherType(18));
\r
133 actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());
\r
134 actions.add(actionBuilder.build());
\r
135 actionBuilder = new ActionBuilder();
\r
136 actionBuilder.setType(SetQueue.class);
\r
137 QueueIdActionBuilder queueId = new QueueIdActionBuilder();
\r
138 queueId.setQueueId(1234L);
\r
139 actionBuilder.addAugmentation(QueueIdAction.class, queueId.build());
\r
140 actions.add(actionBuilder.build());
\r
141 actionBuilder = new ActionBuilder();
\r
142 actionBuilder.setType(Group.class);
\r
143 GroupIdActionBuilder group = new GroupIdActionBuilder();
\r
144 group.setGroupId(555L);
\r
145 actionBuilder.addAugmentation(GroupIdAction.class, group.build());
\r
146 actions.add(actionBuilder.build());
\r
147 actionBuilder = new ActionBuilder();
\r
148 actionBuilder.setType(SetNwTtl.class);
\r
149 NwTtlActionBuilder nwTtl = new NwTtlActionBuilder();
\r
150 nwTtl.setNwTtl((short) 8);
\r
151 actionBuilder.addAugmentation(NwTtlAction.class, nwTtl.build());
\r
152 actions.add(actionBuilder.build());
\r
153 actionBuilder = new ActionBuilder();
\r
154 actionBuilder.setType(DecNwTtl.class);
\r
155 actions.add(actionBuilder.build());
\r
156 actionBuilder = new ActionBuilder();
\r
157 actionBuilder.setType(SetField.class);
\r
158 OxmFieldsActionBuilder matchEntries = new OxmFieldsActionBuilder();
\r
159 List<MatchEntries> entries = new ArrayList<>();
\r
160 MatchEntriesBuilder matchBuilder = new MatchEntriesBuilder();
\r
161 matchBuilder.setOxmClass(OpenflowBasicClass.class);
\r
162 matchBuilder.setOxmMatchField(InPort.class);
\r
163 matchBuilder.setHasMask(false);
\r
164 PortNumberMatchEntryBuilder portBuilder = new PortNumberMatchEntryBuilder();
\r
165 portBuilder.setPortNumber(new PortNumber(1L));
\r
166 matchBuilder.addAugmentation(PortNumberMatchEntry.class, portBuilder.build());
\r
167 entries.add(matchBuilder.build());
\r
168 matchEntries.setMatchEntries(entries);
\r
169 actionBuilder.addAugmentation(OxmFieldsAction.class, matchEntries.build());
\r
170 actions.add(actionBuilder.build());
\r
171 actionBuilder = new ActionBuilder();
\r
172 actionBuilder.setType(PushPbb.class);
\r
173 etherType = new EthertypeActionBuilder();
\r
174 etherType.setEthertype(new EtherType(19));
\r
175 actionBuilder.addAugmentation(EthertypeAction.class, etherType.build());
\r
176 actions.add(actionBuilder.build());
\r
177 actionBuilder = new ActionBuilder();
\r
178 actionBuilder.setType(PopPbb.class);
\r
179 actions.add(actionBuilder.build());
\r
180 actionBuilder = new ActionBuilder();
\r
181 actionBuilder.setType(Experimenter.class);
\r
182 ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
\r
183 expBuilder.setExperimenter(82L);
\r
184 byte[] expData = new byte[]{0, 0, 0, 0, 0, 0, 0, 1};
\r
185 expBuilder.setData(expData);
\r
186 actionBuilder.addAugmentation(ExperimenterAction.class, expBuilder.build());
\r
187 actions.add(actionBuilder.build());
\r
188 actionBuilder = new ActionBuilder();
\r
189 actionBuilder.setType(Experimenter.class);
\r
190 expBuilder = new ExperimenterActionBuilder();
\r
191 expBuilder.setExperimenter(102L);
\r
192 actionBuilder.addAugmentation(ExperimenterAction.class, expBuilder.build());
\r
193 actions.add(actionBuilder.build());
\r
195 ByteBuf out = UnpooledByteBufAllocator.DEFAULT.buffer();
\r
196 CodingUtils.serializeActions(actions, registry, out, EncodeConstants.OF13_VERSION_ID);
\r
198 Assert.assertEquals("Wrong action type", 0, out.readUnsignedShort());
\r
199 Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());
\r
200 Assert.assertEquals("Wrong action port", 42, out.readUnsignedInt());
\r
201 Assert.assertEquals("Wrong action max-length", 52, out.readUnsignedShort());
\r
203 Assert.assertEquals("Wrong action type", 11, out.readUnsignedShort());
\r
204 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
206 Assert.assertEquals("Wrong action type", 12, out.readUnsignedShort());
\r
207 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
209 Assert.assertEquals("Wrong action type", 15, out.readUnsignedShort());
\r
210 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
211 Assert.assertEquals("Wrong action mpls-ttl", 4, out.readUnsignedByte());
\r
213 Assert.assertEquals("Wrong action type", 16, out.readUnsignedShort());
\r
214 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
216 Assert.assertEquals("Wrong action type", 17, out.readUnsignedShort());
\r
217 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
218 Assert.assertEquals("Wrong action ethertype", 16, out.readUnsignedShort());
\r
220 Assert.assertEquals("Wrong action type", 18, out.readUnsignedShort());
\r
221 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
223 Assert.assertEquals("Wrong action type", 19, out.readUnsignedShort());
\r
224 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
225 Assert.assertEquals("Wrong action ethertype", 17, out.readUnsignedShort());
\r
227 Assert.assertEquals("Wrong action type", 20, out.readUnsignedShort());
\r
228 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
229 Assert.assertEquals("Wrong action ethertype", 18, out.readUnsignedShort());
\r
231 Assert.assertEquals("Wrong action type", 21, out.readUnsignedShort());
\r
232 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
233 Assert.assertEquals("Wrong action queue-id", 1234, out.readUnsignedInt());
\r
234 Assert.assertEquals("Wrong action type", 22, out.readUnsignedShort());
\r
235 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
236 Assert.assertEquals("Wrong action group", 555, out.readUnsignedInt());
\r
237 Assert.assertEquals("Wrong action type", 23, out.readUnsignedShort());
\r
238 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
239 Assert.assertEquals("Wrong action nw-ttl", 8, out.readUnsignedByte());
\r
241 Assert.assertEquals("Wrong action type", 24, out.readUnsignedShort());
\r
242 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
244 Assert.assertEquals("Wrong action type", 25, out.readUnsignedShort());
\r
245 Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());
\r
246 Assert.assertEquals("Wrong match entry class", 0x8000, out.readUnsignedShort());
\r
247 Assert.assertEquals("Wrong match entry field & mask", 0, out.readUnsignedByte());
\r
248 Assert.assertEquals("Wrong match entry length", 4, out.readUnsignedByte());
\r
249 Assert.assertEquals("Wrong match entry value", 1, out.readUnsignedInt());
\r
251 Assert.assertEquals("Wrong action type", 26, out.readUnsignedShort());
\r
252 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
253 Assert.assertEquals("Wrong action ethertype", 19, out.readUnsignedShort());
\r
255 Assert.assertEquals("Wrong action type", 27, out.readUnsignedShort());
\r
256 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
258 Assert.assertEquals("Wrong action type", 65535, out.readUnsignedShort());
\r
259 Assert.assertEquals("Wrong action length", 16, out.readUnsignedShort());
\r
260 Assert.assertEquals("Wrong experimenter", 82, out.readUnsignedInt());
\r
261 byte[] tmp = new byte[8];
\r
262 out.readBytes(tmp);
\r
263 Assert.assertArrayEquals("Wrong data", expData, tmp);
\r
264 Assert.assertEquals("Wrong action type", 65535, out.readUnsignedShort());
\r
265 Assert.assertEquals("Wrong action length", 8, out.readUnsignedShort());
\r
266 Assert.assertEquals("Wrong experimenter", 102, out.readUnsignedInt());
\r
267 Assert.assertTrue("Unread data", out.readableBytes() == 0);
\r