8c4d66cdfd0f1c9bd95ef98f478102a04cfd782c
[lispflowmapping.git] / mappingservice / implementation / src / test / java / org / opendaylight / lispflowmapping / implementation / lisp / MapResolverTest.java
1 /*
2  * Copyright (c) 2014 Contextream, 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.lisp;
9
10 import static org.junit.Assert.assertEquals;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16
17 import org.jmock.api.Invocation;
18 import org.junit.Assert;
19 import org.junit.Before;
20 import org.junit.Test;
21 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
22 import org.opendaylight.lispflowmapping.implementation.dao.MappingServiceKeyUtil;
23 import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor;
24 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
25 import org.opendaylight.lispflowmapping.interfaces.dao.IMappingServiceKey;
26 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceRLOCGroup;
27 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.EidToLocatorRecord.Action;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.LispAFIAddress;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapReply;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapRequest;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidrecords.EidRecord;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidrecords.EidRecordBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecord;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecordBuilder;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecord;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecordBuilder;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.ItrRloc;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequest.SourceEidBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.maprequestnotification.MapRequestBuilder;
41
42 public class MapResolverTest extends BaseTestCase {
43
44     // private MapResolver testedMapResolver;
45     private LispMappingService testedMapResolver;
46
47     private ILispDAO lispDAO;
48     private MapRequestBuilder mapRequest;
49     private LispAFIAddress v4Address;
50     private LispAFIAddress v6Address;
51
52     private HashMap<IMappingServiceKey, Map<String, MappingServiceRLOCGroup>> daoResults;
53
54     @Override
55     @Before
56     public void before() throws Exception {
57         super.before();
58         lispDAO = context.mock(ILispDAO.class);
59         testedMapResolver = new LispMappingService();
60         testedMapResolver.basicInit(lispDAO);
61
62         mapRequest = new MapRequestBuilder();
63         v4Address = LispAFIConvertor.asIPAfiAddress("1.2.3.4");
64         v6Address = LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1");
65         daoResults = new HashMap<IMappingServiceKey, Map<String, MappingServiceRLOCGroup>>();
66     }
67
68     @Test
69     public void handleMapRequest__ReplyWithSingleLocator() throws Exception {
70         mapRequest = getDefaultMapRequestBuilder();
71         mapRequest.getEidRecord().add(
72                 new EidRecordBuilder().setMask((short) 32)
73                         .setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.3.4"))).build());
74
75         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
76         record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
77
78         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
79         locator.setLocalLocator(false);
80         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
81         locator.setRouted(true);
82         locator.setMulticastPriority((short) 5);
83         locator.setWeight((short) 17);
84         locator.setPriority((short) 16);
85         record.getLocatorRecord().add(locator.build());
86         prepareMapping(record.build());
87
88         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
89
90         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
91         assertEquals(1, eidToLocators.getLocatorRecord().size());
92         LocatorRecord resultLocator = mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0);
93         assertEquals(locator.isLocalLocator(), resultLocator.isLocalLocator());
94         assertEquals(locator.isRouted(), resultLocator.isRouted());
95         assertEquals(locator.getMulticastPriority(), resultLocator.getMulticastPriority());
96         assertEquals(locator.getMulticastWeight(), resultLocator.getMulticastWeight());
97         assertEquals(locator.getPriority(), resultLocator.getPriority());
98         assertEquals(locator.getWeight(), resultLocator.getWeight());
99
100         assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
101     }
102
103     @Test
104     public void handleMapRequest__VerifyBasicFields() throws Exception {
105         mapRequest = getDefaultMapRequestBuilder();
106         mapRequest.getEidRecord().add(
107                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
108
109         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
110         record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
111         record.setRecordTtl(100);
112
113         record.setAuthoritative(true);
114         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
115         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
116         record.getLocatorRecord().add(locator.build());
117         prepareMapping(record.build());
118
119         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
120
121         assertEquals(mapRequest.getNonce(), mapReply.getNonce());
122         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
123         assertEquals((byte) 32, eidToLocators.getMaskLength().byteValue());
124         assertEquals(v4Address, LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
125         assertEquals(record.isAuthoritative(), eidToLocators.isAuthoritative());
126         assertEquals(record.getAction(), eidToLocators.getAction());
127         assertEquals(record.getRecordTtl(), eidToLocators.getRecordTtl());
128     }
129
130     @Test
131     public void handleMapRequest__VerifyMask() throws Exception {
132         mapRequest = getDefaultMapRequestBuilder();
133         mapRequest.getEidRecord().add(
134                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
135
136         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
137         record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.3.0")));
138         record.setMaskLength((short) 24);
139
140         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
141         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
142         record.getLocatorRecord().add(locator.build());
143         prepareMapping(record.build());
144
145         MapRequest mr = mapRequest.build();
146
147         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
148
149         assertEquals(mr.getNonce(), mapReply.getNonce());
150         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
151         assertEquals((byte) 24, eidToLocators.getMaskLength().byteValue());
152         assertEquals(LispAFIConvertor.asIPAfiAddress("1.2.3.0"), LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
153     }
154
155     @Test
156     public void handleMapRequest__VerifyMaskIPv6() throws Exception {
157         mapRequest = getDefaultMapRequestBuilder();
158         mapRequest.getEidRecord().add(
159                 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
160
161         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
162         record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:0")));
163         record.setMaskLength((short) 128);
164
165         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
166         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
167         record.getLocatorRecord().add(locator.build());
168         prepareMapping(record.build());
169
170         MapRequest mr = mapRequest.build();
171
172         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
173
174         assertEquals(mr.getNonce(), mapReply.getNonce());
175         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
176         assertEquals((byte) 128, eidToLocators.getMaskLength().byteValue());
177         assertEquals(v6Address, LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
178     }
179
180     @Test
181     public void handleMapRequest__VerifyMaskIPv6NoMatch() throws Exception {
182         mapRequest = getDefaultMapRequestBuilder();
183         mapRequest.getEidRecord().add(
184                 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
185
186         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
187         record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:1:0:0:0:0:0:1")));
188         record.setMaskLength((short) 112);
189
190         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
191         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
192         record.getLocatorRecord().add(locator.build());
193         prepareMapping(record.build());
194
195         MapRequest mr = mapRequest.build();
196
197         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
198         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
199         assertEquals(0, eidToLocators.getLocatorRecord().size());
200     }
201
202     @Test
203     public void handleMapRequest_VerifyNativelyForwardAutherized() {
204         MapRequest mr = getDefaultMapRequest();
205
206         Map<String, List<MappingServiceRLOCGroup>> result = new HashMap<String, List<MappingServiceRLOCGroup>>();
207         result.put(AbstractLispComponent.ADDRESS_SUBKEY, new ArrayList<MappingServiceRLOCGroup>());
208
209         MapReply mapReply = getNativelyForwardMapReply(mr, result);
210
211         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
212         assertEquals(1, eidToLocators.getRecordTtl().intValue());
213         assertEquals(Action.NativelyForward, eidToLocators.getAction());
214     }
215
216     private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, List<MappingServiceRLOCGroup>> result) {
217         allowing(lispDAO).get(wany(IMappingServiceKey.class));
218         ret(result);
219         allowing(lispDAO).getSpecific(wany(IMappingServiceKey.class), with(AbstractLispComponent.PASSWORD_SUBKEY));
220         ret("pass");
221         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
222         return mapReply;
223     }
224
225     private MapRequest getDefaultMapRequest() {
226         mapRequest = getDefaultMapRequestBuilder();
227         mapRequest.getEidRecord().add(
228                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
229         MapRequest mr = mapRequest.build();
230         return mr;
231     }
232
233     @Test
234     public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
235
236         mapRequest = getDefaultMapRequestBuilder();
237         mapRequest.getEidRecord().add(
238                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
239
240         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
241         record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.4.0")));
242         record.setMaskLength((short) 24);
243
244         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
245         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
246         record.getLocatorRecord().add(locator.build());
247         prepareMapping(record.build());
248
249         MapRequest mr = mapRequest.build();
250
251         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
252
253         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
254         assertEquals(0, eidToLocators.getLocatorRecord().size());
255
256     }
257
258     @Test
259     public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
260
261         mapRequest = getDefaultMapRequestBuilder();
262         mapRequest.getEidRecord().add(
263                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
264
265         EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
266         record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
267
268         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
269         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
270         record.getLocatorRecord().add(locator.build());
271         locator = getDefaultLocatorBuilder();
272         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1")));
273         record.getLocatorRecord().add(locator.build());
274         locator = getDefaultLocatorBuilder();
275         locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.8.2.7")));
276         record.getLocatorRecord().add(locator.build());
277
278         prepareMapping(record.build());
279
280         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
281
282         EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
283         assertEquals(3, eidToLocators.getLocatorRecord().size());
284
285         assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
286         assertLocator(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1"), eidToLocators.getLocatorRecord().get(1));
287         assertLocator(LispAFIConvertor.asIPAfiAddress("1.8.2.7"), eidToLocators.getLocatorRecord().get(2));
288     }
289
290     @Test
291     public void handleMapRequest__MultipleEIDs() throws Exception {
292
293         mapRequest = getDefaultMapRequestBuilder();
294         mapRequest.getEidRecord().add(
295                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
296         mapRequest.getEidRecord().add(
297                 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
298
299         EidToLocatorRecordBuilder record1 = getDefaultEidToLocatorBuilder();
300         record1.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
301         record1.setRecordTtl(100);
302
303         LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
304         locator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
305         record1.getLocatorRecord().add(locator1.build());
306
307         EidToLocatorRecordBuilder record2 = getDefaultEidToLocatorBuilder();
308         record2.setLispAddressContainer(LispAFIConvertor.toContainer(v6Address));
309         record2.setMaskLength((short) 128);
310         record2.setRecordTtl(100);
311
312         LocatorRecordBuilder locator2 = getDefaultLocatorBuilder();
313         locator2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1")));
314         record2.getLocatorRecord().add(locator2.build());
315
316         prepareMapping(record1.build(), record2.build());
317
318         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
319
320         EidToLocatorRecord eidToLocators1 = mapReply.getEidToLocatorRecord().get(0);
321         assertEquals(1, eidToLocators1.getLocatorRecord().size());
322         assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators1.getLocatorRecord().get(0));
323
324         EidToLocatorRecord eidToLocators2 = mapReply.getEidToLocatorRecord().get(1);
325         assertEquals(1, eidToLocators2.getLocatorRecord().size());
326         assertLocator(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1"), eidToLocators2.getLocatorRecord().get(0));
327     }
328
329     private void assertLocator(LispAFIAddress expectedAddress, LocatorRecord locatorRecord) {
330         assertEquals(LispAFIConvertor.toContainer(expectedAddress), locatorRecord.getLispAddressContainer());
331         Assert.assertTrue(locatorRecord.isRouted());
332     }
333
334     private Map<String, MappingServiceRLOCGroup> prepareMapping(EidToLocatorRecord... records) {
335         if (records.length > 0) {
336             for (EidToLocatorRecord eidToLocatorRecord : records) {
337                 Map<String, MappingServiceRLOCGroup> result = new HashMap<String, MappingServiceRLOCGroup>();
338                 MappingServiceRLOCGroup rlocs = new MappingServiceRLOCGroup(eidToLocatorRecord.getRecordTtl(), eidToLocatorRecord.getAction(),
339                         eidToLocatorRecord.isAuthoritative());
340                 for (LocatorRecord locator : eidToLocatorRecord.getLocatorRecord()) {
341                     rlocs.addRecord(locator);
342                 }
343                 result.put(AbstractLispComponent.ADDRESS_SUBKEY, rlocs);
344
345                 daoResults.put(
346                         MappingServiceKeyUtil.generateMappingServiceKey(eidToLocatorRecord.getLispAddressContainer(),
347                                 (short) eidToLocatorRecord.getMaskLength()), result);
348             }
349         }
350
351         ValueSaverAction<IMappingServiceKey> daoGetSaverAction = new ValueSaverAction<IMappingServiceKey>() {
352             @Override
353             protected boolean validate(IMappingServiceKey value) {
354                 return true;
355             }
356
357             @Override
358             public Object invoke(Invocation invocation) throws Throwable {
359                 return daoResults.get(lastValue);
360             }
361         };
362
363         allowing(lispDAO).get(with(daoGetSaverAction));
364         will(daoGetSaverAction);
365         allowing(lispDAO).getSpecific(wany(IMappingServiceKey.class), with(AbstractLispComponent.PASSWORD_SUBKEY));
366
367         return daoResults.get(MappingServiceKeyUtil.generateMappingServiceKey(LispAFIConvertor.toContainer(v4Address)));
368     }
369
370     private MapRequestBuilder getDefaultMapRequestBuilder() {
371         MapRequestBuilder mrBuilder = new MapRequestBuilder();
372         mrBuilder.setAuthoritative(false);
373         mrBuilder.setEidRecord(new ArrayList<EidRecord>());
374         mrBuilder.setItrRloc(new ArrayList<ItrRloc>());
375         mrBuilder.setMapDataPresent(true);
376         mrBuilder.setNonce((long) 0);
377         mrBuilder.setPitr(false);
378         mrBuilder.setProbe(false);
379         mrBuilder.setSmr(false);
380         mrBuilder.setSmrInvoked(true);
381         mrBuilder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(
382                 LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("127.0.0.1"))).build());
383         return mrBuilder;
384     }
385
386     private EidToLocatorRecordBuilder getDefaultEidToLocatorBuilder() {
387         EidToLocatorRecordBuilder builder = new EidToLocatorRecordBuilder();
388         builder.setAction(Action.NoAction);
389         builder.setAuthoritative(false);
390         builder.setLocatorRecord(new ArrayList<LocatorRecord>());
391         builder.setMapVersion((short) 0);
392         builder.setMaskLength((short) 32);
393         builder.setRecordTtl(60);
394         return builder;
395     }
396
397     private LocatorRecordBuilder getDefaultLocatorBuilder() {
398         LocatorRecordBuilder builder = new LocatorRecordBuilder();
399         builder.setLocalLocator(false);
400         builder.setMulticastPriority((short) 0);
401         builder.setMulticastWeight((short) 0);
402         builder.setPriority((short) 0);
403         builder.setRlocProbed(false);
404         builder.setRouted(true);
405         builder.setWeight((short) 0);
406         return builder;
407     }
408
409 }