38620100014659505ec244738f59c85264eaccc8
[lispflowmapping.git] / mappingservice / implementation / src / test / java / org / opendaylight / lispflowmapping / implementation / util / MappingMergeUtilTest.java
1 /*
2  * Copyright (c) 2016 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.lispflowmapping.implementation.util;
9
10 import static org.junit.Assert.assertEquals;
11 import static org.junit.Assert.assertFalse;
12 import static org.junit.Assert.assertNull;
13 import static org.junit.Assert.assertTrue;
14
15 import java.util.ArrayList;
16 import java.util.Date;
17 import java.util.Iterator;
18 import org.junit.Test;
19 import org.opendaylight.lispflowmapping.config.ConfigIni;
20 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
21 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
32
33 public class MappingMergeUtilTest {
34
35     private static final String IPV4_STRING_1 =         "1.2.3.0";
36     private static final String IPV4_STRING_2 =         "1.2.4.0";
37     private static final String IPV4_STRING_3 =         "1.2.5.0";
38     private static final String IPV4_STRING_4 =         "1.2.6.0";
39     private static final String IPV6_STRING =           "1111:2222:3333:4444:5555:6666:7777:8888";
40     private static final String IPV4_RLOC_STRING_1 =    "101.101.101.101";
41     private static final String IPV4_RLOC_STRING_2 =    "102.102.102.102";
42     private static final String IPV4_STRING_PREFIX_24 = "/24";
43     private static final String IPV4_STRING_PREFIX_16 = "/16";
44     private static final String IPV6_STRING_PREFIX =    "/96";
45     private static final Eid IPV4_PREFIX_EID_1 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_1 + IPV4_STRING_PREFIX_24);
46     private static final Eid IPV4_PREFIX_EID_2 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_2 + IPV4_STRING_PREFIX_16);
47     private static final Eid IPV6_PREFIX_EID = LispAddressUtil.asIpv6PrefixEid(IPV6_STRING + IPV6_STRING_PREFIX);
48     private static final Eid IPV4_EID_1 = LispAddressUtil.asIpv4Eid(IPV4_STRING_1);
49     private static final Eid IPV4_EID_2 = LispAddressUtil.asIpv4Eid(IPV4_STRING_2);
50     private static final Eid SOURCE_DEST_KEY_EID_1 = LispAddressUtil
51             .asSrcDstEid(IPV4_STRING_3, IPV4_STRING_4, 24, 16, 1);
52     private static final Rloc IPV4_RLOC_1 = LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1);
53     private static final Rloc IPV4_RLOC_2 = LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_2);
54     private static final IpAddressBinary IPV4_SOURCE_RLOC_1 = new IpAddressBinary(
55             new Ipv4AddressBinary(new byte[] {1, 1, 1, 1}));
56
57     private static final XtrId XTR_ID_1 = new XtrId(new byte[] {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1});
58
59     private static final SiteId SITE_ID_1 = new SiteId(new byte[]{1, 1, 1, 1, 1, 1, 1, 1});
60
61     private static final long REGISTRATION_VALIDITY = ConfigIni.getInstance().getRegistrationValiditySb();
62
63     /**
64      * Tests {@link MappingMergeUtil#mappingIsExpired} method.
65      */
66     @Test
67     public void mappingIsExpiredTest() {
68         long timestamp = new Date().getTime();
69         MappingData mappingData = getDefaultMappingData();
70         mappingData.setTimestamp(new Date(timestamp - (REGISTRATION_VALIDITY + 1L)));
71         assertTrue(MappingMergeUtil.mappingIsExpired(mappingData));
72         mappingData.setTimestamp(new Date(timestamp));
73         assertFalse(MappingMergeUtil.mappingIsExpired(mappingData));
74         mappingData.setTimestamp(null);
75         assertFalse(MappingMergeUtil.mappingIsExpired(mappingData));
76     }
77
78     /**
79      * Tests {@link MappingMergeUtil#mappingIsExpired} method, throws NPE.
80      */
81     @Test(expected = NullPointerException.class)
82     public void mappingIsExpiredTest_throwsNPE() {
83         MappingMergeUtil.mappingIsExpired(null);
84     }
85
86     /**
87      * Tests {@link MappingMergeUtil#timestampIsExpired} method, throws NPE.
88      */
89     @Test(expected = NullPointerException.class)
90     public void timestampIsExpiredTest_withDate_throwsNPE() {
91         Date date = null;
92         MappingMergeUtil.timestampIsExpired(date);
93     }
94
95     /**
96      * Tests {@link MappingMergeUtil#timestampIsExpired} method, throws NPE.
97      */
98     @Test
99     public void timestampIsExpiredTest_withDate() {
100         long timestamp = new Date().getTime();
101         assertTrue(MappingMergeUtil.timestampIsExpired(new Date(timestamp - (REGISTRATION_VALIDITY + 1L))));
102         assertFalse(MappingMergeUtil.timestampIsExpired(new Date(timestamp)));
103     }
104
105     /**
106      * Tests {@link MappingMergeUtil#computeNbSbIntersection} method, Nb mask greater than SB mask.
107      */
108     @Test
109     public void computeNbSbIntersectionTest_withMaskableIpv4PrefixEIDs_() {
110         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_PREFIX_EID_1).build();
111         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_PREFIX_EID_2).build();
112         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
113         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
114
115         // result
116         MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
117
118         assertEquals(IPV4_PREFIX_EID_1, result.getRecord().getEid());
119     }
120
121     /**
122      * Tests {@link MappingMergeUtil#computeNbSbIntersection} method, Nb mask less than SB mask.
123      */
124     @Test
125     public void computeNbSbIntersectionTest_withMaskableIpv4PrefixEIDs() {
126         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_PREFIX_EID_2).build();
127         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_PREFIX_EID_1).build();
128         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
129         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
130
131         // result
132         MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
133
134         assertEquals(IPV4_PREFIX_EID_1, result.getRecord().getEid());
135     }
136
137     /**
138      * Tests {@link MappingMergeUtil#computeNbSbIntersection} method with SourceDestKey Eid address type, Ipv4Prefix
139      * SB Eid, Nb mask less than SB mask.
140      */
141     @Test
142     public void computeNbSbIntersectionTest_withMaskableSourceDestKeyEIDs_Ipv4SB() {
143         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setEid(SOURCE_DEST_KEY_EID_1).build();
144         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_PREFIX_EID_1).build();
145         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
146         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
147
148         // result
149         final MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
150         final Eid eid = LispAddressUtil.asSrcDstEid(IPV4_STRING_3 ,IPV4_STRING_1 ,24 , 24, 1);
151
152         assertEquals(eid, result.getRecord().getEid());
153     }
154
155     /**
156      * Tests {@link MappingMergeUtil#computeNbSbIntersection} method with SourceDestKey Eid address type, Ipv6Prefix
157      * SB Eid, Nb mask less than SB mask.
158      */
159     @Test
160     public void computeNbSbIntersectionTest_withMaskableSourceDestKeyEIDs_Ipv6SB() {
161         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setEid(SOURCE_DEST_KEY_EID_1).build();
162         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV6_PREFIX_EID).build();
163         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
164         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
165
166         // result
167         final MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
168         final Eid eid = LispAddressUtil.asSrcDstEid(IPV4_STRING_3 ,IPV6_STRING ,24 , 96, 1);
169
170         assertEquals(eid, result.getRecord().getEid());
171     }
172
173     /**
174      * Tests {@link MappingMergeUtil#getCommonLocatorRecords} method with empty list of locator records.
175      */
176     @Test
177     public void getCommonLocatorRecords_withEmptyLocatorRecords() {
178         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_EID_2).build();
179         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setEid(IPV4_EID_1).build();
180         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
181         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
182
183         // result
184         MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
185         assertEquals(0, result.getRecord().getLocatorRecord().size());
186     }
187
188     /**
189      * Tests {@link MappingMergeUtil#getCommonLocatorRecords} method with list of locator records == null.
190      */
191     @Test
192     public void getCommonLocatorRecords_withNullLocatorRecords() {
193         MappingRecord nbMappingRecord = getDefaultMappingRecordBuilder().setLocatorRecord(null).build();
194         MappingRecord sbMappingRecord = getDefaultMappingRecordBuilder().setLocatorRecord(null).build();
195         MappingData nbMappingData = getDefaultMappingData(nbMappingRecord);
196         MappingData sbMappingData = getDefaultMappingData(sbMappingRecord);
197
198         // result
199         MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
200         assertNull(result.getRecord().getLocatorRecord());
201     }
202
203     /**
204      * Tests {@link MappingMergeUtil#getCommonLocatorRecords} method, verifies that NB common locator's priority is set
205      * to correct value (based on SB locator's priority).
206      */
207     @Test
208     public void getCommonLocatorRecords_priorityCheck() {
209         LocatorRecordBuilder nbLocatorRecordBuilder1 = new LocatorRecordBuilder()
210                 .setRloc(IPV4_RLOC_1)
211                 .setPriority((short) 1)
212                 .setLocatorId("NB-locator-id");
213         LocatorRecordBuilder sbLocatorRecordBuilder1 = new LocatorRecordBuilder()
214                 .setRloc(IPV4_RLOC_1)
215                 .setPriority((short) 255)
216                 .setLocatorId("SB-locator-id");
217
218         LocatorRecordBuilder nbLocatorRecordBuilder2 = new LocatorRecordBuilder()
219                 .setRloc(IPV4_RLOC_2)
220                 .setPriority((short) 1)
221                 .setLocatorId("NB-locator-id");
222         LocatorRecordBuilder sbLocatorRecordBuilder2 = new LocatorRecordBuilder()
223                 .setRloc(IPV4_RLOC_2)
224                 .setPriority((short) 254)
225                 .setLocatorId("SB-locator-id");
226
227         final MappingRecordBuilder nbMappingRecordBuilder = getDefaultMappingRecordBuilder();
228         nbMappingRecordBuilder.getLocatorRecord().add(nbLocatorRecordBuilder1.build());
229         nbMappingRecordBuilder.getLocatorRecord().add(nbLocatorRecordBuilder2.build());
230
231         final MappingRecordBuilder sbMappingRecordBuilder = getDefaultMappingRecordBuilder();
232         sbMappingRecordBuilder.getLocatorRecord().add(sbLocatorRecordBuilder1.build());
233         sbMappingRecordBuilder.getLocatorRecord().add(sbLocatorRecordBuilder2.build());
234
235         MappingData nbMappingData = getDefaultMappingData(nbMappingRecordBuilder.build());
236         MappingData sbMappingData = getDefaultMappingData(sbMappingRecordBuilder.build());
237
238         // result
239         final MappingData result = MappingMergeUtil.computeNbSbIntersection(nbMappingData, sbMappingData);
240         final Iterator<LocatorRecord> iterator = result.getRecord().getLocatorRecord().iterator();
241         final LocatorRecord resultLocator_1 = iterator.next();
242         final LocatorRecord resultLocator_2 = iterator.next();
243
244         assertEquals(2, result.getRecord().getLocatorRecord().size());
245
246         assertEquals("NB-locator-id", resultLocator_1.getLocatorId());
247         // priority changed to 255
248         assertEquals(255, (short) resultLocator_1.getPriority());
249
250         assertEquals("NB-locator-id", resultLocator_2.getLocatorId());
251         // priority remains original
252         assertEquals(1, (short) resultLocator_2.getPriority());
253     }
254
255     private static MappingData getDefaultMappingData() {
256         return getDefaultMappingData(null);
257     }
258
259     private static MappingData getDefaultMappingData(MappingRecord mappingRecord) {
260         if (mappingRecord == null) {
261             mappingRecord = getDefaultMappingRecordBuilder().build();
262         }
263         return new MappingData(mappingRecord, System.currentTimeMillis());
264     }
265
266     private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
267         return new MappingRecordBuilder()
268                 .setEid(IPV4_PREFIX_EID_1)
269                 .setLocatorRecord(new ArrayList<>())
270                 .setRecordTtl(2)
271                 .setAction(MappingRecord.Action.NativelyForward)
272                 .setAuthoritative(true)
273                 .setMapVersion((short) 1)
274                 .setSiteId(SITE_ID_1)
275                 .setSourceRloc(IPV4_SOURCE_RLOC_1)
276                 .setTimestamp(new Date().getTime())
277                 .setXtrId(XTR_ID_1);
278     }
279 }