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