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