Merge remote-tracking branch 'liblldp/master'
[openflowplugin.git] / openflowplugin / src / test / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / match / MatchConvertorTest.java
1 /*
2  * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
3  *
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
7  */
8
9 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;
10
11 import java.math.BigInteger;
12 import java.util.List;
13 import java.util.Optional;
14 import org.junit.Assert;
15 import org.junit.Before;
16 import org.junit.Test;
17 import org.opendaylight.openflowplugin.api.OFConstants;
18 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
19 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManagerFactory;
20 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Dscp;
22 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6FlowLabel;
26 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
27 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpOp;
65 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSha;
66 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpSpa;
67 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTha;
68 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ArpTpa;
69 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthDst;
70 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthSrc;
71 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.EthType;
72 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Code;
73 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv4Type;
74 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Code;
75 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Icmpv6Type;
76 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPhyPort;
77 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.InPort;
78 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpDscp;
79 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpEcn;
80 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.IpProto;
81 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Dst;
82 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv4Src;
83 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Dst;
84 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Exthdr;
85 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Flabel;
86 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdSll;
87 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTarget;
88 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6NdTll;
89 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Ipv6Src;
90 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
91 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.Metadata;
92 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsBos;
93 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsLabel;
94 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MplsTc;
95 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.OpenflowBasicClass;
96 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.PbbIsid;
97 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpDst;
98 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.SctpSrc;
99 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpDst;
100 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TcpSrc;
101 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.TunnelId;
102 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpDst;
103 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.UdpSrc;
104 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanVid;
105 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
106 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpOpCase;
107 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpShaCase;
108 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpSpaCase;
109 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpThaCase;
110 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.ArpTpaCase;
111 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthDstCase;
112 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthSrcCase;
113 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.EthTypeCase;
114 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4CodeCase;
115 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv4TypeCase;
116 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6CodeCase;
117 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Icmpv6TypeCase;
118 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPhyPortCase;
119 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.InPortCase;
120 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpDscpCase;
121 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpEcnCase;
122 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.IpProtoCase;
123 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4DstCase;
124 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv4SrcCase;
125 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6DstCase;
126 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6ExthdrCase;
127 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6FlabelCase;
128 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdSllCase;
129 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTargetCase;
130 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6NdTllCase;
131 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.Ipv6SrcCase;
132 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MetadataCase;
133 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsBosCase;
134 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsLabelCase;
135 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.MplsTcCase;
136 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.PbbIsidCase;
137 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpDstCase;
138 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.SctpSrcCase;
139 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpDstCase;
140 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TcpSrcCase;
141 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.TunnelIdCase;
142 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpDstCase;
143 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.UdpSrcCase;
144 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanPcpCase;
145 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entry.value.grouping.match.entry.value.VlanVidCase;
146
147 /**
148  * @author michal.polkorab
149  */
150 public class MatchConvertorTest {
151
152     private ConvertorManager converterManager;
153
154     /**
155      * Initializes OpenflowPortsUtil
156      */
157     @Before
158     public void startUp() {
159         converterManager = ConvertorManagerFactory.createDefaultManager();
160     }
161
162     @Test
163     public void testConversion() {
164         MatchBuilder builder = new MatchBuilder();
165         builder.setInPort(new NodeConnectorId("openflow:42:1"));
166         builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));
167         MetadataBuilder metadataBuilder = new MetadataBuilder();
168         metadataBuilder.setMetadata(new BigInteger("3"));
169         builder.setMetadata(metadataBuilder.build());
170         EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
171         EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();
172         ethTypeBuilder.setType(new EtherType(4L));
173         ethernetBuilder.setEthernetType(ethTypeBuilder.build());
174         EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
175         ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
176         ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
177         EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
178         ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
179         ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
180         builder.setEthernetMatch(ethernetBuilder.build());
181         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
182         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
183         vlanIdBuilder.setVlanId(new VlanId(7));
184         vlanIdBuilder.setVlanIdPresent(true);
185         vlanBuilder.setVlanId(vlanIdBuilder.build());
186         vlanBuilder.setVlanPcp(new VlanPcp((short) 7));
187         builder.setVlanMatch(vlanBuilder.build());
188         IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();
189         ipMatchBuilder.setIpDscp(new Dscp((short) 8));
190         ipMatchBuilder.setIpEcn((short) 9);
191         ipMatchBuilder.setIpProtocol((short) 10);
192         builder.setIpMatch(ipMatchBuilder.build());
193         TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();
194         tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));
195         tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));
196         builder.setLayer4Match(tcpMatchBuilder.build());
197         Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();
198         icmpv4Builder.setIcmpv4Type((short) 13);
199         icmpv4Builder.setIcmpv4Code((short) 14);
200         builder.setIcmpv4Match(icmpv4Builder.build());
201         Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();
202         icmpv6Builder.setIcmpv6Type((short) 15);
203         icmpv6Builder.setIcmpv6Code((short) 16);
204         builder.setIcmpv6Match(icmpv6Builder.build());
205         ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
206         protoBuilder.setMplsLabel(17L);
207         protoBuilder.setMplsTc((short) 18);
208         protoBuilder.setMplsBos((short) 19);
209         PbbBuilder pbbBuilder = new PbbBuilder();
210         pbbBuilder.setPbbIsid(20L);
211         protoBuilder.setPbb(pbbBuilder.build());
212         builder.setProtocolMatchFields(protoBuilder.build());
213         TunnelBuilder tunnelBuilder = new TunnelBuilder();
214         tunnelBuilder.setTunnelId(new BigInteger("21"));
215         builder.setTunnel(tunnelBuilder.build());
216         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
217         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
218         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
219         builder.setLayer3Match(ipv4MatchBuilder.build());
220         Match match = builder.build();
221
222         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
223         List<MatchEntry> entries = entriesOptional.get();
224         Assert.assertEquals("Wrong entries size", 24, entries.size());
225         MatchEntry entry = entries.get(0);
226         checkEntryHeader(entry, InPort.class, false);
227         Assert.assertEquals("Wrong in port", 1, ((InPortCase) entry.getMatchEntryValue()).getInPort()
228                 .getPortNumber().getValue().intValue());
229
230         entry = entries.get(1);
231         checkEntryHeader(entry, InPhyPort.class, false);
232         Assert.assertEquals("Wrong in phy port", 2, ((InPhyPortCase) entry.getMatchEntryValue()).
233                 getInPhyPort().getPortNumber().getValue().intValue());
234
235         entry = entries.get(2);
236         checkEntryHeader(entry, Metadata.class, false);
237         Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
238                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
239         entry = entries.get(3);
240         checkEntryHeader(entry, EthDst.class, false);
241         Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
242                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
243         entry = entries.get(4);
244         checkEntryHeader(entry, EthSrc.class, false);
245         Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
246                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
247         entry = entries.get(5);
248         checkEntryHeader(entry, EthType.class, false);
249         Assert.assertEquals("Wrong eth type", 4, ((EthTypeCase) entry.getMatchEntryValue())
250                 .getEthType().getEthType().getValue().intValue());
251         entry = entries.get(6);
252         checkEntryHeader(entry, VlanVid.class, false);
253         Assert.assertEquals("Wrong vlan id", 7, ((VlanVidCase) entry.getMatchEntryValue())
254                 .getVlanVid().getVlanVid().intValue());
255         Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue())
256                 .getVlanVid().isCfiBit());
257         entry = entries.get(7);
258         checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.VlanPcp.class, false);
259         Assert.assertEquals("Wrong vlan pcp", 7, ((VlanPcpCase) entry.getMatchEntryValue())
260                 .getVlanPcp().getVlanPcp().intValue());
261         entry = entries.get(8);
262         checkEntryHeader(entry, IpDscp.class, false);
263         Assert.assertEquals("Wrong ip dscp", 8, ((IpDscpCase) entry.getMatchEntryValue())
264                 .getIpDscp().getDscp().getValue().intValue());
265         entry = entries.get(9);
266         checkEntryHeader(entry, IpEcn.class, false);
267         Assert.assertEquals("Wrong ip ecn", 9, ((IpEcnCase) entry.getMatchEntryValue())
268                 .getIpEcn().getEcn().intValue());
269         entry = entries.get(10);
270         checkEntryHeader(entry, IpProto.class, false);
271         Assert.assertEquals("Wrong ip proto", 10, ((IpProtoCase) entry.getMatchEntryValue())
272                 .getIpProto().getProtocolNumber().intValue());
273         entry = entries.get(11);
274         checkEntryHeader(entry, TcpSrc.class, false);
275         Assert.assertEquals("Wrong tcp src", 11, ((TcpSrcCase) entry.getMatchEntryValue())
276                 .getTcpSrc().getPort().getValue().intValue());
277         entry = entries.get(12);
278         checkEntryHeader(entry, TcpDst.class, false);
279         Assert.assertEquals("Wrong tcp dst", 12, ((TcpDstCase) entry.getMatchEntryValue())
280                 .getTcpDst().getPort().getValue().intValue());
281         entry = entries.get(13);
282         checkEntryHeader(entry, Icmpv4Type.class, false);
283         Assert.assertEquals("Wrong icmpv4 type", 13, ((Icmpv4TypeCase) entry.getMatchEntryValue())
284                 .getIcmpv4Type().getIcmpv4Type().intValue());
285         entry = entries.get(14);
286         checkEntryHeader(entry, Icmpv4Code.class, false);
287         Assert.assertEquals("Wrong icmpv4 code", 14, ((Icmpv4CodeCase) entry.getMatchEntryValue())
288                 .getIcmpv4Code().getIcmpv4Code().intValue());
289         entry = entries.get(15);
290         checkEntryHeader(entry, Icmpv6Type.class, false);
291         Assert.assertEquals("Wrong icmpv6 type", 15, ((Icmpv6TypeCase) entry.getMatchEntryValue())
292                 .getIcmpv6Type().getIcmpv6Type().intValue());
293         entry = entries.get(16);
294         checkEntryHeader(entry, Icmpv6Code.class, false);
295         Assert.assertEquals("Wrong icmpv6 code", 16, ((Icmpv6CodeCase) entry.getMatchEntryValue())
296                 .getIcmpv6Code().getIcmpv6Code().intValue());
297         entry = entries.get(17);
298         checkEntryHeader(entry, Ipv4Src.class, false);
299         Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue())
300                 .getIpv4Src().getIpv4Address().getValue());
301         entry = entries.get(18);
302         checkEntryHeader(entry, Ipv4Dst.class, false);
303         Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue())
304                 .getIpv4Dst().getIpv4Address().getValue());
305         entry = entries.get(19);
306         checkEntryHeader(entry, MplsLabel.class, false);
307         Assert.assertEquals("Wrong mpls label", 17, ((MplsLabelCase) entry.getMatchEntryValue())
308                 .getMplsLabel().getMplsLabel().intValue());
309         entry = entries.get(20);
310         checkEntryHeader(entry, MplsBos.class, false);
311         Assert.assertEquals("Wrong mpls bos", true, ((MplsBosCase) entry.getMatchEntryValue()).getMplsBos().isBos());
312         entry = entries.get(21);
313         checkEntryHeader(entry, MplsTc.class, false);
314         Assert.assertEquals("Wrong mpls tc", 18, ((MplsTcCase) entry.getMatchEntryValue())
315                 .getMplsTc().getTc().intValue());
316         entry = entries.get(22);
317         checkEntryHeader(entry, PbbIsid.class, false);
318         Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
319                 .getPbbIsid().getIsid().intValue());
320         entry = entries.get(23);
321         checkEntryHeader(entry, TunnelId.class, false);
322         Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
323                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
324     }
325
326     private static void checkEntryHeader(MatchEntry entry, Class<? extends MatchField> field, boolean hasMask) {
327         Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());
328         Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());
329         Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());
330     }
331
332     @Test
333     public void testIpv4MatchArbitraryBitMaskwithNoMask(){
334         MatchBuilder builder = new MatchBuilder();
335         Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
336         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
337         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
338         builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
339         Match match = builder.build();
340
341         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
342         List<MatchEntry> entries = entriesOptional.get();
343         Assert.assertEquals("Wrong entries size", 2, entries.size());
344
345         MatchEntry entry = entries.get(0);
346         checkEntryHeader(entry,Ipv4Src.class,false);
347         Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
348         entry = entries.get(1);
349         checkEntryHeader(entry,Ipv4Dst.class,false);
350         Assert.assertEquals("wrong Ipv4Address destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
351     }
352
353     @Test
354     public void testIpv4MatchArbitraryBitMaskwithMask(){
355         MatchBuilder builder = new MatchBuilder();
356         Ipv4MatchArbitraryBitMaskBuilder ipv4MatchArbitraryBitMaskBuilder= new Ipv4MatchArbitraryBitMaskBuilder();
357         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceAddressNoMask( new Ipv4Address("10.2.2.2"));
358         ipv4MatchArbitraryBitMaskBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("0.0.255.0"));
359         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationAddressNoMask( new Ipv4Address("10.1.1.1"));
360         ipv4MatchArbitraryBitMaskBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("0.240.0.0"));
361         builder.setLayer3Match(ipv4MatchArbitraryBitMaskBuilder.build());
362         Match match = builder.build();
363
364         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
365         List<MatchEntry> entries = entriesOptional.get();
366         Assert.assertEquals("Wrong entries size", 2, entries.size());
367
368         MatchEntry entry = entries.get(0);
369         checkEntryHeader(entry,Ipv4Src.class,true);
370         Assert.assertEquals("wrong Ipv4Address source", "10.2.2.2",((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getIpv4Address().getValue());
371         entry = entries.get(1);
372         checkEntryHeader(entry,Ipv4Dst.class,true);
373         Assert.assertEquals("wrong Ipv4Adress destination", "10.1.1.1",((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getIpv4Address().getValue());
374     }
375
376     @Test
377     public void testUdpMatchConversion() {
378         MatchBuilder builder = new MatchBuilder();
379         UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();
380         udpMatchBuilder.setUdpSourcePort(new PortNumber(11));
381         udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));
382         builder.setLayer4Match(udpMatchBuilder.build());
383         Match match = builder.build();
384
385         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
386         List<MatchEntry> entries = entriesOptional.get();
387         Assert.assertEquals("Wrong entries size", 2, entries.size());
388         MatchEntry entry = entries.get(0);
389         checkEntryHeader(entry, UdpSrc.class, false);
390         Assert.assertEquals("Wrong udp src", 11, ((UdpSrcCase) entry.getMatchEntryValue()).getUdpSrc()
391                 .getPort().getValue().intValue());
392         entry = entries.get(1);
393         checkEntryHeader(entry, UdpDst.class, false);
394         Assert.assertEquals("Wrong udp dst", 12, ((UdpDstCase) entry.getMatchEntryValue())
395                 .getUdpDst().getPort().getValue().intValue());
396     }
397
398     @Test
399     public void testTunnelIpv4MatchConversion() {
400         MatchBuilder builder = new MatchBuilder();
401         TunnelIpv4MatchBuilder tunnelIpv4MatchBuilder = new TunnelIpv4MatchBuilder();
402         tunnelIpv4MatchBuilder.setTunnelIpv4Source(new Ipv4Prefix("10.0.0.1/32"));
403         tunnelIpv4MatchBuilder.setTunnelIpv4Destination(new Ipv4Prefix("10.0.0.2/32"));
404         builder.setLayer3Match(tunnelIpv4MatchBuilder.build());
405         Match match = builder.build();
406
407         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
408         List<MatchEntry> entries = entriesOptional.get();
409         Assert.assertEquals("Wrong entries size", 2, entries.size());
410         MatchEntry entry = entries.get(0);
411         checkEntryHeader(entry, Ipv4Src.class, false);
412         Assert.assertEquals("Wrong ipv4 tunnel src", "10.0.0.1", ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src()
413                 .getIpv4Address().getValue());
414         entry = entries.get(1);
415         checkEntryHeader(entry, Ipv4Dst.class, false);
416         Assert.assertEquals("Wrong ipv4 tunnel dst", "10.0.0.2", ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst()
417                 .getIpv4Address().getValue());
418     }
419
420     @Test
421     public void testSctpMatchConversion() {
422         MatchBuilder builder = new MatchBuilder();
423         SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();
424         sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));
425         sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));
426         builder.setLayer4Match(sctpMatchBuilder.build());
427         Match match = builder.build();
428
429         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
430         List<MatchEntry> entries = entriesOptional.get();
431         Assert.assertEquals("Wrong entries size", 2, entries.size());
432         MatchEntry entry = entries.get(0);
433         checkEntryHeader(entry, SctpSrc.class, false);
434         Assert.assertEquals("Wrong sctp src", 11, ((SctpSrcCase) entry.getMatchEntryValue()).getSctpSrc()
435                 .getPort().getValue().intValue());
436         entry = entries.get(1);
437         checkEntryHeader(entry, SctpDst.class, false);
438         Assert.assertEquals("Wrong sctp dst", 12, ((SctpDstCase) entry.getMatchEntryValue())
439                 .getSctpDst().getPort().getValue().intValue());
440     }
441
442     @Test
443     public void testArpMatchConversion() {
444         MatchBuilder builder = new MatchBuilder();
445         ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
446         arpBuilder.setArpOp(5);
447         arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/32"));
448         arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));
449         ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
450         srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
451         arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
452         ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
453         dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
454         arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
455         builder.setLayer3Match(arpBuilder.build());
456         Match match = builder.build();
457
458         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
459         List<MatchEntry> entries = entriesOptional.get();
460         Assert.assertEquals("Wrong entries size", 5, entries.size());
461         MatchEntry entry = entries.get(0);
462         checkEntryHeader(entry, ArpOp.class, false);
463         Assert.assertEquals("Wrong arp op", 5, ((ArpOpCase) entry.getMatchEntryValue())
464                 .getArpOp().getOpCode().intValue());
465         entry = entries.get(1);
466         checkEntryHeader(entry, ArpSpa.class, false);
467         Assert.assertEquals("Wrong arp spa", "10.0.0.3", ((ArpSpaCase) entry.getMatchEntryValue())
468                 .getArpSpa().getIpv4Address().getValue());
469         entry = entries.get(2);
470         checkEntryHeader(entry, ArpTpa.class, false);
471         Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue())
472                 .getArpTpa().getIpv4Address().getValue());
473         entry = entries.get(3);
474         checkEntryHeader(entry, ArpSha.class, false);
475         Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
476                 .getArpSha().getMacAddress().getValue());
477         entry = entries.get(4);
478         checkEntryHeader(entry, ArpTha.class, false);
479         Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue())
480                 .getArpTha().getMacAddress().getValue());
481     }
482
483     @Test
484     public void testArpMatchConversionWithMasks() {
485         MatchBuilder builder = new MatchBuilder();
486         ArpMatchBuilder arpBuilder = new ArpMatchBuilder();
487         /* Use canonnical prefixes !!! */
488         arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.0/8"));
489         arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/31"));
490         ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();
491         srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
492         srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
493         arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());
494         ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();
495         dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
496         dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
497         arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());
498         builder.setLayer3Match(arpBuilder.build());
499         Match match = builder.build();
500
501         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
502         List<MatchEntry> entries = entriesOptional.get();
503         Assert.assertEquals("Wrong entries size", 4, entries.size());
504         MatchEntry entry = entries.get(0);
505         entry = entries.get(0);
506         checkEntryHeader(entry, ArpSpa.class, true);
507         Assert.assertEquals("Wrong arp spa", "10.0.0.0", ((ArpSpaCase) entry.getMatchEntryValue())
508                 .getArpSpa().getIpv4Address().getValue());
509         Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},
510                 ((ArpSpaCase) entry.getMatchEntryValue()).getArpSpa().getMask());
511         entry = entries.get(1);
512         checkEntryHeader(entry, ArpTpa.class, true);
513         Assert.assertEquals("Wrong arp tpa", "10.0.0.4", ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa()
514                 .getIpv4Address().getValue());
515         Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 254},
516                 ((ArpTpaCase) entry.getMatchEntryValue()).getArpTpa().getMask());
517         entry = entries.get(2);
518         checkEntryHeader(entry, ArpSha.class, true);
519         Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", ((ArpShaCase) entry.getMatchEntryValue())
520                 .getArpSha().getMacAddress().getValue());
521         Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},
522                 ((ArpShaCase) entry.getMatchEntryValue()).getArpSha().getMask());
523         entry = entries.get(3);
524         checkEntryHeader(entry, ArpTha.class, true);
525         Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", ((ArpThaCase) entry.getMatchEntryValue()).getArpTha()
526                 .getMacAddress().getValue());
527         Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},
528                 ((ArpThaCase) entry.getMatchEntryValue()).getArpTha().getMask());
529     }
530
531     @Test
532     public void testIpv6MatchConversion() {
533         MatchBuilder builder = new MatchBuilder();
534         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
535         ipv6Builder.setIpv6Source(new Ipv6Prefix("::1/128"));
536         ipv6Builder.setIpv6Destination(new Ipv6Prefix("::2/128"));
537         Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();
538         ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));
539         ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());
540         ipv6Builder.setIpv6NdTarget(new Ipv6Address("::4"));
541         ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));
542         ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));
543         Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
544         extHdrBuilder.setIpv6Exthdr(153);
545         ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
546         builder.setLayer3Match(ipv6Builder.build());
547         Match match = builder.build();
548
549         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
550         List<MatchEntry> entries = entriesOptional.get();
551         Assert.assertEquals("Wrong entries size", 7, entries.size());
552         MatchEntry entry = entries.get(0);
553         /* Due to conversion ambiguities, we always get "has mask" because
554          * an ip with no mask and prefix with /128 (or 32 in v4) cannot
555          * be distinguished */
556         checkEntryHeader(entry, Ipv6Src.class, true);
557         Assert.assertEquals("Wrong ipv6 src", "::1",
558                 ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
559         entry = entries.get(1);
560         checkEntryHeader(entry, Ipv6Dst.class, true);
561         Assert.assertEquals("Wrong ipv6 dst", "::2",
562                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
563         entry = entries.get(2);
564         checkEntryHeader(entry, Ipv6Flabel.class, false);
565         Assert.assertEquals("Wrong ipv6 flabel", 3,
566                 ((Ipv6FlabelCase) entry.getMatchEntryValue()).getIpv6Flabel().getIpv6Flabel().getValue().intValue());
567         entry = entries.get(3);
568         checkEntryHeader(entry, Ipv6NdTarget.class, false);
569         Assert.assertEquals("Wrong ipv6 nd target", "::4",
570                 ((Ipv6NdTargetCase) entry.getMatchEntryValue()).getIpv6NdTarget().getIpv6Address().getValue());
571         entry = entries.get(4);
572         checkEntryHeader(entry, Ipv6NdSll.class, false);
573         Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",
574                 ((Ipv6NdSllCase) entry.getMatchEntryValue()).getIpv6NdSll().getMacAddress().getValue());
575         entry = entries.get(5);
576         checkEntryHeader(entry, Ipv6NdTll.class, false);
577         Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",
578                 ((Ipv6NdTllCase) entry.getMatchEntryValue()).getIpv6NdTll().getMacAddress().getValue());
579         entry = entries.get(6);
580         checkEntryHeader(entry, Ipv6Exthdr.class, false);
581         Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,
582                 true, false, true, false), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
583     }
584
585     @Test
586     public void testIpv6MatchConversionWithMasks() {
587         MatchBuilder builder = new MatchBuilder();
588         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
589         ipv6Builder.setIpv6Source(new Ipv6Prefix("::/24"));
590         ipv6Builder.setIpv6Destination(new Ipv6Prefix("::/64"));
591         builder.setLayer3Match(ipv6Builder.build());
592         Match match = builder.build();
593
594         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
595         List<MatchEntry> entries = entriesOptional.get();
596         Assert.assertEquals("Wrong entries size", 2, entries.size());
597         MatchEntry entry = entries.get(0);
598         checkEntryHeader(entry, Ipv6Src.class, true);
599         Assert.assertEquals("Wrong ipv6 src", "::",
600                 ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
601         Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,
602                 0, 0, 0, 0, 0, 0, 0, 0, 0}, ((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getMask());
603         entry = entries.get(1);
604         checkEntryHeader(entry, Ipv6Dst.class, true);
605         Assert.assertEquals("Wrong ipv6 dst", "::",
606                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
607         Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,
608                         (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},
609                 ((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getMask());
610     }
611
612     @Test
613     public void testIpv6ExtHeaderConversion() {
614         MatchBuilder builder = new MatchBuilder();
615         Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();
616         Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();
617         extHdrBuilder.setIpv6Exthdr(358);
618         extHdrBuilder.setIpv6ExthdrMask(258);
619         ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());
620         builder.setLayer3Match(ipv6Builder.build());
621         Match match = builder.build();
622
623         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
624         List<MatchEntry> entries = entriesOptional.get();
625         Assert.assertEquals("Wrong entries size", 1, entries.size());
626         MatchEntry entry = entries.get(0);
627         checkEntryHeader(entry, Ipv6Exthdr.class, true);
628         Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,
629                 true, false, true), ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getPseudoField());
630         Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2},
631                 ((Ipv6ExthdrCase) entry.getMatchEntryValue()).getIpv6Exthdr().getMask());
632     }
633
634     @Test
635     public void testConversionWithMasks() {
636         MatchBuilder builder = new MatchBuilder();
637         MetadataBuilder metadataBuilder = new MetadataBuilder();
638         metadataBuilder.setMetadata(new BigInteger("3"));
639         metadataBuilder.setMetadataMask(new BigInteger("15"));
640         builder.setMetadata(metadataBuilder.build());
641         EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();
642         EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();
643         ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));
644         ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));
645         ethernetBuilder.setEthernetSource(ethSrcBuilder.build());
646         EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();
647         ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));
648         ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));
649         ethernetBuilder.setEthernetDestination(ethDstBuilder.build());
650         builder.setEthernetMatch(ethernetBuilder.build());
651         VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();
652         VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();
653         vlanIdBuilder.setVlanId(new VlanId(0));
654         vlanIdBuilder.setVlanIdPresent(true);
655         vlanBuilder.setVlanId(vlanIdBuilder.build());
656         builder.setVlanMatch(vlanBuilder.build());
657         ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();
658         PbbBuilder pbbBuilder = new PbbBuilder();
659         pbbBuilder.setPbbIsid(20L);
660         pbbBuilder.setPbbMask(8L);
661         protoBuilder.setPbb(pbbBuilder.build());
662         builder.setProtocolMatchFields(protoBuilder.build());
663         TunnelBuilder tunnelBuilder = new TunnelBuilder();
664         tunnelBuilder.setTunnelId(new BigInteger("21"));
665         tunnelBuilder.setTunnelMask(new BigInteger("14"));
666         builder.setTunnel(tunnelBuilder.build());
667         Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();
668         ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.0/24"));
669         ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.0/8"));
670         builder.setLayer3Match(ipv4MatchBuilder.build());
671         Match match = builder.build();
672
673         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
674         List<MatchEntry> entries = entriesOptional.get();
675         Assert.assertEquals("Wrong entries size", 8, entries.size());
676         MatchEntry entry = entries.get(0);
677         checkEntryHeader(entry, Metadata.class, true);
678         Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},
679                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMetadata());
680         Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},
681                 ((MetadataCase) entry.getMatchEntryValue()).getMetadata().getMask());
682         entry = entries.get(1);
683         checkEntryHeader(entry, EthDst.class, true);
684         Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),
685                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMacAddress());
686         Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},
687                 ((EthDstCase) entry.getMatchEntryValue()).getEthDst().getMask());
688         entry = entries.get(2);
689         checkEntryHeader(entry, EthSrc.class, true);
690         Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),
691                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMacAddress());
692         Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},
693                 ((EthSrcCase) entry.getMatchEntryValue()).getEthSrc().getMask());
694         entry = entries.get(3);
695         checkEntryHeader(entry, VlanVid.class, true);
696         Assert.assertEquals("Wrong vlan id", 0, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
697                 .getVlanVid().intValue());
698         Assert.assertEquals("Wrong cfi bit", true, ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid()
699                 .isCfiBit());
700         Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},
701                 ((VlanVidCase) entry.getMatchEntryValue()).getVlanVid().getMask());
702         entry = entries.get(4);
703         checkEntryHeader(entry, Ipv4Src.class, true);
704         Assert.assertEquals("Wrong ipv4 src", "10.0.0.0", ((Ipv4SrcCase) entry.getMatchEntryValue())
705                 .getIpv4Src().getIpv4Address().getValue());
706         Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},
707                 ((Ipv4SrcCase) entry.getMatchEntryValue()).getIpv4Src().getMask());
708         entry = entries.get(5);
709         checkEntryHeader(entry, Ipv4Dst.class, true);
710         Assert.assertEquals("Wrong ipv4 dst", "10.0.0.0", ((Ipv4DstCase) entry.getMatchEntryValue())
711                 .getIpv4Dst().getIpv4Address().getValue());
712         Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},
713                 ((Ipv4DstCase) entry.getMatchEntryValue()).getIpv4Dst().getMask());
714         entry = entries.get(6);
715         checkEntryHeader(entry, PbbIsid.class, true);
716         Assert.assertEquals("Wrong pbb isid", 20, ((PbbIsidCase) entry.getMatchEntryValue())
717                 .getPbbIsid().getIsid().intValue());
718         Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},
719                 ((PbbIsidCase) entry.getMatchEntryValue()).getPbbIsid().getMask());
720         entry = entries.get(7);
721         checkEntryHeader(entry, TunnelId.class, true);
722         Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},
723                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getTunnelId());
724         Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},
725                 ((TunnelIdCase) entry.getMatchEntryValue()).getTunnelId().getMask());
726     }
727
728     @Test
729     public void testIpv6MatchArbitraryBitMask(){
730         MatchBuilder builder = new MatchBuilder();
731         Ipv6MatchArbitraryBitMaskBuilder ipv6MatchArbitraryBitMaskBuilder= new Ipv6MatchArbitraryBitMaskBuilder();
732         ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
733         ipv6MatchArbitraryBitMaskBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
734         ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0"));
735         ipv6MatchArbitraryBitMaskBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:A555"));
736         builder.setLayer3Match(ipv6MatchArbitraryBitMaskBuilder.build());
737         Match match = builder.build();
738
739         Optional<List<MatchEntry>> entriesOptional = converterManager.convert(match, new VersionConvertorData(OFConstants.OFP_VERSION_1_3));
740         List<MatchEntry> entries = entriesOptional.get();
741         Assert.assertEquals("Wrong entries size", 2, entries.size());
742
743         MatchEntry entry = entries.get(0);
744         checkEntryHeader(entry,Ipv6Src.class,true);
745         Assert.assertEquals("wrong Ipv6Adress source", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6SrcCase) entry.getMatchEntryValue()).getIpv6Src().getIpv6Address().getValue());
746         entry = entries.get(1);
747         checkEntryHeader(entry,Ipv6Dst.class,true);
748         Assert.assertEquals("wrong Ipv6Adress destination", "fbA0:FFB6:FFF0:FFF0:FFF0:FFF0:FFF0:AFF0",((Ipv6DstCase) entry.getMatchEntryValue()).getIpv6Dst().getIpv6Address().getValue());
749     }
750 }
751