2 * Copyright (c) 2017 Pantheon Technologies s.r.o. and others. All rights reserved.
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
9 package org.opendaylight.openflowplugin.impl.protocol.serialization.multipart.tablefeatures.matchfield;
11 import static org.junit.Assert.assertEquals;
13 import com.google.common.collect.ImmutableList;
14 import org.junit.Test;
15 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
16 import org.opendaylight.openflowjava.protocol.api.util.OxmMatchConstants;
17 import org.opendaylight.openflowplugin.impl.protocol.serialization.multipart.tablefeatures.AbstractTablePropertySerializerTest;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesPropType;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpOp;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSha;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpSpa;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTha;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.ArpTpa;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthDst;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthSrc;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.EthType;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Code;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv4Type;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Code;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Icmpv6Type;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPhyPort;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.InPort;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpDscp;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpEcn;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.IpProto;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Dst;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv4Src;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Dst;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Exthdr;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Flabel;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdSll;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTarget;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6NdTll;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Ipv6Src;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.Metadata;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsBos;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsLabel;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.MplsTc;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.PbbIsid;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpDst;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.SctpSrc;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpDst;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpFlags;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TcpSrc;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TunnelId;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpDst;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.UdpSrc;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanPcp;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.VlanVid;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatch;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.set.field.match.SetFieldMatchBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.TableFeaturePropType;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.Match;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.MatchBuilder;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.table.feature.prop.type.table.feature.prop.type.match.MatchSetfieldBuilder;
67 public class MatchFieldSerializerTest extends AbstractTablePropertySerializerTest {
69 public void testSerialize() {
70 final Match property = new MatchBuilder()
71 .setMatchSetfield(new MatchSetfieldBuilder()
72 .setSetFieldMatch(ImmutableList
73 .<SetFieldMatch>builder()
74 .add(new SetFieldMatchBuilder()
75 .setMatchType(ArpOp.class)
78 .add(new SetFieldMatchBuilder()
79 .setMatchType(ArpSha.class)
82 .add(new SetFieldMatchBuilder()
83 .setMatchType(ArpSpa.class)
86 .add(new SetFieldMatchBuilder()
87 .setMatchType(ArpTha.class)
90 .add(new SetFieldMatchBuilder()
91 .setMatchType(ArpTpa.class)
94 .add(new SetFieldMatchBuilder()
95 .setMatchType(EthDst.class)
98 .add(new SetFieldMatchBuilder()
99 .setMatchType(EthSrc.class)
102 .add(new SetFieldMatchBuilder()
103 .setMatchType(EthType.class)
106 .add(new SetFieldMatchBuilder()
107 .setMatchType(Icmpv4Code.class)
110 .add(new SetFieldMatchBuilder()
111 .setMatchType(Icmpv4Type.class)
114 .add(new SetFieldMatchBuilder()
115 .setMatchType(Icmpv6Code.class)
118 .add(new SetFieldMatchBuilder()
119 .setMatchType(Icmpv6Type.class)
122 .add(new SetFieldMatchBuilder()
123 .setMatchType(InPhyPort.class)
126 .add(new SetFieldMatchBuilder()
127 .setMatchType(InPort.class)
130 .add(new SetFieldMatchBuilder()
131 .setMatchType(IpDscp.class)
134 .add(new SetFieldMatchBuilder()
135 .setMatchType(IpEcn.class)
138 .add(new SetFieldMatchBuilder()
139 .setMatchType(IpProto.class)
142 .add(new SetFieldMatchBuilder()
143 .setMatchType(Ipv4Dst.class)
146 .add(new SetFieldMatchBuilder()
147 .setMatchType(Ipv4Src.class)
150 .add(new SetFieldMatchBuilder()
151 .setMatchType(Ipv6Dst.class)
154 .add(new SetFieldMatchBuilder()
155 .setMatchType(Ipv6Exthdr.class)
158 .add(new SetFieldMatchBuilder()
159 .setMatchType(Ipv6Flabel.class)
162 .add(new SetFieldMatchBuilder()
163 .setMatchType(Ipv6NdSll.class)
166 .add(new SetFieldMatchBuilder()
167 .setMatchType(Ipv6NdTarget.class)
170 .add(new SetFieldMatchBuilder()
171 .setMatchType(Ipv6NdTll.class)
174 .add(new SetFieldMatchBuilder()
175 .setMatchType(Ipv6Src.class)
178 .add(new SetFieldMatchBuilder()
179 .setMatchType(Metadata.class)
182 .add(new SetFieldMatchBuilder()
183 .setMatchType(MplsBos.class)
186 .add(new SetFieldMatchBuilder()
187 .setMatchType(MplsLabel.class)
190 .add(new SetFieldMatchBuilder()
191 .setMatchType(MplsTc.class)
194 .add(new SetFieldMatchBuilder()
195 .setMatchType(PbbIsid.class)
198 .add(new SetFieldMatchBuilder()
199 .setMatchType(SctpDst.class)
202 .add(new SetFieldMatchBuilder()
203 .setMatchType(SctpSrc.class)
206 .add(new SetFieldMatchBuilder()
207 .setMatchType(TcpDst.class)
210 .add(new SetFieldMatchBuilder()
211 .setMatchType(TcpFlags.class)
214 .add(new SetFieldMatchBuilder()
215 .setMatchType(TcpSrc.class)
218 .add(new SetFieldMatchBuilder()
219 .setMatchType(TunnelId.class)
222 .add(new SetFieldMatchBuilder()
223 .setMatchType(UdpDst.class)
226 .add(new SetFieldMatchBuilder()
227 .setMatchType(UdpSrc.class)
230 .add(new SetFieldMatchBuilder()
231 .setMatchType(VlanPcp.class)
234 .add(new SetFieldMatchBuilder()
235 .setMatchType(VlanVid.class)
242 assertProperty(property, out -> {
243 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
244 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ARP_OP << 1);
245 out.skipBytes(Byte.BYTES);
247 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
248 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ARP_SHA << 1);
249 out.skipBytes(Byte.BYTES);
251 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
252 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ARP_SPA << 1);
253 out.skipBytes(Byte.BYTES);
255 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
256 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ARP_THA << 1);
257 out.skipBytes(Byte.BYTES);
259 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
260 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ARP_TPA << 1);
261 out.skipBytes(Byte.BYTES);
263 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
264 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ETH_DST << 1);
265 out.skipBytes(Byte.BYTES);
267 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
268 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ETH_SRC << 1);
269 out.skipBytes(Byte.BYTES);
271 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
272 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ETH_TYPE << 1);
273 out.skipBytes(Byte.BYTES);
275 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
276 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ICMPV4_CODE << 1);
277 out.skipBytes(Byte.BYTES);
279 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
280 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ICMPV4_TYPE << 1);
281 out.skipBytes(Byte.BYTES);
283 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
284 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ICMPV6_CODE << 1);
285 out.skipBytes(Byte.BYTES);
287 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
288 assertEquals(out.readUnsignedByte(), OxmMatchConstants.ICMPV6_TYPE << 1);
289 out.skipBytes(Byte.BYTES);
291 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
292 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IN_PHY_PORT << 1);
293 out.skipBytes(Byte.BYTES);
295 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
296 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IN_PORT << 1);
297 out.skipBytes(Byte.BYTES);
299 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
300 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IP_DSCP << 1);
301 out.skipBytes(Byte.BYTES);
303 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
304 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IP_ECN << 1);
305 out.skipBytes(Byte.BYTES);
307 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
308 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IP_PROTO << 1);
309 out.skipBytes(Byte.BYTES);
311 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
312 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV4_DST << 1);
313 out.skipBytes(Byte.BYTES);
315 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
316 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV4_SRC << 1);
317 out.skipBytes(Byte.BYTES);
319 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
320 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_DST << 1);
321 out.skipBytes(Byte.BYTES);
323 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
324 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_EXTHDR << 1);
325 out.skipBytes(Byte.BYTES);
327 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
328 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_FLABEL << 1);
329 out.skipBytes(Byte.BYTES);
331 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
332 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_ND_SLL << 1);
333 out.skipBytes(Byte.BYTES);
335 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
336 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_ND_TARGET << 1);
337 out.skipBytes(Byte.BYTES);
339 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
340 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_ND_TLL << 1);
341 out.skipBytes(Byte.BYTES);
343 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
344 assertEquals(out.readUnsignedByte(), OxmMatchConstants.IPV6_SRC << 1);
345 out.skipBytes(Byte.BYTES);
347 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
348 assertEquals(out.readUnsignedByte(), OxmMatchConstants.METADATA << 1);
349 out.skipBytes(Byte.BYTES);
351 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
352 assertEquals(out.readUnsignedByte(), OxmMatchConstants.MPLS_BOS << 1);
353 out.skipBytes(Byte.BYTES);
355 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
356 assertEquals(out.readUnsignedByte(), OxmMatchConstants.MPLS_LABEL << 1);
357 out.skipBytes(Byte.BYTES);
359 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
360 assertEquals(out.readUnsignedByte(), OxmMatchConstants.MPLS_TC << 1);
361 out.skipBytes(Byte.BYTES);
363 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
364 assertEquals(out.readUnsignedByte(), OxmMatchConstants.PBB_ISID << 1);
365 out.skipBytes(Byte.BYTES);
367 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
368 assertEquals(out.readUnsignedByte(), OxmMatchConstants.SCTP_DST << 1);
369 out.skipBytes(Byte.BYTES);
371 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
372 assertEquals(out.readUnsignedByte(), OxmMatchConstants.SCTP_SRC << 1);
373 out.skipBytes(Byte.BYTES);
375 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
376 assertEquals(out.readUnsignedByte(), OxmMatchConstants.TCP_DST << 1);
377 out.skipBytes(Byte.BYTES);
379 assertEquals(out.readUnsignedShort(), OxmMatchConstants.EXPERIMENTER_CLASS);
380 assertEquals(out.readUnsignedByte(), EncodeConstants.ONFOXM_ET_TCP_FLAGS << 1);
381 out.skipBytes(Byte.BYTES);
383 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
384 assertEquals(out.readUnsignedByte() >>> 1, OxmMatchConstants.TCP_SRC);
385 out.skipBytes(Byte.BYTES);
387 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
388 assertEquals(out.readUnsignedByte(), OxmMatchConstants.TUNNEL_ID << 1);
389 out.skipBytes(Byte.BYTES);
391 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
392 assertEquals(out.readUnsignedByte(), OxmMatchConstants.UDP_DST << 1);
393 out.skipBytes(Byte.BYTES);
395 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
396 assertEquals(out.readUnsignedByte(), OxmMatchConstants.UDP_SRC << 1);
397 out.skipBytes(Byte.BYTES);
399 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
400 assertEquals(out.readUnsignedByte(), OxmMatchConstants.VLAN_PCP << 1);
401 out.skipBytes(Byte.BYTES);
403 assertEquals(out.readUnsignedShort(), OxmMatchConstants.OPENFLOW_BASIC_CLASS);
404 assertEquals(out.readUnsignedByte(), OxmMatchConstants.VLAN_VID << 1);
405 out.skipBytes(Byte.BYTES);
410 protected Class<? extends TableFeaturePropType> getClazz() {
415 protected int getType() {
416 return TableFeaturesPropType.OFPTFPTMATCH.getIntValue();