Bug-5562 - Ipv4 L3-ArbitraryMask patch
[openflowplugin.git] / applications / statistics-manager / src / test / java / org / opendaylight / openflowplugin / applications / statistics / manager / impl / helper / MatchComparatorHelperTest.java
1 package org.opendaylight.openflowplugin.applications.statistics.manager.impl.helper;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertTrue;
5 import static org.junit.Assert.fail;
6
7 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
8 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
10
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Prefix;
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
17 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
20 import org.junit.Test;
21
22 /**
23  * @author sai.marapareddy@gmail.com (arbitrary masks)
24  */
25
26 /**
27  * test of {@link MatchComparatorHelper}
28  */
29 public class MatchComparatorHelperTest {
30
31     /**
32      * mask for /32
33      */
34     private static final int DEFAULT_IPV4_MASK = 0xffffffff;
35
36     /**
37      * mask for /30
38      */
39     private static final int IPV4_30_MASK = 0xfffffffc;
40     private static final int IP_ADDRESS = 0xC0A80101;
41
42     /**
43      * The test of conversion valid IP addres without mask to binary form.
44      */
45     @Test
46     public void validIpWithoutMaskTest() {
47         IntegerIpAddress intIp = MatchComparatorHelper.strIpToIntIp("192.168.1.1");
48         assertEquals(IP_ADDRESS, intIp.getIp());
49         assertEquals(DEFAULT_IPV4_MASK, intIp.getMask());
50     }
51
52     /**
53      * The test of conversion of valid IP address with valid mask to binary form.
54      */
55     @Test
56     public void validIpWithValidMaskTest() {
57         IntegerIpAddress intIp = MatchComparatorHelper.strIpToIntIp("192.168.1.1/30");
58         assertEquals(IP_ADDRESS, intIp.getIp());
59         assertEquals(IPV4_30_MASK, intIp.getMask());
60     }
61
62     /**
63      * The test of conversion of valid IP address invalid mask to binary form.
64      */
65     @Test
66     public void validIpWithInvalidMaskTest() {
67         try {
68             MatchComparatorHelper.strIpToIntIp("192.168.1.1/40");
69         } catch (IllegalStateException e) {
70             assertEquals("Valid values for mask are from range 0 - 32. Value 40 is invalid.", e.getMessage());
71             return;
72         }
73         fail("IllegalStateException was awaited (40 subnet is invalid)");
74     }
75
76     /**
77      * The test of conversion invalid IP address with valid mask to binary form.
78      */
79     @Test
80     public void invalidIpWithValidMaskTest() {
81         try {
82             MatchComparatorHelper.strIpToIntIp("257.168.1.1/25");
83         } catch (IllegalArgumentException e) {
84             assertEquals("'257.168.1.1' is not an IP string literal.", e.getMessage());
85         }
86     }
87
88     @Test
89     public void ethernetMatchEqualsTest() {
90         final EthernetMatchBuilder statsEthernetBuilder = new EthernetMatchBuilder();
91         final EthernetMatchBuilder storedEthernetBuilder = new EthernetMatchBuilder();
92
93         assertEquals(true, MatchComparatorHelper.ethernetMatchEquals(null, null));
94
95         statsEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
96                 new MacAddress("11:22:33:44:55:66")).build());
97         storedEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
98                 new MacAddress("11:22:33:44:55:77")).build());
99         assertEquals(false,
100                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
101
102         storedEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
103                 new MacAddress("11:22:33:44:55:66")).build());
104         statsEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
105                 new MacAddress("66:55:44:33:22:11")).build());
106         storedEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
107                 new MacAddress("77:55:44:33:22:11")).build());
108         assertEquals(false,
109                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
110
111         storedEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
112                 new MacAddress("66:55:44:33:22:11")).build());
113         statsEthernetBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) 1)).build());
114         storedEthernetBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) 1)).build());
115         assertEquals(true,
116                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
117
118         statsEthernetBuilder.setEthernetType(null).build();
119         assertEquals(false,
120                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
121
122         storedEthernetBuilder.setEthernetType(null).build();
123         assertEquals(true,
124                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
125
126     }
127
128     @Test
129     public void ethernetMatchFieldsEqualsTest() {
130         final EthernetSourceBuilder statsBuilder = new EthernetSourceBuilder();
131         final EthernetSourceBuilder storedBuilder = new EthernetSourceBuilder();
132
133         assertEquals(true, MatchComparatorHelper.ethernetMatchFieldsEquals(null, null));
134
135         statsBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
136         storedBuilder.setAddress(new MacAddress("11:22:33:44:55:77"));
137         assertEquals(false,
138                 MatchComparatorHelper.ethernetMatchFieldsEquals(statsBuilder.build(), storedBuilder.build()));
139
140         storedBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
141         assertEquals(true, MatchComparatorHelper.ethernetMatchFieldsEquals(statsBuilder.build(), storedBuilder.build()));
142     }
143
144     @Test
145     public void macAddressEqualsTest() {
146         assertEquals(true, MatchComparatorHelper.macAddressEquals(null, null));
147         assertEquals(true, MatchComparatorHelper.macAddressEquals(new MacAddress("11:22:33:44:55:66"), new MacAddress(
148                 "11:22:33:44:55:66")));
149         assertEquals(false, MatchComparatorHelper.macAddressEquals(new MacAddress("11:22:33:44:55:66"), new MacAddress(
150                 "11:22:33:44:55:77")));
151     }
152
153     @Test
154     public void checkNullValuesTest() {
155         assertEquals(false, MatchComparatorHelper.checkNullValues(null, ""));
156         assertEquals(false, MatchComparatorHelper.checkNullValues("", null));
157         assertEquals(true, MatchComparatorHelper.checkNullValues(null, null));
158         assertTrue(MatchComparatorHelper.checkNullValues("", "") == null);
159     }
160
161     @Test
162     public void compareIpv4PrefixNullSafeTest() {
163         assertEquals(true, MatchComparatorHelper.compareIpv4PrefixNullSafe(null, null));
164         assertEquals(true, MatchComparatorHelper.compareIpv4PrefixNullSafe(new Ipv4Prefix("192.168.1.1/31"),
165                 new Ipv4Prefix("192.168.1.1/31")));
166
167         assertEquals(false, MatchComparatorHelper.compareIpv4PrefixNullSafe(new Ipv4Prefix("192.168.1.1/31"),
168                 new Ipv4Prefix("191.168.1.1/31")));
169     }
170
171     @Test
172     public void compareStringNullSafeTest() {
173         assertEquals(true, MatchComparatorHelper.compareStringNullSafe(null,null));
174         assertEquals(true, MatchComparatorHelper.compareStringNullSafe("Hello", "Hello"));
175         assertEquals(false, MatchComparatorHelper.compareStringNullSafe("Hello", "hello"));
176     }
177
178     private static final int ip_192_168_1_1 = 0xC0A80101;
179     private static final int ip_192_168_1_4 = 0xC0A80104;
180
181     @Test
182     public void ipBasedMatchTest() {
183         // are equals because only IP address is compared
184         assertEquals(true, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 32),
185                 new IntegerIpAddress(ip_192_168_1_1, 16)));
186     }
187
188     @Test
189     public void ipAndMaskBasedMatchTest() {
190         // true because both cases are network 192.168.1.0
191         assertEquals(true, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 31),
192                 new IntegerIpAddress(ip_192_168_1_1, 30)));
193
194         // false because first is network 192.168.1.0 and second is 192.168.1.4
195         assertEquals(false, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 31),
196                 new IntegerIpAddress(ip_192_168_1_4, 30)));
197     }
198
199     @Test
200     public void layer3MatchEqualsTest() {
201         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
202         final Ipv4MatchBuilder storedBuilder = new Ipv4MatchBuilder();
203         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
204         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/30"));
205         storedBuilder.setIpv4Destination(new Ipv4Prefix("191.168.1.1/30"));
206         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
207         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
208         assertEquals(true,
209                 MatchComparatorHelper.layer3MatchEquals(new ArpMatchBuilder().build(), new ArpMatchBuilder().build()));
210     }
211
212     @Test
213     public void layer3MatchEqualsIpv4ArbitraryMaskTest(){
214         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
215         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
216         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
217         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/24"));
218         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
219         storedBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.255.0"));
220         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.1/24"));
221         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.168.1.1"));
222         storedBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.255.255.0"));
223         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
224         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
225
226     }
227
228     @Test
229     public void layer3MatchEqualsIpv4ArbitraryMaskRandomTest() {
230         final Ipv4MatchArbitraryBitMaskBuilder statsBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
231         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
232         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
233         statsBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.0.1"));
234         statsBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.0.255"));
235         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
236         storedBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.0.255"));
237         statsBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.0.0.1"));
238         statsBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.0.0.255"));
239         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.7.1.1"));
240         storedBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.0.0.255"));
241         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
242         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
243     }
244
245     @Test
246     public void layer3MatchEqualsIpv4ArbitraryMaskEqualsNullTest() {
247         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
248         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
249         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
250         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.0.1/32"));
251         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.0.1"));
252         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.1.0.0/32"));
253         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.1.0.0"));
254         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
255         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
256     }
257
258     @Test
259     public void layer3MatchEqualsIpv4ArbitraryEmptyBitMaskTest(){
260         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
261         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
262         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
263         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/32"));
264         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
265         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.1/32"));
266         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.168.1.1"));
267         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
268         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
269     }
270
271     @Test
272     public void extractIpv4AddressTest() {
273         Ipv4Address ipAddress = new Ipv4Address("1.1.1.1");
274         DottedQuad netMask = new DottedQuad("255.255.255.0");
275         String extractedIpAddress;
276         extractedIpAddress = MatchComparatorHelper.normalizeIpv4Address(ipAddress,netMask);
277         assertEquals(extractedIpAddress,"1.1.1.0");
278     }
279
280     @Test
281     public void convertArbitraryMaskToByteArrayTest() {
282         int value = 0xffffffff;
283         byte[] bytes = new byte[]{
284                 (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };
285         byte[] maskBytes;
286         maskBytes = MatchComparatorHelper.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255"));
287         for (int i=0; i<bytes.length;i++) {
288             int mask = maskBytes[i];
289             assertEquals(bytes[i],mask);
290         }
291     }
292
293     @Test
294     public void isArbitraryBitMaskTest() {
295         boolean arbitraryBitMask;
296         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {1,1,1,1});
297         assertEquals(arbitraryBitMask,true);
298         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {-1,-1,-1,-1});
299         assertEquals(arbitraryBitMask,false);
300         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {-1,-1,0,-1});
301         assertEquals(arbitraryBitMask,true);
302         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(null);
303         assertEquals(arbitraryBitMask,false);
304     }
305
306     @Test
307     public void createPrefixTest() {
308         Ipv4Address ipv4Address = new Ipv4Address("1.1.1.1");
309         byte [] byteMask = new byte[] {-1,-1,-1,-1};
310         Ipv4Prefix ipv4Prefix = MatchComparatorHelper.createPrefix(ipv4Address,byteMask);
311         assertEquals(ipv4Prefix,new Ipv4Prefix("1.1.1.1/32"));
312         String nullMask = "";
313         Ipv4Prefix ipv4PrefixNullMask = MatchComparatorHelper.createPrefix(ipv4Address,nullMask);
314         assertEquals(ipv4PrefixNullMask,new Ipv4Prefix("1.1.1.1/32"));
315         Ipv4Prefix ipv4PrefixNoMask = MatchComparatorHelper.createPrefix(ipv4Address);
316         assertEquals(ipv4PrefixNoMask,new Ipv4Prefix("1.1.1.1/32"));
317     }
318 }