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