Merge "Bug 6110: Fixed bugs in statistics manager due to race condition." into stable...
[openflowplugin.git] / openflowplugin-impl / src / test / java / org / opendaylight / openflowplugin / impl / util / MatchComparatorHelperTest.java
1 /*
2  * Copyright (c) 2014, 2017 Cisco Systems, Inc. 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 org.junit.Test;
11 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
12 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Prefix;
13 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
14 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Prefix;
15 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DottedQuad;
16 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.l2.types.rev130827.EtherType;
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetDestinationBuilder;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetSourceBuilder;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.ethernet.match.fields.EthernetTypeBuilder;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.EthernetMatchBuilder;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.ArpMatchBuilder;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchArbitraryBitMaskBuilder;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv4MatchBuilder;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchArbitraryBitMaskBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.layer._3.match.Ipv6MatchBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.opendaylight.ipv6.arbitrary.bitmask.fields.rev160224.Ipv6ArbitraryMask;
28
29 import static org.junit.Assert.assertEquals;
30 import static org.junit.Assert.assertTrue;
31 import static org.junit.Assert.fail;
32
33 /**
34  * @author sai.marapareddy@gmail.com (arbitrary masks)
35  */
36
37 /**
38  * test of {@link MatchComparatorHelper}
39  */
40 public class MatchComparatorHelperTest {
41
42     /**
43      * mask for /32
44      */
45     private static final int DEFAULT_IPV4_MASK = 0xffffffff;
46
47     /**
48      * mask for /30
49      */
50     private static final int IPV4_30_MASK = 0xfffffffc;
51     private static final int IP_ADDRESS = 0xC0A80101;
52
53     /**
54      * The test of conversion valid IP addres without mask to binary form.
55      */
56     @Test
57     public void validIpWithoutMaskTest() {
58         IntegerIpAddress intIp = MatchComparatorHelper.strIpToIntIp("192.168.1.1");
59         assertEquals(IP_ADDRESS, intIp.getIp());
60         assertEquals(DEFAULT_IPV4_MASK, intIp.getMask());
61     }
62
63     /**
64      * The test of conversion of valid IP address with valid mask to binary form.
65      */
66     @Test
67     public void validIpWithValidMaskTest() {
68         IntegerIpAddress intIp = MatchComparatorHelper.strIpToIntIp("192.168.1.1/30");
69         assertEquals(IP_ADDRESS, intIp.getIp());
70         assertEquals(IPV4_30_MASK, intIp.getMask());
71     }
72
73     /**
74      * The test of conversion of valid IP address invalid mask to binary form.
75      */
76     @Test
77     public void validIpWithInvalidMaskTest() {
78         try {
79             MatchComparatorHelper.strIpToIntIp("192.168.1.1/40");
80         } catch (IllegalStateException e) {
81             assertEquals("Valid values for mask are from range 0 - 32. Value 40 is invalid.", e.getMessage());
82             return;
83         }
84         fail("IllegalStateException was awaited (40 subnet is invalid)");
85     }
86
87     /**
88      * The test of conversion invalid IP address with valid mask to binary form.
89      */
90     @Test
91     public void invalidIpWithValidMaskTest() {
92         try {
93             MatchComparatorHelper.strIpToIntIp("257.168.1.1/25");
94         } catch (IllegalArgumentException e) {
95             assertEquals("'257.168.1.1' is not an IP string literal.", e.getMessage());
96         }
97     }
98
99     @Test
100     public void ethernetMatchEqualsTest() {
101         final EthernetMatchBuilder statsEthernetBuilder = new EthernetMatchBuilder();
102         final EthernetMatchBuilder storedEthernetBuilder = new EthernetMatchBuilder();
103
104         assertEquals(true, MatchComparatorHelper.ethernetMatchEquals(null, null));
105
106         statsEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
107                 new MacAddress("11:22:33:44:55:66")).build());
108         storedEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
109                 new MacAddress("11:22:33:44:55:77")).build());
110         assertEquals(false,
111                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
112
113         storedEthernetBuilder.setEthernetSource(new EthernetSourceBuilder().setAddress(
114                 new MacAddress("11:22:33:44:55:66")).build());
115         statsEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
116                 new MacAddress("66:55:44:33:22:11")).build());
117         storedEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
118                 new MacAddress("77:55:44:33:22:11")).build());
119         assertEquals(false,
120                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
121
122         storedEthernetBuilder.setEthernetDestination(new EthernetDestinationBuilder().setAddress(
123                 new MacAddress("66:55:44:33:22:11")).build());
124         statsEthernetBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) 1)).build());
125         storedEthernetBuilder.setEthernetType(new EthernetTypeBuilder().setType(new EtherType((long) 1)).build());
126         assertEquals(true,
127                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
128
129         statsEthernetBuilder.setEthernetType(null).build();
130         assertEquals(false,
131                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
132
133         storedEthernetBuilder.setEthernetType(null).build();
134         assertEquals(true,
135                 MatchComparatorHelper.ethernetMatchEquals(statsEthernetBuilder.build(), storedEthernetBuilder.build()));
136
137     }
138
139     // Please see following bug for more details https://bugs.opendaylight.org/show_bug.cgi?id=7910
140     @Test
141     public void ethernetMatchWithFullMaskTest() {
142         final EthernetSourceBuilder statsBuilder = new EthernetSourceBuilder();
143         final EthernetSourceBuilder storedBuilder = new EthernetSourceBuilder();
144
145         assertEquals(true, MatchComparatorHelper.ethernetMatchFieldsEquals(null, null));
146
147         statsBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
148
149         storedBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
150         storedBuilder.setMask(new MacAddress("FF:FF:FF:FF:FF:FF"));
151
152         assertEquals(true,
153                 MatchComparatorHelper.ethernetMatchFieldsEquals(statsBuilder.build(), storedBuilder.build()));
154     }
155
156     @Test
157     public void ethernetMatchFieldsEqualsTest() {
158         final EthernetSourceBuilder statsBuilder = new EthernetSourceBuilder();
159         final EthernetSourceBuilder storedBuilder = new EthernetSourceBuilder();
160
161         assertEquals(true, MatchComparatorHelper.ethernetMatchFieldsEquals(null, null));
162
163         statsBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
164         storedBuilder.setAddress(new MacAddress("11:22:33:44:55:77"));
165         assertEquals(false,
166                 MatchComparatorHelper.ethernetMatchFieldsEquals(statsBuilder.build(), storedBuilder.build()));
167
168         storedBuilder.setAddress(new MacAddress("11:22:33:44:55:66"));
169         assertEquals(true, MatchComparatorHelper.ethernetMatchFieldsEquals(statsBuilder.build(), storedBuilder.build()));
170     }
171
172     @Test
173     public void macAddressEqualsTest() {
174         assertEquals(true, MatchComparatorHelper.macAddressEquals(null, null));
175         assertEquals(true, MatchComparatorHelper.macAddressEquals(new MacAddress("11:22:33:44:55:66"), new MacAddress(
176                 "11:22:33:44:55:66")));
177         assertEquals(false, MatchComparatorHelper.macAddressEquals(new MacAddress("11:22:33:44:55:66"), new MacAddress(
178                 "11:22:33:44:55:77")));
179     }
180
181     @Test
182     public void checkNullValuesTest() {
183         assertEquals(false, MatchComparatorHelper.checkNullValues(null, ""));
184         assertEquals(false, MatchComparatorHelper.checkNullValues("", null));
185         assertEquals(true, MatchComparatorHelper.checkNullValues(null, null));
186         assertTrue(MatchComparatorHelper.checkNullValues("", "") == null);
187     }
188
189     @Test
190     public void compareIpv4PrefixNullSafeTest() {
191         assertEquals(true, MatchComparatorHelper.compareIpv4PrefixNullSafe(null, null));
192         assertEquals(true, MatchComparatorHelper.compareIpv4PrefixNullSafe(new Ipv4Prefix("192.168.1.1/31"),
193                 new Ipv4Prefix("192.168.1.1/31")));
194
195         assertEquals(false, MatchComparatorHelper.compareIpv4PrefixNullSafe(new Ipv4Prefix("192.168.1.1/31"),
196                 new Ipv4Prefix("191.168.1.1/31")));
197     }
198
199     @Test
200     public void compareStringNullSafeTest() {
201         assertEquals(true, MatchComparatorHelper.compareStringNullSafe(null,null));
202         assertEquals(true, MatchComparatorHelper.compareStringNullSafe("Hello", "Hello"));
203         assertEquals(false, MatchComparatorHelper.compareStringNullSafe("Hello", "hello"));
204     }
205
206     private static final int ip_192_168_1_1 = 0xC0A80101;
207     private static final int ip_192_168_1_4 = 0xC0A80104;
208
209     @Test
210     public void ipBasedMatchTest() {
211         // are equals because only IP address is compared
212         assertEquals(true, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 32),
213                 new IntegerIpAddress(ip_192_168_1_1, 16)));
214     }
215
216     @Test
217     public void ipAndMaskBasedMatchTest() {
218         // true because both cases are network 192.168.1.0
219         assertEquals(true, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 31),
220                 new IntegerIpAddress(ip_192_168_1_1, 30)));
221
222         // false because first is network 192.168.1.0 and second is 192.168.1.4
223         assertEquals(false, MatchComparatorHelper.ipBasedMatch(new IntegerIpAddress(ip_192_168_1_1, 31),
224                 new IntegerIpAddress(ip_192_168_1_4, 30)));
225     }
226
227     @Test
228     public void layer3MatchEqualsTest() {
229         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
230         final Ipv4MatchBuilder storedBuilder = new Ipv4MatchBuilder();
231         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
232         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/30"));
233         storedBuilder.setIpv4Destination(new Ipv4Prefix("191.168.1.1/30"));
234         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
235         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
236         assertEquals(true,
237                 MatchComparatorHelper.layer3MatchEquals(new ArpMatchBuilder().build(), new ArpMatchBuilder().build()));
238     }
239
240     @Test
241     public void layer3MatchEqualsIpv6Test() {
242         final Ipv6MatchBuilder statsBuilder = new Ipv6MatchBuilder();
243         final Ipv6MatchBuilder storedBuilder = new Ipv6MatchBuilder();
244         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
245
246         statsBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:5D99/64"));
247         storedBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:4D99/64"));
248         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
249
250         statsBuilder.setIpv6Destination(new Ipv6Prefix("aabb:1234:2acf:000d:0000:0000:0000:5d99/64"));
251         storedBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:4D99/64"));
252         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
253
254         statsBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000C:0000:0000:0000:5D99/64"));
255         storedBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:4D99/64"));
256         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
257
258         statsBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000C:0000:0000:0000:5D99/63"));
259         storedBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:4D99/63"));
260         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
261
262         statsBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000D:0000:0000:0000:5D99/63"));
263         storedBuilder.setIpv6Destination(new Ipv6Prefix("AABB:1234:2ACF:000E:0000:0000:0000:4D99/63"));
264         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
265     }
266
267     @Test
268     public void layer3MatchEqualsIpv4ArbitraryMaskTest(){
269         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
270         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
271         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
272         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/24"));
273         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
274         storedBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.255.0"));
275         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.1/24"));
276         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.168.1.1"));
277         storedBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.255.255.0"));
278         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
279         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
280
281     }
282
283     @Test
284     public void layer3MatchEqualsIpv4ArbitraryMaskRandomTest() {
285         final Ipv4MatchArbitraryBitMaskBuilder statsBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
286         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
287         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
288         statsBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.0.1"));
289         statsBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.0.255"));
290         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
291         storedBuilder.setIpv4DestinationArbitraryBitmask(new DottedQuad("255.255.0.255"));
292         statsBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.0.0.1"));
293         statsBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.0.0.255"));
294         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.7.1.1"));
295         storedBuilder.setIpv4SourceArbitraryBitmask(new DottedQuad("255.0.0.255"));
296         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
297         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
298     }
299
300     @Test
301     public void layer3MatchEqualsIpv4ArbitraryMaskEqualsNullTest() {
302         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
303         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
304         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
305         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.0.1/32"));
306         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.0.1"));
307         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.1.0.0/32"));
308         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.1.0.0"));
309         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
310         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
311     }
312
313     @Test
314     public void layer3MatchEqualsIpv4ArbitraryEmptyBitMaskTest(){
315         final Ipv4MatchBuilder statsBuilder = new Ipv4MatchBuilder();
316         final Ipv4MatchArbitraryBitMaskBuilder storedBuilder = new Ipv4MatchArbitraryBitMaskBuilder();
317         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
318         statsBuilder.setIpv4Destination(new Ipv4Prefix("192.168.1.1/32"));
319         storedBuilder.setIpv4DestinationAddressNoMask(new Ipv4Address("192.168.1.1"));
320         statsBuilder.setIpv4Source(new Ipv4Prefix("192.168.1.1/32"));
321         storedBuilder.setIpv4SourceAddressNoMask(new Ipv4Address("192.168.1.1"));
322         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
323         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
324     }
325
326     @Test
327     public void extractIpv4AddressTest() {
328         Ipv4Address ipAddress = new Ipv4Address("1.1.1.1");
329         DottedQuad netMask = new DottedQuad("255.255.255.0");
330         String extractedIpAddress;
331         extractedIpAddress = MatchComparatorHelper.normalizeIpv4Address(ipAddress,netMask);
332         assertEquals(extractedIpAddress,"1.1.1.0");
333     }
334
335     @Test
336     public void convertArbitraryMaskToByteArrayTest() {
337         int value = 0xffffffff;
338         byte[] bytes = new byte[]{
339                 (byte)(value >>> 24), (byte)(value >> 16 & 0xff), (byte)(value >> 8 & 0xff), (byte)(value & 0xff) };
340         byte[] maskBytes;
341         maskBytes = MatchComparatorHelper.convertArbitraryMaskToByteArray(new DottedQuad("255.255.255.255"));
342         for (int i=0; i<bytes.length;i++) {
343             int mask = maskBytes[i];
344             assertEquals(bytes[i],mask);
345         }
346     }
347
348     @Test
349     public void isArbitraryBitMaskTest() {
350         boolean arbitraryBitMask;
351         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {1,1,1,1});
352         assertEquals(arbitraryBitMask,true);
353         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {-1,-1,-1,-1});
354         assertEquals(arbitraryBitMask,false);
355         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(new byte[] {-1,-1,0,-1});
356         assertEquals(arbitraryBitMask,true);
357         arbitraryBitMask = MatchComparatorHelper.isArbitraryBitMask(null);
358         assertEquals(arbitraryBitMask,false);
359     }
360
361     @Test
362     public void createPrefixTest() {
363         Ipv4Address ipv4Address = new Ipv4Address("1.1.1.1");
364         byte [] byteMask = new byte[] {-1,-1,-1,-1};
365         Ipv4Prefix ipv4Prefix = MatchComparatorHelper.createPrefix(ipv4Address,byteMask);
366         assertEquals(ipv4Prefix,new Ipv4Prefix("1.1.1.1/32"));
367         String nullMask = "";
368         Ipv4Prefix ipv4PrefixNullMask = MatchComparatorHelper.createPrefix(ipv4Address,nullMask);
369         assertEquals(ipv4PrefixNullMask,new Ipv4Prefix("1.1.1.1/32"));
370         Ipv4Prefix ipv4PrefixNoMask = MatchComparatorHelper.createPrefix(ipv4Address);
371         assertEquals(ipv4PrefixNoMask,new Ipv4Prefix("1.1.1.1/32"));
372     }
373
374     @Test
375     public void layer3MatchEqualsIpv6ArbitraryMaskTest(){
376         final Ipv6MatchBuilder statsBuilder = new Ipv6MatchBuilder();
377         final Ipv6MatchArbitraryBitMaskBuilder storedBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
378         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
379         statsBuilder.setIpv6Destination(new Ipv6Prefix("1:2:3:4:5:6:7:8/16"));
380         storedBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("1:2:3:4:5:6:7:8"));
381         storedBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("FFFF:0000:0000:0000:0000:0000:0000:0000"));
382         statsBuilder.setIpv6Source(new Ipv6Prefix("1:2:3:4:5:6:7:8/32"));
383         storedBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("1:2:3:4:5:6:7:8"));
384         storedBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("FFFF:FFFF::"));
385         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
386         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
387     }
388
389
390     @Test
391     public void layer3MatchEqualsIpv6ArbitraryMaskRandomTest() {
392         final Ipv6MatchArbitraryBitMaskBuilder statsBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
393         final Ipv6MatchArbitraryBitMaskBuilder storedBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
394         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
395         statsBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("1::8"));
396         statsBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("FFFF::FFFF"));
397         storedBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("1:92:93:94:95:96:97:8"));
398         storedBuilder.setIpv6DestinationArbitraryBitmask(new Ipv6ArbitraryMask("FFFF::FFFF"));
399         statsBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("1::8"));
400         statsBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("FFFF::FFFF"));
401         storedBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("1:92:93:94:95:96:97:8"));
402         storedBuilder.setIpv6SourceArbitraryBitmask(new Ipv6ArbitraryMask("FFFF::FFFF"));
403         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
404         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
405     }
406
407     @Test
408     public void layer3MatchEqualsIpv6ArbitraryMaskEqualsNullTest() {
409         final Ipv6MatchBuilder statsBuilder = new Ipv6MatchBuilder();
410         final Ipv6MatchArbitraryBitMaskBuilder storedBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
411         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
412         statsBuilder.setIpv6Source(new Ipv6Prefix("1:2:3:4:5:6:7:8/128"));
413         storedBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("1:2:3:4:5:6:7:8"));
414         statsBuilder.setIpv6Destination(new Ipv6Prefix("1:2:3:4:5:6::/128"));
415         storedBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("1:2:3:4:5:6::"));
416         assertEquals(false, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
417         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
418     }
419
420     @Test
421     public void layer3MatchEqualsIpv6ArbitraryEmptyBitMaskTest(){
422         final Ipv6MatchBuilder statsBuilder = new Ipv6MatchBuilder();
423         final Ipv6MatchArbitraryBitMaskBuilder storedBuilder = new Ipv6MatchArbitraryBitMaskBuilder();
424         assertEquals(true,MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(),storedBuilder.build()));
425         statsBuilder.setIpv6Destination(new Ipv6Prefix("1:2:3:4:5:6:7:8/128"));
426         storedBuilder.setIpv6DestinationAddressNoMask(new Ipv6Address("1:2:3:4:5:6:7:8"));
427         statsBuilder.setIpv6Source(new Ipv6Prefix("1:2:3:4:5:6::/128"));
428         storedBuilder.setIpv6SourceAddressNoMask(new Ipv6Address("1:2:3:4:5:6::"));
429         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(statsBuilder.build(), storedBuilder.build()));
430         assertEquals(true, MatchComparatorHelper.layer3MatchEquals(null, null));
431     }
432 }