Merge remote-tracking branch 'liblldp/master'
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / util / MatchNormalizationUtilTest.java
1 /*
2  * Copyright (c) 2017 Pantheon Technologies s.r.o. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.openflowplugin.impl.util;
10
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertNull;
13
14 import org.junit.Test;
15 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
18 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
19 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
20 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
21 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpSourceHardwareAddressBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.arp.match.fields.ArpTargetHardwareAddressBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatch;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4Match;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6Match;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4Match;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.TunnelIpv4MatchBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
40
41 public class MatchNormalizationUtilTest {
42     @Test
43     public void normalizeInPortMatch() {
44         final long port = 10;
45
46         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeInPortMatch(new MatchBuilder()
47                 .setInPort(new NodeConnectorId("openflow:1:" + port)), EncodeConstants.OF13_VERSION_ID);
48
49         assertEquals(String.valueOf(port), matchBuilder.getInPort().getValue());
50     }
51
52     @Test
53     public void normalizeInPhyPortMatch() {
54         final long port = 10;
55
56         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeInPhyPortMatch(new MatchBuilder()
57                 .setInPhyPort(new NodeConnectorId("openflow:1:" + port)), EncodeConstants.OF13_VERSION_ID);
58
59         assertEquals(String.valueOf(port), matchBuilder.getInPhyPort().getValue());
60     }
61
62     @Test
63     public void normalizeArpMatch() {
64         final int arpOp = 10;
65         final String source = "192.168.1.2/24";
66         final String destination = "192.168.2.2/24";
67         final MacAddress sourceHw = new MacAddress("01:23:45:AB:CD:EF");
68         final MacAddress dstHw = new MacAddress("01:23:45:AB:C0:EF");
69         final MacAddress mask = new MacAddress("FF:FF:FF:FF:FF:FF");
70
71         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeArpMatch(new MatchBuilder()
72                 .setLayer3Match(new ArpMatchBuilder()
73                         .setArpOp(10)
74                         .setArpSourceTransportAddress(new Ipv4Prefix(source))
75                         .setArpTargetTransportAddress(new Ipv4Prefix(destination))
76                         .setArpTargetHardwareAddress(new ArpTargetHardwareAddressBuilder()
77                                 .setAddress(dstHw)
78                                 .setMask(mask)
79                                 .build())
80                         .setArpSourceHardwareAddress(new ArpSourceHardwareAddressBuilder()
81                                 .setAddress(sourceHw)
82                                 .setMask(mask)
83                                 .build())
84                         .build()));
85
86         assertEquals(arpOp, ArpMatch.class.cast(matchBuilder.getLayer3Match()).getArpOp().intValue());
87     }
88
89     @Test
90     public void normalizeTunnelIpv4Match() {
91         final String source = "192.168.1.2/24";
92         final String destination = "192.168.2.2/24";
93
94         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeTunnelIpv4Match(new MatchBuilder()
95                 .setLayer3Match(new TunnelIpv4MatchBuilder()
96                         .setTunnelIpv4Source(new Ipv4Prefix(source))
97                         .setTunnelIpv4Destination(new Ipv4Prefix(destination))
98                         .build()));
99
100         assertEquals("192.168.1.0/24",
101                 TunnelIpv4Match.class.cast(matchBuilder.getLayer3Match()).getTunnelIpv4Source().getValue());
102         assertEquals("192.168.2.0/24",
103                 TunnelIpv4Match.class.cast(matchBuilder.getLayer3Match()).getTunnelIpv4Destination().getValue());
104     }
105
106     @Test
107     public void normalizeIpv4Match() {
108         final String source = "192.168.1.2/24";
109         final String destination = "192.168.2.2/24";
110
111         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeIpv4Match(new MatchBuilder()
112                 .setLayer3Match(new Ipv4MatchBuilder()
113                         .setIpv4Source(new Ipv4Prefix(source))
114                         .setIpv4Destination(new Ipv4Prefix(destination))
115                         .build()));
116
117         assertEquals("192.168.1.0/24", Ipv4Match.class.cast(matchBuilder.getLayer3Match()).getIpv4Source().getValue());
118         assertEquals("192.168.2.0/24",
119                 Ipv4Match.class.cast(matchBuilder.getLayer3Match()).getIpv4Destination().getValue());
120     }
121
122     @Test
123     public void normalizeIpv4MatchArbitraryBitMask() {
124         final Ipv4Address leftAddress = new Ipv4Address("192.168.72.1");
125         final DottedQuad leftMask = new DottedQuad("255.255.0.0");
126         final Ipv4Prefix right = new Ipv4Prefix("192.168.0.0/16");
127
128         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeIpv4MatchArbitraryBitMask(new MatchBuilder()
129                 .setLayer3Match(new Ipv4MatchArbitraryBitMaskBuilder()
130                         .setIpv4SourceAddressNoMask(leftAddress)
131                         .setIpv4SourceArbitraryBitmask(leftMask)
132                         .setIpv4DestinationAddressNoMask(leftAddress)
133                         .setIpv4DestinationArbitraryBitmask(leftMask)
134                         .build()));
135
136         assertEquals(right, Ipv4Match.class.cast(matchBuilder.getLayer3Match()).getIpv4Source());
137         assertEquals(right, Ipv4Match.class.cast(matchBuilder.getLayer3Match()).getIpv4Destination());
138     }
139
140     @Test
141     public void normalizeIpv6Match() {
142         final Ipv6Prefix leftPrefix = new Ipv6Prefix("1E3D:5678:9ABC::/24");
143         final Ipv6Prefix rightPrefix = new Ipv6Prefix("1e3d:5600:0:0:0:0:0:0/24");
144         final MacAddress leftMac = new MacAddress("01:23:45:AB:CD:EF");
145         final MacAddress rightMac = new MacAddress("01:23:45:ab:cd:ef");
146         final Ipv6Address leftAddress = new Ipv6Address("1E3D:5678:9ABC::");
147         final Ipv6Address rightAddress = new Ipv6Address("1e3d:5678:9abc:0:0:0:0:0");
148
149         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeIpv6Match(new MatchBuilder()
150                 .setLayer3Match(new Ipv6MatchBuilder()
151                         .setIpv6NdSll(leftMac)
152                         .setIpv6NdTll(leftMac)
153                         .setIpv6NdTarget(leftAddress)
154                         .setIpv6Source(leftPrefix)
155                         .setIpv6Destination(leftPrefix)
156                         .build()));
157
158         assertEquals(rightMac, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6NdSll());
159         assertEquals(rightMac, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6NdTll());
160         assertEquals(rightPrefix, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6Source());
161         assertEquals(rightPrefix, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6Destination());
162         assertEquals(rightAddress, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6NdTarget());
163     }
164
165     @Test
166     public void normalizeIpv6MatchArbitraryBitMask() {
167         final Ipv6Address leftAddress = new Ipv6Address("1E3D:5678:9ABC::");
168         final Ipv6ArbitraryMask leftMask = new Ipv6ArbitraryMask("FFFF:FF00::");
169         final Ipv6Prefix right = new Ipv6Prefix("1e3d:5600:0:0:0:0:0:0/24");
170
171         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeIpv6MatchArbitraryBitMask(new MatchBuilder()
172                 .setLayer3Match(new Ipv6MatchArbitraryBitMaskBuilder()
173                         .setIpv6SourceAddressNoMask(leftAddress)
174                         .setIpv6SourceArbitraryBitmask(leftMask)
175                         .setIpv6DestinationAddressNoMask(leftAddress)
176                         .setIpv6DestinationArbitraryBitmask(leftMask)
177                         .build()));
178
179         assertEquals(right, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6Source());
180         assertEquals(right, Ipv6Match.class.cast(matchBuilder.getLayer3Match()).getIpv6Destination());
181     }
182
183     @Test
184     public void normalizeEthernetMatch() {
185         final MacAddress left = new MacAddress("01:23:45:AB:CD:EF");
186         final MacAddress leftMask = new MacAddress("FF:FF:FF:FF:FF:FF");
187         final MacAddress right = new MacAddress("01:23:45:ab:cd:ef");
188
189         final MatchBuilder matchBuilder = MatchNormalizationUtil.normalizeEthernetMatch(new MatchBuilder()
190                 .setEthernetMatch(new EthernetMatchBuilder()
191                         .setEthernetSource(new EthernetSourceBuilder()
192                                 .setAddress(left)
193                                 .setMask(leftMask)
194                                 .build())
195                         .setEthernetDestination(new EthernetDestinationBuilder()
196                                 .setAddress(left)
197                                 .setMask(leftMask)
198                                 .build())
199                         .build()));
200
201         assertEquals(right, matchBuilder.getEthernetMatch().getEthernetSource().getAddress());
202         assertEquals(right, matchBuilder.getEthernetMatch().getEthernetDestination().getAddress());
203         assertNull(matchBuilder.getEthernetMatch().getEthernetSource().getMask());
204         assertNull(matchBuilder.getEthernetMatch().getEthernetDestination().getMask());
205     }
206 }