Bug 1254 - Added MatchConvertorImpl unit tests 68/11668/3
authorMichal Polkorab <michal.polkorab@pantheon.sk>
Thu, 25 Sep 2014 12:25:29 +0000 (14:25 +0200)
committermichal rehak <mirehak@cisco.com>
Sun, 12 Oct 2014 17:34:50 +0000 (17:34 +0000)
 - FIXME - mask computation of PbbIsid match entry (both ways)
 - FIXME - add mask computation for ArpSpa and ArpTpa match entries
 - TODO - finish implementation of vlan vid match entry - isVlanIdPresent() is not set

Change-Id: I9ba5da086584db2e678a79486376a0f9de4b30f0
Signed-off-by: Michal Polkorab <michal.polkorab@pantheon.sk>
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java [new file with mode: 0644]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java [new file with mode: 0644]

diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImpl2Test.java
new file mode 100644 (file)
index 0000000..8b0172b
--- /dev/null
@@ -0,0 +1,665 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
+\r
+import java.math.BigInteger;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Prefix;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.VlanPcp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6ExtHeaderBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ipv6.match.fields.Ipv6LabelBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv4MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.Icmpv6MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.IpMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.MetadataBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.ProtocolMatchFieldsBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.VlanMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.protocol.match.fields.PbbBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.vlan.match.fields.VlanIdBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MatchField;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MatchConvertorImpl2Test {\r
+\r
+    MatchConvertorImpl convertor = new MatchConvertorImpl();\r
+\r
+    /**\r
+     * Initializes OpenflowPortsUtil\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        OpenflowPortsUtil.init();\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testEmptyAndNullInput() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(null, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 0, entries.size());\r
+\r
+        entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 0, entries.size());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setInPort(new NodeConnectorId("openflow:42:1"));\r
+        builder.setInPhyPort(new NodeConnectorId("openflow:42:2"));\r
+        MetadataBuilder metadataBuilder = new MetadataBuilder();\r
+        metadataBuilder.setMetadata(new BigInteger("3"));\r
+        builder.setMetadata(metadataBuilder.build());\r
+        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
+        EthernetTypeBuilder ethTypeBuilder = new EthernetTypeBuilder();\r
+        ethTypeBuilder.setType(new EtherType(4L));\r
+        ethernetBuilder.setEthernetType(ethTypeBuilder.build());\r
+        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
+        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
+        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
+        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
+        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
+        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
+        builder.setEthernetMatch(ethernetBuilder.build());\r
+        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
+        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
+        vlanIdBuilder.setVlanId(new VlanId(7));\r
+        vlanIdBuilder.setVlanIdPresent(true);\r
+        vlanBuilder.setVlanId(vlanIdBuilder.build());\r
+        vlanBuilder.setVlanPcp(new VlanPcp((short) 7));\r
+        builder.setVlanMatch(vlanBuilder.build());\r
+        IpMatchBuilder ipMatchBuilder = new IpMatchBuilder();\r
+        ipMatchBuilder.setIpDscp(new Dscp((short) 8));\r
+        ipMatchBuilder.setIpEcn((short) 9);\r
+        ipMatchBuilder.setIpProtocol((short) 10);\r
+        builder.setIpMatch(ipMatchBuilder.build());\r
+        TcpMatchBuilder tcpMatchBuilder = new TcpMatchBuilder();\r
+        tcpMatchBuilder.setTcpSourcePort(new PortNumber(11));\r
+        tcpMatchBuilder.setTcpDestinationPort(new PortNumber(12));\r
+        builder.setLayer4Match(tcpMatchBuilder.build());\r
+        Icmpv4MatchBuilder icmpv4Builder = new Icmpv4MatchBuilder();\r
+        icmpv4Builder.setIcmpv4Type((short) 13);\r
+        icmpv4Builder.setIcmpv4Code((short) 14);\r
+        builder.setIcmpv4Match(icmpv4Builder.build());\r
+        Icmpv6MatchBuilder icmpv6Builder = new Icmpv6MatchBuilder();\r
+        icmpv6Builder.setIcmpv6Type((short) 15);\r
+        icmpv6Builder.setIcmpv6Code((short) 16);\r
+        builder.setIcmpv6Match(icmpv6Builder.build());\r
+        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
+        protoBuilder.setMplsLabel(17L);\r
+        protoBuilder.setMplsTc((short) 18);\r
+        protoBuilder.setMplsBos((short) 19);\r
+        PbbBuilder pbbBuilder = new PbbBuilder();\r
+        pbbBuilder.setPbbIsid(20L);\r
+        protoBuilder.setPbb(pbbBuilder.build());\r
+        builder.setProtocolMatchFields(protoBuilder.build());\r
+        TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
+        tunnelBuilder.setTunnelId(new BigInteger("21"));\r
+        builder.setTunnel(tunnelBuilder.build());\r
+        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
+        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1"));\r
+        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2"));\r
+        builder.setLayer3Match(ipv4MatchBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 24, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, InPort.class, false);\r
+        Assert.assertEquals("Wrong in port", 1, entry.getAugmentation(PortNumberMatchEntry.class)\r
+                .getPortNumber().getValue().intValue());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, InPhyPort.class, false);\r
+        Assert.assertEquals("Wrong in phy port", 2, entry.getAugmentation(PortNumberMatchEntry.class)\r
+                .getPortNumber().getValue().intValue());\r
+        entry = entries.get(2);\r
+        checkEntryHeader(entry, Metadata.class, false);\r
+        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
+                entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+        entry = entries.get(3);\r
+        checkEntryHeader(entry, EthDst.class, false);\r
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress());\r
+        entry = entries.get(4);\r
+        checkEntryHeader(entry, EthSrc.class, false);\r
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress());\r
+        entry = entries.get(5);\r
+        checkEntryHeader(entry, EthType.class, false);\r
+        Assert.assertEquals("Wrong eth type", 4, entry.getAugmentation(EthTypeMatchEntry.class)\r
+                .getEthType().getValue().intValue());\r
+        entry = entries.get(6);\r
+        checkEntryHeader(entry, VlanVid.class, false);\r
+        Assert.assertEquals("Wrong vlan id", 7, entry.getAugmentation(VlanVidMatchEntry.class)\r
+                .getVlanVid().intValue());\r
+        Assert.assertEquals("Wrong cfi bit", true, entry.getAugmentation(VlanVidMatchEntry.class)\r
+                .isCfiBit());\r
+        entry = entries.get(7);\r
+        checkEntryHeader(entry, org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp.class, false);\r
+        Assert.assertEquals("Wrong vlan pcp", 7, entry.getAugmentation(VlanPcpMatchEntry.class)\r
+                .getVlanPcp().intValue());\r
+        entry = entries.get(8);\r
+        checkEntryHeader(entry, IpDscp.class, false);\r
+        Assert.assertEquals("Wrong ip dscp", 8, entry.getAugmentation(DscpMatchEntry.class)\r
+                .getDscp().getValue().intValue());\r
+        entry = entries.get(9);\r
+        checkEntryHeader(entry, IpEcn.class, false);\r
+        Assert.assertEquals("Wrong ip ecn", 9, entry.getAugmentation(EcnMatchEntry.class)\r
+                .getEcn().intValue());\r
+        entry = entries.get(10);\r
+        checkEntryHeader(entry, IpProto.class, false);\r
+        Assert.assertEquals("Wrong ip proto", 10, entry.getAugmentation(ProtocolNumberMatchEntry.class)\r
+                .getProtocolNumber().intValue());\r
+        entry = entries.get(11);\r
+        checkEntryHeader(entry, TcpSrc.class, false);\r
+        Assert.assertEquals("Wrong tcp src", 11, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+        entry = entries.get(12);\r
+        checkEntryHeader(entry, TcpDst.class, false);\r
+        Assert.assertEquals("Wrong tcp dst", 12, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+        entry = entries.get(13);\r
+        checkEntryHeader(entry, Icmpv4Type.class, false);\r
+        Assert.assertEquals("Wrong icmpv4 type", 13, entry.getAugmentation(Icmpv4TypeMatchEntry.class)\r
+                .getIcmpv4Type().intValue());\r
+        entry = entries.get(14);\r
+        checkEntryHeader(entry, Icmpv4Code.class, false);\r
+        Assert.assertEquals("Wrong icmpv4 code", 14, entry.getAugmentation(Icmpv4CodeMatchEntry.class)\r
+                .getIcmpv4Code().intValue());\r
+        entry = entries.get(15);\r
+        checkEntryHeader(entry, Icmpv6Type.class, false);\r
+        Assert.assertEquals("Wrong icmpv6 type", 15, entry.getAugmentation(Icmpv6TypeMatchEntry.class)\r
+                .getIcmpv6Type().intValue());\r
+        entry = entries.get(16);\r
+        checkEntryHeader(entry, Icmpv6Code.class, false);\r
+        Assert.assertEquals("Wrong icmpv6 code", 16, entry.getAugmentation(Icmpv6CodeMatchEntry.class)\r
+                .getIcmpv6Code().intValue());\r
+        entry = entries.get(17);\r
+        checkEntryHeader(entry, Ipv4Src.class, false);\r
+        Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        entry = entries.get(18);\r
+        checkEntryHeader(entry, Ipv4Dst.class, false);\r
+        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        entry = entries.get(19);\r
+        checkEntryHeader(entry, MplsLabel.class, false);\r
+        Assert.assertEquals("Wrong mpls label", 17, entry.getAugmentation(MplsLabelMatchEntry.class)\r
+                .getMplsLabel().intValue());\r
+        entry = entries.get(20);\r
+        checkEntryHeader(entry, MplsBos.class, false);\r
+        Assert.assertEquals("Wrong mpls bos", true, entry.getAugmentation(BosMatchEntry.class).isBos());\r
+        entry = entries.get(21);\r
+        checkEntryHeader(entry, MplsTc.class, false);\r
+        Assert.assertEquals("Wrong mpls tc", 18, entry.getAugmentation(TcMatchEntry.class)\r
+                .getTc().intValue());\r
+        entry = entries.get(22);\r
+        checkEntryHeader(entry, PbbIsid.class, false);\r
+        Assert.assertEquals("Wrong pbb isid", 20, entry.getAugmentation(IsidMatchEntry.class)\r
+                .getIsid().intValue());\r
+        entry = entries.get(23);\r
+        checkEntryHeader(entry, TunnelId.class, false);\r
+        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
+                entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+    }\r
+\r
+    private static void checkEntryHeader(MatchEntries entry, Class<? extends MatchField> field, boolean hasMask) {\r
+        Assert.assertEquals("Wrong oxm class", OpenflowBasicClass.class, entry.getOxmClass());\r
+        Assert.assertEquals("Wrong oxm field", field, entry.getOxmMatchField());\r
+        Assert.assertEquals("Wrong hasMask", hasMask, entry.isHasMask());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testUdpMatchConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        UdpMatchBuilder udpMatchBuilder = new UdpMatchBuilder();\r
+        udpMatchBuilder.setUdpSourcePort(new PortNumber(11));\r
+        udpMatchBuilder.setUdpDestinationPort(new PortNumber(12));\r
+        builder.setLayer4Match(udpMatchBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, UdpSrc.class, false);\r
+        Assert.assertEquals("Wrong udp src", 11, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, UdpDst.class, false);\r
+        Assert.assertEquals("Wrong udp dst", 12, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testSctpMatchConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        SctpMatchBuilder sctpMatchBuilder = new SctpMatchBuilder();\r
+        sctpMatchBuilder.setSctpSourcePort(new PortNumber(11));\r
+        sctpMatchBuilder.setSctpDestinationPort(new PortNumber(12));\r
+        builder.setLayer4Match(sctpMatchBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, SctpSrc.class, false);\r
+        Assert.assertEquals("Wrong sctp src", 11, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, SctpDst.class, false);\r
+        Assert.assertEquals("Wrong sctp dst", 12, entry.getAugmentation(PortMatchEntry.class)\r
+                .getPort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testArpMatchConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
+        arpBuilder.setArpOp(5);\r
+        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3"));\r
+        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4"));\r
+        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
+        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
+        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
+        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
+        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
+        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
+        builder.setLayer3Match(arpBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 5, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, ArpOp.class, false);\r
+        Assert.assertEquals("Wrong arp op", 5, entry.getAugmentation(OpCodeMatchEntry.class)\r
+                .getOpCode().intValue());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, ArpSpa.class, false);\r
+        Assert.assertEquals("Wrong arp spa", "10.0.0.3", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        entry = entries.get(2);\r
+        checkEntryHeader(entry, ArpTpa.class, false);\r
+        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        entry = entries.get(3);\r
+        checkEntryHeader(entry, ArpSha.class, false);\r
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", entry.getAugmentation(MacAddressMatchEntry.class)\r
+                .getMacAddress().getValue());\r
+        entry = entries.get(4);\r
+        checkEntryHeader(entry, ArpTha.class, false);\r
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", entry.getAugmentation(MacAddressMatchEntry.class)\r
+                .getMacAddress().getValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testArpMatchConversionWithMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        ArpMatchBuilder arpBuilder = new ArpMatchBuilder();\r
+        arpBuilder.setArpSourceTransportAddress(new Ipv4Prefix("10.0.0.3/8"));\r
+        arpBuilder.setArpTargetTransportAddress(new Ipv4Prefix("10.0.0.4/32"));\r
+        ArpSourceHardwareAddressBuilder srcHwBuilder = new ArpSourceHardwareAddressBuilder();\r
+        srcHwBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
+        srcHwBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
+        arpBuilder.setArpSourceHardwareAddress(srcHwBuilder.build());\r
+        ArpTargetHardwareAddressBuilder dstHwBuilder = new ArpTargetHardwareAddressBuilder();\r
+        dstHwBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
+        dstHwBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
+        arpBuilder.setArpTargetHardwareAddress(dstHwBuilder.build());\r
+        builder.setLayer3Match(arpBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 4, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        entry = entries.get(0);\r
+        checkEntryHeader(entry, ArpSpa.class, true);\r
+        Assert.assertEquals("Wrong arp spa", "10.0.0.3", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        Assert.assertArrayEquals("Wrong arp spa mask", new byte[]{(byte) 255, 0, 0, 0},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, ArpTpa.class, true);\r
+        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        Assert.assertArrayEquals("Wrong arp tpa mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(2);\r
+        checkEntryHeader(entry, ArpSha.class, true);\r
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:05", entry.getAugmentation(MacAddressMatchEntry.class)\r
+                .getMacAddress().getValue());\r
+        Assert.assertArrayEquals("Wrong arp sha mask", new byte[]{0, 0, 0, 0, 0, 8},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(3);\r
+        checkEntryHeader(entry, ArpTha.class, true);\r
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:06", entry.getAugmentation(MacAddressMatchEntry.class)\r
+                .getMacAddress().getValue());\r
+        Assert.assertArrayEquals("Wrong arp tha mask", new byte[]{0, 0, 0, 0, 0, 9},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testIpv6MatchConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
+        ipv6Builder.setIpv6Source(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0001"));\r
+        ipv6Builder.setIpv6Destination(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0002"));\r
+        Ipv6LabelBuilder ipv6LabelBuilder = new Ipv6LabelBuilder();\r
+        ipv6LabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(3L));\r
+        ipv6Builder.setIpv6Label(ipv6LabelBuilder.build());\r
+        ipv6Builder.setIpv6NdTarget(new Ipv6Address("0000:0000:0000:0000:0000:0000:0000:0004"));\r
+        ipv6Builder.setIpv6NdSll(new MacAddress("00:00:00:00:00:05"));\r
+        ipv6Builder.setIpv6NdTll(new MacAddress("00:00:00:00:00:06"));\r
+        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
+        extHdrBuilder.setIpv6Exthdr(153);\r
+        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
+        builder.setLayer3Match(ipv6Builder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 7, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, Ipv6Src.class, false);\r
+        Assert.assertEquals("Wrong ipv6 src", "0000:0000:0000:0000:0000:0000:0000:0001",\r
+                entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, Ipv6Dst.class, false);\r
+        Assert.assertEquals("Wrong ipv6 dst", "0000:0000:0000:0000:0000:0000:0000:0002",\r
+                entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
+        entry = entries.get(2);\r
+        checkEntryHeader(entry, Ipv6Flabel.class, false);\r
+        Assert.assertEquals("Wrong ipv6 flabel", 3,\r
+                entry.getAugmentation(Ipv6FlabelMatchEntry.class).getIpv6Flabel().getValue().intValue());\r
+        entry = entries.get(3);\r
+        checkEntryHeader(entry, Ipv6NdTarget.class, false);\r
+        Assert.assertEquals("Wrong ipv6 nd target", "0000:0000:0000:0000:0000:0000:0000:0004",\r
+                entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
+        entry = entries.get(4);\r
+        checkEntryHeader(entry, Ipv6NdSll.class, false);\r
+        Assert.assertEquals("Wrong ipv6 nd sll", "00:00:00:00:00:05",\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue());\r
+        entry = entries.get(5);\r
+        checkEntryHeader(entry, Ipv6NdTll.class, false);\r
+        Assert.assertEquals("Wrong ipv6 nd tll", "00:00:00:00:00:06",\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress().getValue());\r
+        entry = entries.get(6);\r
+        checkEntryHeader(entry, Ipv6Exthdr.class, false);\r
+        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(false, true, false, true, false,\r
+                true, false, true, false), entry.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testIpv6MatchConversionWithMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
+        ipv6Builder.setIpv6Source(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0001/24"));\r
+        ipv6Builder.setIpv6Destination(new Ipv6Prefix("0000:0000:0000:0000:0000:0000:0000:0002/64"));\r
+        builder.setLayer3Match(ipv6Builder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 2, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, Ipv6Src.class, true);\r
+        Assert.assertEquals("Wrong ipv6 src", "0000:0000:0000:0000:0000:0000:0000:0001",\r
+                entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
+        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0,\r
+                0, 0, 0, 0, 0, 0, 0, 0, 0}, entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, Ipv6Dst.class, true);\r
+        Assert.assertEquals("Wrong ipv6 dst", "0000:0000:0000:0000:0000:0000:0000:0002",\r
+                entry.getAugmentation(Ipv6AddressMatchEntry.class).getIpv6Address().getValue());\r
+        Assert.assertArrayEquals("Wrong ipv6 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, (byte) 255,\r
+                (byte) 255, (byte) 255, (byte) 255, (byte) 255, 0, 0, 0, 0, 0, 0, 0, 0},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testIpv6ExtHeaderConversion() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        Ipv6MatchBuilder ipv6Builder = new Ipv6MatchBuilder();\r
+        Ipv6ExtHeaderBuilder extHdrBuilder = new Ipv6ExtHeaderBuilder();\r
+        extHdrBuilder.setIpv6Exthdr(358);\r
+        extHdrBuilder.setIpv6ExthdrMask(258);\r
+        ipv6Builder.setIpv6ExtHeader(extHdrBuilder.build());\r
+        builder.setLayer3Match(ipv6Builder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 1, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, Ipv6Exthdr.class, true);\r
+        Assert.assertEquals("Wrong ipv6 ext hdr", new Ipv6ExthdrFlags(true, false, true, false, true, false,\r
+                true, false, true), entry.getAugmentation(PseudoFieldMatchEntry.class).getPseudoField());\r
+        Assert.assertArrayEquals("Wrong ipv6 ext hdr mask", new byte[]{1, 2}, entry.getAugmentation(MaskMatchEntry.class)\r
+                .getMask());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#convert(Match, BigInteger)\r
+     */\r
+    @Test\r
+    public void testConversionWithMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        MetadataBuilder metadataBuilder = new MetadataBuilder();\r
+        metadataBuilder.setMetadata(new BigInteger("3"));\r
+        metadataBuilder.setMetadataMask(new BigInteger("15"));\r
+        builder.setMetadata(metadataBuilder.build());\r
+        EthernetMatchBuilder ethernetBuilder = new EthernetMatchBuilder();\r
+        EthernetSourceBuilder ethSrcBuilder = new EthernetSourceBuilder();\r
+        ethSrcBuilder.setAddress(new MacAddress("00:00:00:00:00:05"));\r
+        ethSrcBuilder.setMask(new MacAddress("00:00:00:00:00:08"));\r
+        ethernetBuilder.setEthernetSource(ethSrcBuilder.build());\r
+        EthernetDestinationBuilder ethDstBuilder = new EthernetDestinationBuilder();\r
+        ethDstBuilder.setAddress(new MacAddress("00:00:00:00:00:06"));\r
+        ethDstBuilder.setMask(new MacAddress("00:00:00:00:00:09"));\r
+        ethernetBuilder.setEthernetDestination(ethDstBuilder.build());\r
+        builder.setEthernetMatch(ethernetBuilder.build());\r
+        VlanMatchBuilder vlanBuilder = new VlanMatchBuilder();\r
+        VlanIdBuilder vlanIdBuilder = new VlanIdBuilder();\r
+        vlanIdBuilder.setVlanId(new VlanId(0));\r
+        vlanIdBuilder.setVlanIdPresent(true);\r
+        vlanBuilder.setVlanId(vlanIdBuilder.build());\r
+        builder.setVlanMatch(vlanBuilder.build());\r
+        ProtocolMatchFieldsBuilder protoBuilder = new ProtocolMatchFieldsBuilder();\r
+        PbbBuilder pbbBuilder = new PbbBuilder();\r
+        pbbBuilder.setPbbIsid(20L);\r
+        pbbBuilder.setPbbMask(8L);\r
+        protoBuilder.setPbb(pbbBuilder.build());\r
+        builder.setProtocolMatchFields(protoBuilder.build());\r
+        TunnelBuilder tunnelBuilder = new TunnelBuilder();\r
+        tunnelBuilder.setTunnelId(new BigInteger("21"));\r
+        tunnelBuilder.setTunnelMask(new BigInteger("14"));\r
+        builder.setTunnel(tunnelBuilder.build());\r
+        Ipv4MatchBuilder ipv4MatchBuilder = new Ipv4MatchBuilder();\r
+        ipv4MatchBuilder.setIpv4Source(new Ipv4Prefix("10.0.0.1/24"));\r
+        ipv4MatchBuilder.setIpv4Destination(new Ipv4Prefix("10.0.0.2/8"));\r
+        builder.setLayer3Match(ipv4MatchBuilder.build());\r
+        Match match = builder.build();\r
+\r
+        List<MatchEntries> entries = convertor.convert(match, new BigInteger("42"));\r
+        Assert.assertEquals("Wrong entries size", 8, entries.size());\r
+        MatchEntries entry = entries.get(0);\r
+        checkEntryHeader(entry, Metadata.class, true);\r
+        Assert.assertArrayEquals("Wrong metadata", new byte[]{0, 0, 0, 0, 0, 0, 0, 3},\r
+                entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+        Assert.assertArrayEquals("Wrong metadata mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 15},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(1);\r
+        checkEntryHeader(entry, EthDst.class, true);\r
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:06"),\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress());\r
+        Assert.assertArrayEquals("Wrong eth dst mask", new byte[]{0, 0, 0, 0, 0, 9},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(2);\r
+        checkEntryHeader(entry, EthSrc.class, true);\r
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:05"),\r
+                entry.getAugmentation(MacAddressMatchEntry.class).getMacAddress());\r
+        Assert.assertArrayEquals("Wrong eth src mask", new byte[]{0, 0, 0, 0, 0, 8},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(3);\r
+        checkEntryHeader(entry, VlanVid.class, true);\r
+        Assert.assertEquals("Wrong vlan id", 0, entry.getAugmentation(VlanVidMatchEntry.class)\r
+                .getVlanVid().intValue());\r
+        Assert.assertEquals("Wrong cfi bit", true, entry.getAugmentation(VlanVidMatchEntry.class)\r
+                .isCfiBit());\r
+        Assert.assertArrayEquals("Wrong vlanId mask", new byte[]{16, 0},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(4);\r
+        checkEntryHeader(entry, Ipv4Src.class, true);\r
+        Assert.assertEquals("Wrong ipv4 src", "10.0.0.1", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        Assert.assertArrayEquals("Wrong ipv4 src mask", new byte[]{(byte) 255, (byte) 255, (byte) 255, 0},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(5);\r
+        checkEntryHeader(entry, Ipv4Dst.class, true);\r
+        Assert.assertEquals("Wrong ipv4 dst", "10.0.0.2", entry.getAugmentation(Ipv4AddressMatchEntry.class)\r
+                .getIpv4Address().getValue());\r
+        Assert.assertArrayEquals("Wrong ipv4 dst mask", new byte[]{(byte) 255, 0, 0, 0},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(6);\r
+        checkEntryHeader(entry, PbbIsid.class, true);\r
+        Assert.assertEquals("Wrong pbb isid", 20, entry.getAugmentation(IsidMatchEntry.class)\r
+                .getIsid().intValue());\r
+        // FIXME - fix mask computation (length should be 3 instead of 4)\r
+//        Assert.assertArrayEquals("Wrong pbb isid mask", new byte[]{0, 0, 8},\r
+//                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+        entry = entries.get(7);\r
+        checkEntryHeader(entry, TunnelId.class, true);\r
+        Assert.assertArrayEquals("Wrong tunnel id", new byte[]{0, 0, 0, 0, 0, 0, 0, 21},\r
+                entry.getAugmentation(MetadataMatchEntry.class).getMetadata());\r
+        Assert.assertArrayEquals("Wrong tunnel id mask", new byte[]{0, 0, 0, 0, 0, 0, 0, 14},\r
+                entry.getAugmentation(MaskMatchEntry.class).getMask());\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV10Test.java
new file mode 100644 (file)
index 0000000..71e8d53
--- /dev/null
@@ -0,0 +1,176 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
+\r
+import java.math.BigInteger;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowWildcardsV10;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10Builder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MatchConvertorImplV10Test {\r
+\r
+    /**\r
+     * Initializes OpenflowPortsUtil\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        OpenflowPortsUtil.init();\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void test() {\r
+        MatchV10Builder builder = new MatchV10Builder();\r
+        builder.setWildcards(new FlowWildcardsV10(false, false, false, false,\r
+                false, false, false, false, false, false));\r
+        builder.setNwSrcMask((short) 24);\r
+        builder.setNwDstMask((short) 16);\r
+        builder.setInPort(6653);\r
+        builder.setDlSrc(new MacAddress("01:01:01:01:01:01"));\r
+        builder.setDlDst(new MacAddress("02:02:02:02:02:02"));\r
+        builder.setDlVlan(128);\r
+        builder.setDlVlanPcp((short) 2);\r
+        builder.setDlType(15);\r
+        builder.setNwTos((short) 16);\r
+        builder.setNwProto((short) 6);\r
+        builder.setNwSrc(new Ipv4Address("1.1.1.2"));\r
+        builder.setNwDst(new Ipv4Address("32.16.8.1"));\r
+        builder.setTpSrc(2048);\r
+        builder.setTpDst(4096);\r
+        MatchV10 match = builder.build();\r
+\r
+        Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+\r
+        Assert.assertEquals("Wrong in port", "openflow:42:6653", salMatch.getInPort().getValue());\r
+        Assert.assertEquals("Wrong dl src", new MacAddress("01:01:01:01:01:01"), salMatch.getEthernetMatch()\r
+                .getEthernetSource().getAddress());\r
+        Assert.assertEquals("Wrong dl dst", new MacAddress("02:02:02:02:02:02"), salMatch.getEthernetMatch()\r
+                .getEthernetDestination().getAddress());\r
+        Assert.assertEquals("Wrong dl type", 15, salMatch.getEthernetMatch().getEthernetType().getType().getValue().intValue());\r
+        Assert.assertEquals("Wrong dl vlan", 128, salMatch.getVlanMatch().getVlanId().getVlanId().getValue().intValue());\r
+        Assert.assertEquals("Wrong dl vlan pcp", 2, salMatch.getVlanMatch().getVlanPcp().getValue().intValue());\r
+        Ipv4Match ipv4Match = (Ipv4Match) salMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong nw src address", "1.1.1.2/24", ipv4Match.getIpv4Source().getValue());\r
+        Assert.assertEquals("Wrong nw dst address", "32.16.8.1/16", ipv4Match.getIpv4Destination().getValue());\r
+        Assert.assertEquals("Wrong ip protocol", 6, salMatch.getIpMatch().getIpProtocol().intValue());\r
+        Assert.assertEquals("Wrong ip proto", null, salMatch.getIpMatch().getIpProto());\r
+        Assert.assertEquals("Wrong ip ecn", null, salMatch.getIpMatch().getIpEcn());\r
+        Assert.assertEquals("Wrong ip dscp", 4, salMatch.getIpMatch().getIpDscp().getValue().intValue());\r
+        TcpMatch tcpMatch = (TcpMatch) salMatch.getLayer4Match();\r
+        Assert.assertEquals("Wrong tp dst", 4096, tcpMatch.getTcpDestinationPort().getValue().intValue());\r
+        Assert.assertEquals("Wrong tp src", 2048, tcpMatch.getTcpSourcePort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWildcardedMatch() {\r
+        MatchV10Builder builder = new MatchV10Builder();\r
+        builder.setWildcards(new FlowWildcardsV10(true, true, true, true,\r
+                true, true, true, true, true, true));\r
+        builder.setNwSrcMask((short) 24);\r
+        builder.setNwDstMask((short) 16);\r
+        builder.setInPort(6653);\r
+        builder.setDlSrc(new MacAddress("01:01:01:01:01:01"));\r
+        builder.setDlDst(new MacAddress("02:02:02:02:02:02"));\r
+        builder.setDlVlan(128);\r
+        builder.setDlVlanPcp((short) 2);\r
+        builder.setDlType(15);\r
+        builder.setNwTos((short) 14);\r
+        builder.setNwProto((short) 6);\r
+        builder.setNwSrc(new Ipv4Address("1.1.1.2"));\r
+        builder.setNwDst(new Ipv4Address("32.16.8.1"));\r
+        builder.setTpSrc(2048);\r
+        builder.setTpDst(4096);\r
+        MatchV10 match = builder.build();\r
+\r
+        Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+\r
+        Assert.assertEquals("Wrong in port", null, salMatch.getInPort());\r
+        Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch());\r
+        Assert.assertEquals("Wrong dl vlan match", null, salMatch.getVlanMatch());\r
+        Assert.assertEquals("Wrong layer 3 match", null, salMatch.getLayer3Match());\r
+        Assert.assertEquals("Wrong layer 4 match", null, salMatch.getLayer4Match());\r
+        Assert.assertEquals("Wrong ip match", null, salMatch.getIpMatch());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWildcardedMatchWithNoValuesSet() {\r
+        MatchV10Builder builder = new MatchV10Builder();\r
+        builder.setWildcards(new FlowWildcardsV10(true, true, true, true,\r
+                true, true, true, true, true, true));\r
+        MatchV10 match = builder.build();\r
+\r
+        Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+\r
+        Assert.assertEquals("Wrong in port", null, salMatch.getInPort());\r
+        Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch());\r
+        Assert.assertEquals("Wrong dl vlan match", null, salMatch.getVlanMatch());\r
+        Assert.assertEquals("Wrong layer 3 match", null, salMatch.getLayer3Match());\r
+        Assert.assertEquals("Wrong layer 4 match", null, salMatch.getLayer4Match());\r
+        Assert.assertEquals("Wrong ip match", null, salMatch.getIpMatch());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testMatchWithValuesUnset() {\r
+        MatchV10Builder builder = new MatchV10Builder();\r
+        builder.setWildcards(new FlowWildcardsV10(false, false, false, false,\r
+                false, false, false, false, false, false));\r
+        builder.setNwProto((short) 17);\r
+        builder.setTpSrc(2048);\r
+        builder.setTpDst(4096);\r
+        MatchV10 match = builder.build();\r
+\r
+        Match salMatch = MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+\r
+        Assert.assertEquals("Wrong in port", null, salMatch.getInPort());\r
+        Assert.assertEquals("Wrong dl match", null, salMatch.getEthernetMatch());\r
+        Assert.assertEquals("Wrong dl vlan match", null, salMatch.getVlanMatch());\r
+        Assert.assertEquals("Wrong layer 3 match", null, salMatch.getLayer3Match());\r
+        UdpMatch udpMatch = (UdpMatch) salMatch.getLayer4Match();\r
+        Assert.assertEquals("Wrong udp dst", 4096, udpMatch.getUdpDestinationPort().getValue().intValue());\r
+        Assert.assertEquals("Wrong udp src", 2048, udpMatch.getUdpSourcePort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchV10ToSALMatch(MatchV10, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test(expected=NullPointerException.class)\r
+    public void testEmptyMatch() {\r
+        MatchV10Builder builder = new MatchV10Builder();\r
+        MatchV10 match = builder.build();\r
+\r
+        MatchConvertorImpl.fromOFMatchV10ToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+    }\r
+}
\ No newline at end of file
diff --git a/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java b/openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/match/MatchConvertorImplV13Test.java
new file mode 100644 (file)
index 0000000..46814fd
--- /dev/null
@@ -0,0 +1,864 @@
+/*\r
+ * Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.\r
+ *\r
+ * This program and the accompanying materials are made available under the\r
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
+ * and is available at http://www.eclipse.org/legal/epl-v10.html\r
+ */\r
+\r
+package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.junit.Assert;\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
+import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Dscp;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6FlowLabel;\r
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.SctpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.TcpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._4.match.UdpMatch;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.BosMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DscpMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EcnMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.EthTypeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4CodeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv4TypeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6CodeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Icmpv6TypeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv4AddressMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6AddressMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.Ipv6FlabelMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IsidMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MacAddressMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaskMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MetadataMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MplsLabelMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.OpCodeMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PortNumberMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ProtocolNumberMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.PseudoFieldMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.TcMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanPcpMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntry;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidMatchEntryBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.EtherType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.Ipv6ExthdrFlags;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortNumber;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpOp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpSpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTha;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.ArpTpa;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.EthType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv4Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Code;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Icmpv6Type;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPhyPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.InPort;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpDscp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpEcn;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.IpProto;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv4Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Dst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Exthdr;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Flabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdSll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTarget;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6NdTll;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Ipv6Src;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.Metadata;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsBos;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsLabel;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.MplsTc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OpenflowBasicClass;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.OxmMatchType;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.PbbIsid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.SctpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TcpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.TunnelId;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpDst;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.UdpSrc;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanPcp;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.VlanVid;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.MatchBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntries;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.oxm.fields.grouping.MatchEntriesBuilder;\r
+\r
+/**\r
+ * @author michal.polkorab\r
+ *\r
+ */\r
+public class MatchConvertorImplV13Test {\r
+\r
+    /**\r
+     * Initializes OpenflowPortsUtil\r
+     */\r
+    @Before\r
+    public void startUp() {\r
+        OpenflowPortsUtil.init();\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test(expected=NullPointerException.class)\r
+    public void testEmptyMatch() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        Match match = builder.build();\r
+\r
+        MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testEmptyMatchEntries() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        builder.setMatchEntries(entries);\r
+        Match match = builder.build();\r
+\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getEthernetMatch());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getIcmpv4Match());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getIcmpv6Match());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getInPhyPort());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getInPort());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getIpMatch());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getLayer3Match());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getLayer4Match());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getMetadata());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getProtocolMatchFields());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getVlanMatch());\r
+        Assert.assertEquals("Wrong match entries", null, builtMatch.getTunnel());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntriesNoMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(InPort.class);\r
+        entriesBuilder.setHasMask(false);\r
+        PortNumberMatchEntryBuilder portNumberBuilder = new PortNumberMatchEntryBuilder();\r
+        portNumberBuilder.setPortNumber(new PortNumber(1L));\r
+        entriesBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(InPhyPort.class);\r
+        entriesBuilder.setHasMask(false);\r
+        portNumberBuilder = new PortNumberMatchEntryBuilder();\r
+        portNumberBuilder.setPortNumber(new PortNumber(2L));\r
+        entriesBuilder.addAugmentation(PortNumberMatchEntry.class, portNumberBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Metadata.class);\r
+        entriesBuilder.setHasMask(false);\r
+        MetadataMatchEntryBuilder metadataBuilder = new MetadataMatchEntryBuilder();\r
+        metadataBuilder.setMetadata(new byte[]{0, 1, 2, 3, 4, 5, 6, 7});\r
+        entriesBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        MacAddressMatchEntryBuilder macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:01"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:02"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthType.class);\r
+        entriesBuilder.setHasMask(false);\r
+        EthTypeMatchEntryBuilder ethTypeBuilder = new EthTypeMatchEntryBuilder();\r
+        ethTypeBuilder.setEthType(new EtherType(3));\r
+        entriesBuilder.addAugmentation(EthTypeMatchEntry.class, ethTypeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(VlanVid.class);\r
+        entriesBuilder.setHasMask(false);\r
+        VlanVidMatchEntryBuilder vlanVidBuilder = new VlanVidMatchEntryBuilder();\r
+        vlanVidBuilder.setVlanVid(4);\r
+        vlanVidBuilder.setCfiBit(true);\r
+        entriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanVidBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(VlanPcp.class);\r
+        entriesBuilder.setHasMask(false);\r
+        VlanPcpMatchEntryBuilder pcpBuilder = new VlanPcpMatchEntryBuilder();\r
+        pcpBuilder.setVlanPcp((short) 5);\r
+        entriesBuilder.addAugmentation(VlanPcpMatchEntry.class, pcpBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(IpDscp.class);\r
+        entriesBuilder.setHasMask(false);\r
+        DscpMatchEntryBuilder dscpBuilder = new DscpMatchEntryBuilder();\r
+        dscpBuilder.setDscp(new Dscp((short) 6));\r
+        entriesBuilder.addAugmentation(DscpMatchEntry.class, dscpBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(IpEcn.class);\r
+        entriesBuilder.setHasMask(false);\r
+        EcnMatchEntryBuilder ecnBuilder = new EcnMatchEntryBuilder();\r
+        ecnBuilder.setEcn((short) 7);\r
+        entriesBuilder.addAugmentation(EcnMatchEntry.class, ecnBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(IpProto.class);\r
+        entriesBuilder.setHasMask(false);\r
+        ProtocolNumberMatchEntryBuilder protoBuilder =  new ProtocolNumberMatchEntryBuilder();\r
+        protoBuilder.setProtocolNumber((short) 8);\r
+        entriesBuilder.addAugmentation(ProtocolNumberMatchEntry.class, protoBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.1"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.2"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(TcpSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(9));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(TcpDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(10));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Icmpv4Type.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Icmpv4TypeMatchEntryBuilder icmpv4TypeBuilder = new Icmpv4TypeMatchEntryBuilder();\r
+        icmpv4TypeBuilder.setIcmpv4Type((short) 15);\r
+        entriesBuilder.addAugmentation(Icmpv4TypeMatchEntry.class, icmpv4TypeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Icmpv4Code.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Icmpv4CodeMatchEntryBuilder icmpv4CodeBuilder = new Icmpv4CodeMatchEntryBuilder();\r
+        icmpv4CodeBuilder.setIcmpv4Code((short) 16);\r
+        entriesBuilder.addAugmentation(Icmpv4CodeMatchEntry.class, icmpv4CodeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Icmpv6Type.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Icmpv6TypeMatchEntryBuilder icmpv6TypeBuilder = new Icmpv6TypeMatchEntryBuilder();\r
+        icmpv6TypeBuilder.setIcmpv6Type((short) 19);\r
+        entriesBuilder.addAugmentation(Icmpv6TypeMatchEntry.class, icmpv6TypeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Icmpv6Code.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Icmpv6CodeMatchEntryBuilder icmpv6CodeBuilder = new Icmpv6CodeMatchEntryBuilder();\r
+        icmpv6CodeBuilder.setIcmpv6Code((short) 20);\r
+        entriesBuilder.addAugmentation(Icmpv6CodeMatchEntry.class, icmpv6CodeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(MplsLabel.class);\r
+        entriesBuilder.setHasMask(false);\r
+        MplsLabelMatchEntryBuilder mplsLabelBuilder = new MplsLabelMatchEntryBuilder();\r
+        mplsLabelBuilder.setMplsLabel(21L);\r
+        entriesBuilder.addAugmentation(MplsLabelMatchEntry.class, mplsLabelBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(MplsTc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        TcMatchEntryBuilder tcBuilder = new TcMatchEntryBuilder();\r
+        tcBuilder.setTc((short) 22);\r
+        entriesBuilder.addAugmentation(TcMatchEntry.class, tcBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(MplsBos.class);\r
+        entriesBuilder.setHasMask(false);\r
+        BosMatchEntryBuilder bosBuilder = new BosMatchEntryBuilder();\r
+        bosBuilder.setBos(true);\r
+        entriesBuilder.addAugmentation(BosMatchEntry.class, bosBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(PbbIsid.class);\r
+        entriesBuilder.setHasMask(false);\r
+        IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();\r
+        isidBuilder.setIsid(23L);\r
+        entriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(TunnelId.class);\r
+        entriesBuilder.setHasMask(false);\r
+        metadataBuilder = new MetadataMatchEntryBuilder();\r
+        metadataBuilder.setMetadata(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});\r
+        entriesBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        Match match = builder.build();\r
+\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        Assert.assertEquals("Wrong in port", "openflow:42:1", builtMatch.getInPort().getValue());\r
+        Assert.assertEquals("Wrong in phy port", "openflow:42:2", builtMatch.getInPhyPort().getValue());\r
+        Assert.assertEquals("Wrong metadata", new BigInteger(1, new byte[]{0, 1, 2, 3, 4, 5, 6, 7}), builtMatch.getMetadata().getMetadata());\r
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:01"), builtMatch.getEthernetMatch().getEthernetDestination().getAddress());\r
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:02"), builtMatch.getEthernetMatch().getEthernetSource().getAddress());\r
+        Assert.assertEquals("Wrong eth type", 3, builtMatch.getEthernetMatch().getEthernetType().getType().getValue().intValue());\r
+        Assert.assertEquals("Wrong vlan id", 4, builtMatch.getVlanMatch().getVlanId().getVlanId().getValue().intValue());\r
+        // TODO - finish implementation by setting the vlanIdPresent flag\r
+//        Assert.assertEquals("Wrong vlan id entries", true, builtMatch.getVlanMatch().getVlanId().isVlanIdPresent());\r
+        Assert.assertEquals("Wrong vlan pcp", 5, builtMatch.getVlanMatch().getVlanPcp().getValue().intValue());\r
+        Assert.assertEquals("Wrong ip dscp", 6, builtMatch.getIpMatch().getIpDscp().getValue().intValue());\r
+        Assert.assertEquals("Wrong ip ecn", 7, builtMatch.getIpMatch().getIpEcn().intValue());\r
+        Assert.assertEquals("Wrong ip proto", null, builtMatch.getIpMatch().getIpProto());\r
+        Assert.assertEquals("Wrong ip protocol", 8, builtMatch.getIpMatch().getIpProtocol().intValue());\r
+        TcpMatch tcpMatch = (TcpMatch) builtMatch.getLayer4Match();\r
+        Assert.assertEquals("Wrong tcp src port", 9, tcpMatch.getTcpSourcePort().getValue().intValue());\r
+        Assert.assertEquals("Wrong tcp dst port", 10, tcpMatch.getTcpDestinationPort().getValue().intValue());\r
+        Assert.assertEquals("Wrong icmpv4 type", 15, builtMatch.getIcmpv4Match().getIcmpv4Type().intValue());\r
+        Assert.assertEquals("Wrong icmpv4 code", 16, builtMatch.getIcmpv4Match().getIcmpv4Code().intValue());\r
+        Assert.assertEquals("Wrong icmpv6 type", 19, builtMatch.getIcmpv6Match().getIcmpv6Type().intValue());\r
+        Assert.assertEquals("Wrong icmpv6 code", 20, builtMatch.getIcmpv6Match().getIcmpv6Code().intValue());\r
+        Ipv4Match ipv4Match = (Ipv4Match) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.0.0.1/32", ipv4Match.getIpv4Source().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.0.2/32", ipv4Match.getIpv4Destination().getValue());\r
+        Assert.assertEquals("Wrong mpls label", 21, builtMatch.getProtocolMatchFields().getMplsLabel().intValue());\r
+        Assert.assertEquals("Wrong mpls bos", 1, builtMatch.getProtocolMatchFields().getMplsBos().intValue());\r
+        Assert.assertEquals("Wrong mpls tc", 22, builtMatch.getProtocolMatchFields().getMplsTc().intValue());\r
+        Assert.assertEquals("Wrong pbb isid", 23, builtMatch.getProtocolMatchFields().getPbb().getPbbIsid().intValue());\r
+        Assert.assertEquals("Wrong tunnel id", new BigInteger(1, new byte[]{1, 2, 3, 4, 5, 6, 7, 8}),\r
+                builtMatch.getTunnel().getTunnelId());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testWithMatchEntriesWithMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Metadata.class);\r
+        entriesBuilder.setHasMask(true);\r
+        MetadataMatchEntryBuilder metadataBuilder = new MetadataMatchEntryBuilder();\r
+        metadataBuilder.setMetadata(new byte[]{0, 1, 2, 3, 4, 5, 6, 7});\r
+        entriesBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
+        MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 0, 0, 0, 0, 0, 0, 1});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthDst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        MacAddressMatchEntryBuilder macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:01"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 0, 0, 0, 0, 2});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(EthSrc.class);\r
+        entriesBuilder.setHasMask(true);\r
+        macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:02"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 0, 0, 0, 0, 3});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(VlanVid.class);\r
+        entriesBuilder.setHasMask(true);\r
+        VlanVidMatchEntryBuilder vlanVidBuilder = new VlanVidMatchEntryBuilder();\r
+        vlanVidBuilder.setVlanVid(4);\r
+        vlanVidBuilder.setCfiBit(true);\r
+        entriesBuilder.addAugmentation(VlanVidMatchEntry.class, vlanVidBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 4});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Src.class);\r
+        entriesBuilder.setHasMask(true);\r
+        Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.1"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv4Dst.class);\r
+        entriesBuilder.setHasMask(true);\r
+        ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.2"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 240, 0});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        // FIXME - PbbIsid should check for mask length of 3 instead of 2\r
+//        entriesBuilder = new MatchEntriesBuilder();\r
+//        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+//        entriesBuilder.setOxmMatchField(PbbIsid.class);\r
+//        entriesBuilder.setHasMask(true);\r
+//        IsidMatchEntryBuilder isidBuilder = new IsidMatchEntryBuilder();\r
+//        isidBuilder.setIsid(23L);\r
+//        entriesBuilder.addAugmentation(IsidMatchEntry.class, isidBuilder.build());\r
+//        maskBuilder = new MaskMatchEntryBuilder();\r
+//        maskBuilder.setMask(new byte[]{0, 0, 7});\r
+//        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+//        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(TunnelId.class);\r
+        entriesBuilder.setHasMask(true);\r
+        metadataBuilder = new MetadataMatchEntryBuilder();\r
+        metadataBuilder.setMetadata(new byte[]{1, 2, 3, 4, 5, 6, 7, 8});\r
+        entriesBuilder.addAugmentation(MetadataMatchEntry.class, metadataBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 0, 0, 0, 0, 0, 0, 8});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        Match match = builder.build();\r
+\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatch = MatchConvertorImpl.fromOFMatchToSALMatch(match, new BigInteger("42"), OpenflowVersion.OF10);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatch.build();\r
+\r
+        Assert.assertEquals("Wrong metadata", new BigInteger(1, new byte[]{0, 1, 2, 3, 4, 5, 6, 7}), builtMatch.getMetadata().getMetadata());\r
+        Assert.assertEquals("Wrong metadata mask", new BigInteger(1, new byte[]{0, 0, 0, 0, 0, 0, 0, 1}),\r
+                builtMatch.getMetadata().getMetadataMask());\r
+        Assert.assertEquals("Wrong eth dst", new MacAddress("00:00:00:00:00:01"), builtMatch.getEthernetMatch().getEthernetDestination().getAddress());\r
+//        Assert.assertEquals("Wrong eth dst mask", new MacAddress("00:00:00:00:00:01"), builtMatch.getEthernetMatch().getEthernetDestination().getMask());\r
+        Assert.assertEquals("Wrong eth src", new MacAddress("00:00:00:00:00:02"), builtMatch.getEthernetMatch().getEthernetSource().getAddress());\r
+//        Assert.assertEquals("Wrong eth src mask", new MacAddress("00:00:00:00:00:03"), builtMatch.getEthernetMatch().getEthernetSource().getMask());\r
+        Assert.assertEquals("Wrong vlan id", 4, builtMatch.getVlanMatch().getVlanId().getVlanId().getValue().intValue());\r
+        // TODO - finish implementation by setting the vlanIdPresent flag\r
+//        Assert.assertEquals("Wrong vlan id entries", true, builtMatch.getVlanMatch().getVlanId().isVlanIdPresent());\r
+        Ipv4Match ipv4Match = (Ipv4Match) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv4 src address", "10.0.0.1/24", ipv4Match.getIpv4Source().getValue());\r
+        Assert.assertEquals("Wrong ipv4 dst address", "10.0.0.2/20", ipv4Match.getIpv4Destination().getValue());\r
+//        Assert.assertEquals("Wrong pbb isid", 23, builtMatch.getProtocolMatchFields().getPbb().getPbbIsid().intValue());\r
+        Assert.assertEquals("Wrong tunnel id", new BigInteger(1, new byte[]{1, 2, 3, 4, 5, 6, 7, 8}),\r
+                builtMatch.getTunnel().getTunnelId());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer4MatchUdp() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(UdpSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(11));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(UdpDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(12));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        \r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder builtMatch = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        \r
+        UdpMatch udpMatch = (UdpMatch) builtMatch.getLayer4Match();\r
+        Assert.assertEquals("Wrong udp src port", 11, udpMatch.getUdpSourcePort().getValue().intValue());\r
+        Assert.assertEquals("Wrong udp dst port", 12, udpMatch.getUdpDestinationPort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer4MatchSctp() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(SctpSrc.class);\r
+        entriesBuilder.setHasMask(false);\r
+        PortMatchEntryBuilder portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(13));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(SctpDst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        portBuilder = new PortMatchEntryBuilder();\r
+        portBuilder.setPort(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf\r
+                .inet.types.rev100924.PortNumber(14));\r
+        entriesBuilder.addAugmentation(PortMatchEntry.class, portBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        \r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
+        \r
+        SctpMatch udpMatch = (SctpMatch) builtMatch.getLayer4Match();\r
+        Assert.assertEquals("Wrong sctp src port", 13, udpMatch.getSctpSourcePort().getValue().intValue());\r
+        Assert.assertEquals("Wrong sctp dst port", 14, udpMatch.getSctpDestinationPort().getValue().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer3MatchIpv6() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Src.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Ipv6AddressMatchEntryBuilder ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();\r
+        ipv6AddressBuilder.setIpv6Address(new Ipv6Address("0000:0001:0002:0003:0004:0005:0006:0007"));\r
+        entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Dst.class);\r
+        entriesBuilder.setHasMask(false);\r
+        ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();\r
+        ipv6AddressBuilder.setIpv6Address(new Ipv6Address("0001:0002:0003:0004:0005:0006:0007:0008"));\r
+        entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Flabel.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Ipv6FlabelMatchEntryBuilder ipv6FlabelBuilder = new Ipv6FlabelMatchEntryBuilder();\r
+        ipv6FlabelBuilder.setIpv6Flabel(new Ipv6FlowLabel(18L));\r
+        entriesBuilder.addAugmentation(Ipv6FlabelMatchEntry.class, ipv6FlabelBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6NdTarget.class);\r
+        entriesBuilder.setHasMask(false);\r
+        ipv6AddressBuilder = new Ipv6AddressMatchEntryBuilder();\r
+        ipv6AddressBuilder.setIpv6Address(new Ipv6Address("0002:0003:0004:0005:0006:0007:0008:0009"));\r
+        entriesBuilder.addAugmentation(Ipv6AddressMatchEntry.class, ipv6AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6NdSll.class);\r
+        entriesBuilder.setHasMask(false);\r
+        MacAddressMatchEntryBuilder macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:05"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6NdTll.class);\r
+        entriesBuilder.setHasMask(false);\r
+        macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:06"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
+        entriesBuilder.setHasMask(false);\r
+        PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();\r
+        pseudoBuilder.setPseudoField(new Ipv6ExthdrFlags(true, false, true, false, true, false, true, false, true));\r
+        entriesBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        entries.add(entriesBuilder.build());\r
+\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
+        \r
+        Ipv6Match ipv6Match = (Ipv6Match) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv6 src address", "0000:0001:0002:0003:0004:0005:0006:0007",\r
+                ipv6Match.getIpv6Source().getValue());\r
+        Assert.assertEquals("Wrong ipv6 dst address", "0001:0002:0003:0004:0005:0006:0007:0008",\r
+                ipv6Match.getIpv6Destination().getValue());\r
+        Assert.assertEquals("Wrong ipv6 nd target", "0002:0003:0004:0005:0006:0007:0008:0009",\r
+                ipv6Match.getIpv6NdTarget().getValue());\r
+        Assert.assertEquals("Wrong ipv6 flabel", 18, ipv6Match.getIpv6Label().getIpv6Flabel().getValue().intValue());\r
+        Assert.assertEquals("Wrong ipv6 nd sll", new MacAddress("00:00:00:00:00:05"), ipv6Match.getIpv6NdSll());\r
+        Assert.assertEquals("Wrong ipv6 nd tll", new MacAddress("00:00:00:00:00:06"), ipv6Match.getIpv6NdTll());\r
+        Assert.assertEquals("Wrong ipv6 ext header", 358, ipv6Match.getIpv6ExtHeader().getIpv6Exthdr().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer3MatchIpv6ExtHeader2() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(Ipv6Exthdr.class);\r
+        entriesBuilder.setHasMask(true);\r
+        PseudoFieldMatchEntryBuilder pseudoBuilder = new PseudoFieldMatchEntryBuilder();\r
+        pseudoBuilder.setPseudoField(new Ipv6ExthdrFlags(false, true, false, true, false, true, false, true, false));\r
+        entriesBuilder.addAugmentation(PseudoFieldMatchEntry.class, pseudoBuilder.build());\r
+        MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{1, 2});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
+        \r
+        Ipv6Match ipv6Match = (Ipv6Match) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong ipv6 ext header", 153, ipv6Match.getIpv6ExtHeader().getIpv6Exthdr().intValue());\r
+        Assert.assertEquals("Wrong ipv6 ext header mask", 258, ipv6Match.getIpv6ExtHeader().getIpv6ExthdrMask().intValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer3MatchArp() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpOp.class);\r
+        entriesBuilder.setHasMask(false);\r
+        OpCodeMatchEntryBuilder opCodeBuilder = new OpCodeMatchEntryBuilder();\r
+        opCodeBuilder.setOpCode(17);\r
+        entriesBuilder.addAugmentation(OpCodeMatchEntry.class, opCodeBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpSpa.class);\r
+        entriesBuilder.setHasMask(false);\r
+        Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.3"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpTpa.class);\r
+        entriesBuilder.setHasMask(false);\r
+        ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.4"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpSha.class);\r
+        entriesBuilder.setHasMask(false);\r
+        MacAddressMatchEntryBuilder macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:03"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpTha.class);\r
+        entriesBuilder.setHasMask(false);\r
+        macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:04"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        \r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
+        \r
+        ArpMatch arpMatch = (ArpMatch) builtMatch.getLayer3Match();\r
+        Assert.assertEquals("Wrong arp op", 17, arpMatch.getArpOp().intValue());\r
+        Assert.assertEquals("Wrong arp spa", "10.0.0.3", arpMatch.getArpSourceTransportAddress().getValue());\r
+        Assert.assertEquals("Wrong arp tpa", "10.0.0.4", arpMatch.getArpTargetTransportAddress().getValue());\r
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:03", arpMatch.getArpSourceHardwareAddress().getAddress().getValue());\r
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:04", arpMatch.getArpTargetHardwareAddress().getAddress().getValue());\r
+    }\r
+\r
+    /**\r
+     * Test {@link MatchConvertorImpl#fromOFMatchToSALMatch(Match, BigInteger, OpenflowVersion)}\r
+     */\r
+    @Test\r
+    public void testLayer3MatchArpWithMasks() {\r
+        MatchBuilder builder = new MatchBuilder();\r
+        builder.setType(OxmMatchType.class);\r
+        List<MatchEntries> entries = new ArrayList<>();\r
+        MatchEntriesBuilder entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpSpa.class);\r
+        entriesBuilder.setHasMask(true);\r
+        Ipv4AddressMatchEntryBuilder ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.3"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        MaskMatchEntryBuilder maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{(byte) 255, (byte) 255, (byte) 255, 0});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpTpa.class);\r
+        entriesBuilder.setHasMask(true);\r
+        ipv4AddressBuilder = new Ipv4AddressMatchEntryBuilder();\r
+        ipv4AddressBuilder.setIpv4Address(new Ipv4Address("10.0.0.4"));\r
+        entriesBuilder.addAugmentation(Ipv4AddressMatchEntry.class, ipv4AddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{(byte) 255, (byte) 128, 0, 0});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpSha.class);\r
+        entriesBuilder.setHasMask(true);\r
+        MacAddressMatchEntryBuilder macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:03"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{0, 0, 1, 0, 4, 0});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        entriesBuilder = new MatchEntriesBuilder();\r
+        entriesBuilder.setOxmClass(OpenflowBasicClass.class);\r
+        entriesBuilder.setOxmMatchField(ArpTha.class);\r
+        entriesBuilder.setHasMask(true);\r
+        macAddressBuilder = new MacAddressMatchEntryBuilder();\r
+        macAddressBuilder.setMacAddress(new MacAddress("00:00:00:00:00:04"));\r
+        entriesBuilder.addAugmentation(MacAddressMatchEntry.class, macAddressBuilder.build());\r
+        maskBuilder = new MaskMatchEntryBuilder();\r
+        maskBuilder.setMask(new byte[]{1, 1, 1, 2, 2, 2});\r
+        entriesBuilder.addAugmentation(MaskMatchEntry.class, maskBuilder.build());\r
+        entries.add(entriesBuilder.build());\r
+        builder.setMatchEntries(entries);\r
+        \r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow\r
+        .MatchBuilder salMatchBuilder = MatchConvertorImpl.fromOFMatchToSALMatch(builder.build(), new BigInteger("42"), OpenflowVersion.OF13);\r
+        org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.Match builtMatch = salMatchBuilder.build();\r
+        \r
+        ArpMatch arpMatch = (ArpMatch) builtMatch.getLayer3Match();\r
+        // FIXME - fix mask computation\r
+//        Assert.assertEquals("Wrong arp spa", "10.0.0.3/8", arpMatch.getArpSourceTransportAddress().getValue());\r
+//        Assert.assertEquals("Wrong arp tpa", "10.0.0.4/9", arpMatch.getArpTargetTransportAddress().getValue());\r
+        Assert.assertEquals("Wrong arp sha", "00:00:00:00:00:03", arpMatch.getArpSourceHardwareAddress().getAddress().getValue());\r
+        Assert.assertEquals("Wrong arp sha mask", "00:00:01:00:04:00", arpMatch.getArpSourceHardwareAddress().getMask().getValue());\r
+        Assert.assertEquals("Wrong arp tha", "00:00:00:00:00:04", arpMatch.getArpTargetHardwareAddress().getAddress().getValue());\r
+        Assert.assertEquals("Wrong arp tha mask", "01:01:01:02:02:02", arpMatch.getArpTargetHardwareAddress().getMask().getValue());\r
+    }\r
+}
\ No newline at end of file