1 package org.opendaylight.lispflowmapping.implementation.lisp;
3 import static org.junit.Assert.assertEquals;
5 import java.util.ArrayList;
6 import java.util.HashMap;
10 import junit.framework.Assert;
12 import org.jmock.api.Invocation;
13 import org.junit.Before;
14 import org.junit.Ignore;
15 import org.junit.Test;
16 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
17 import org.opendaylight.lispflowmapping.implementation.authentication.LispKeyIDEnum;
18 import org.opendaylight.lispflowmapping.implementation.dao.MappingServiceKeyUtil;
19 import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor;
20 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
21 import org.opendaylight.lispflowmapping.interfaces.dao.IMappingServiceKey;
22 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceRLOC;
23 import org.opendaylight.lispflowmapping.interfaces.dao.MappingServiceValue;
24 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
25 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
26 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
27 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
28 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecord;
29 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecordBuilder;
30 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
31 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
32 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
33 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
34 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
35 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRloc;
36 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.SourceEidBuilder;
37 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequestnotification.MapRequestBuilder;
40 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
42 * This program and the accompanying materials are made available under the
43 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
44 * and is available at http://www.eclipse.org/legal/epl-v10.html
47 public class MapResolverTest extends BaseTestCase {
49 // private MapResolver testedMapResolver;
50 private LispMappingService testedMapResolver;
52 private ILispDAO lispDAO;
53 private MapRequestBuilder mapRequest;
54 private LispAFIAddress v4Address;
55 private LispAFIAddress v6Address;
57 private HashMap<IMappingServiceKey, Map<String, MappingServiceValue>> daoResults;
61 public void before() throws Exception {
63 lispDAO = context.mock(ILispDAO.class);
64 testedMapResolver = new LispMappingService();
65 testedMapResolver.basicInit(lispDAO);
67 mapRequest = new MapRequestBuilder();
68 v4Address = LispAFIConvertor.asIPAfiAddress("1.2.3.4");
69 v6Address = LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1");
70 daoResults = new HashMap<IMappingServiceKey, Map<String, MappingServiceValue>>();
74 public void handleMapRequest__ReplyWithSingleLocator() throws Exception {
75 mapRequest = getDefaultMapRequestBuilder();
76 mapRequest.getEidRecord().add(
77 new EidRecordBuilder().setMask((short) 32)
78 .setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.3.4"))).build());
80 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
81 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
83 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
84 locator.setLocalLocator(false);
85 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
86 locator.setRouted(true);
87 locator.setMulticastPriority((short) 5);
88 locator.setWeight((short) 17);
89 locator.setPriority((short) 16);
90 record.getLocatorRecord().add(locator.build());
91 prepareMapping(record.build());
93 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
95 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
96 assertEquals(1, eidToLocators.getLocatorRecord().size());
97 LocatorRecord resultLocator = mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0);
98 assertEquals(locator.isLocalLocator(), resultLocator.isLocalLocator());
99 assertEquals(locator.isRouted(), resultLocator.isRouted());
100 assertEquals(locator.getMulticastPriority(), resultLocator.getMulticastPriority());
101 assertEquals(locator.getMulticastWeight(), resultLocator.getMulticastWeight());
102 assertEquals(locator.getPriority(), resultLocator.getPriority());
103 assertEquals(locator.getWeight(), resultLocator.getWeight());
105 assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
109 public void handleMapRequest__VerifyBasicFields() throws Exception {
110 mapRequest = getDefaultMapRequestBuilder();
111 mapRequest.getEidRecord().add(
112 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
114 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
115 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
116 record.setRecordTtl(100);
118 record.setAuthoritative(true);
119 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
120 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
121 record.getLocatorRecord().add(locator.build());
122 prepareMapping(record.build());
124 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
126 assertEquals(mapRequest.getNonce(), mapReply.getNonce());
127 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
128 assertEquals((byte) 32, eidToLocators.getMaskLength().byteValue());
129 assertEquals(v4Address, LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
130 assertEquals(record.isAuthoritative(), eidToLocators.isAuthoritative());
131 assertEquals(record.getAction(), eidToLocators.getAction());
132 assertEquals(record.getRecordTtl(), eidToLocators.getRecordTtl());
136 public void handleMapRequest__VerifyMask() throws Exception {
137 mapRequest = getDefaultMapRequestBuilder();
138 mapRequest.getEidRecord().add(
139 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
141 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
142 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.3.0")));
143 record.setMaskLength((short) 24);
145 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
146 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
147 record.getLocatorRecord().add(locator.build());
148 prepareMapping(record.build());
150 MapRequest mr = mapRequest.build();
152 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
154 assertEquals(mr.getNonce(), mapReply.getNonce());
155 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
156 assertEquals((byte) 32, eidToLocators.getMaskLength().byteValue());
157 assertEquals(v4Address, LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
161 public void handleMapRequest__VerifyMaskIPv6() throws Exception {
162 mapRequest = getDefaultMapRequestBuilder();
163 mapRequest.getEidRecord().add(
164 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
166 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
167 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:0")));
168 record.setMaskLength((short) 128);
170 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
171 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
172 record.getLocatorRecord().add(locator.build());
173 prepareMapping(record.build());
175 MapRequest mr = mapRequest.build();
177 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
179 assertEquals(mr.getNonce(), mapReply.getNonce());
180 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
181 assertEquals((byte) 128, eidToLocators.getMaskLength().byteValue());
182 assertEquals(v6Address, LispAFIConvertor.toAFI(eidToLocators.getLispAddressContainer()));
186 public void handleMapRequest__VerifyMaskIPv6NoMatch() throws Exception {
187 mapRequest = getDefaultMapRequestBuilder();
188 mapRequest.getEidRecord().add(
189 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
191 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
192 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:1:0:0:0:0:0:1")));
193 record.setMaskLength((short) 112);
195 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
196 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
197 record.getLocatorRecord().add(locator.build());
198 prepareMapping(record.build());
200 MapRequest mr = mapRequest.build();
202 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
203 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
204 assertEquals(0, eidToLocators.getLocatorRecord().size());
208 public void handleMapRequest_VerifyNativelyForwardAutherized() {
209 MapRequest mr = getDefaultMapRequest();
211 MappingServiceValue value = new MappingServiceValue();
212 value.setKey("pass");
213 Map<String, MappingServiceValue> result = new HashMap<String, MappingServiceValue>();
214 result.put("value", value);
216 MapReply mapReply = getNativelyForwardMapReply(mr, result);
218 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
219 assertEquals(1, eidToLocators.getRecordTtl().intValue());
220 assertEquals(Action.NativelyForward, eidToLocators.getAction());
223 private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, MappingServiceValue> result) {
224 allowing(lispDAO).get(MappingServiceKeyUtil.generateMappingServiceKey(LispAFIConvertor.toContainer(v4Address), 32));
226 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
230 private MapRequest getDefaultMapRequest() {
231 mapRequest = getDefaultMapRequestBuilder();
232 mapRequest.getEidRecord().add(
233 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
234 MapRequest mr = mapRequest.build();
239 public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
241 mapRequest = getDefaultMapRequestBuilder();
242 mapRequest.getEidRecord().add(
243 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
245 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
246 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.4.0")));
247 record.setMaskLength((short) 24);
249 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
250 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
251 record.getLocatorRecord().add(locator.build());
252 prepareMapping(record.build());
254 MapRequest mr = mapRequest.build();
256 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
258 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
259 assertEquals(0, eidToLocators.getLocatorRecord().size());
264 public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
266 mapRequest = getDefaultMapRequestBuilder();
267 mapRequest.getEidRecord().add(
268 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
270 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
271 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
273 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
274 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
275 record.getLocatorRecord().add(locator.build());
276 locator = getDefaultLocatorBuilder();
277 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1")));
278 record.getLocatorRecord().add(locator.build());
279 locator = getDefaultLocatorBuilder();
280 locator.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.8.2.7")));
281 record.getLocatorRecord().add(locator.build());
283 prepareMapping(record.build());
285 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
287 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
288 assertEquals(3, eidToLocators.getLocatorRecord().size());
290 assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
291 assertLocator(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1"), eidToLocators.getLocatorRecord().get(1));
292 assertLocator(LispAFIConvertor.asIPAfiAddress("1.8.2.7"), eidToLocators.getLocatorRecord().get(2));
296 public void handleMapRequest__MultipleEIDs() throws Exception {
298 mapRequest = getDefaultMapRequestBuilder();
299 mapRequest.getEidRecord().add(
300 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
301 mapRequest.getEidRecord().add(
302 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(LispAFIConvertor.toContainer(v6Address)).build());
304 EidToLocatorRecordBuilder record1 = getDefaultEidToLocatorBuilder();
305 record1.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
306 record1.setRecordTtl(100);
308 LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
309 locator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
310 record1.getLocatorRecord().add(locator1.build());
312 EidToLocatorRecordBuilder record2 = getDefaultEidToLocatorBuilder();
313 record2.setLispAddressContainer(LispAFIConvertor.toContainer(v6Address));
314 record2.setMaskLength((short) 128);
315 record2.setRecordTtl(100);
317 LocatorRecordBuilder locator2 = getDefaultLocatorBuilder();
318 locator2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1")));
319 record2.getLocatorRecord().add(locator2.build());
321 prepareMapping(record1.build(), record2.build());
323 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
325 EidToLocatorRecord eidToLocators1 = mapReply.getEidToLocatorRecord().get(0);
326 assertEquals(1, eidToLocators1.getLocatorRecord().size());
327 assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators1.getLocatorRecord().get(0));
329 EidToLocatorRecord eidToLocators2 = mapReply.getEidToLocatorRecord().get(1);
330 assertEquals(1, eidToLocators2.getLocatorRecord().size());
331 assertLocator(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:1"), eidToLocators2.getLocatorRecord().get(0));
334 private void assertLocator(LispAFIAddress expectedAddress, LocatorRecord locatorRecord) {
335 assertEquals(LispAFIConvertor.toContainer(expectedAddress), locatorRecord.getLispAddressContainer());
336 Assert.assertTrue(locatorRecord.isRouted());
339 private Map<String, MappingServiceValue> prepareMapping(EidToLocatorRecord... records) {
340 if (records.length > 0) {
341 for (EidToLocatorRecord eidToLocatorRecord : records) {
342 MappingServiceValue value = new MappingServiceValue();
343 Map<String, MappingServiceValue> result = new HashMap<String, MappingServiceValue>();
344 result.put("value", value);
345 List<MappingServiceRLOC> rlocs = new ArrayList<MappingServiceRLOC>();
346 for (LocatorRecord locator : eidToLocatorRecord.getLocatorRecord()) {
347 rlocs.add(new MappingServiceRLOC(locator, eidToLocatorRecord.getRecordTtl(), eidToLocatorRecord.getAction(), eidToLocatorRecord
348 .isAuthoritative()));
350 value.setRlocs(rlocs);
353 MappingServiceKeyUtil.generateMappingServiceKey(eidToLocatorRecord.getLispAddressContainer(),
354 (short) eidToLocatorRecord.getMaskLength()), result);
358 ValueSaverAction<IMappingServiceKey> daoGetSaverAction = new ValueSaverAction<IMappingServiceKey>() {
360 protected boolean validate(IMappingServiceKey value) {
365 public Object invoke(Invocation invocation) throws Throwable {
366 return daoResults.get(lastValue);
370 allowing(lispDAO).get(with(daoGetSaverAction));
371 will(daoGetSaverAction);
373 return daoResults.get(MappingServiceKeyUtil.generateMappingServiceKey(LispAFIConvertor.toContainer(v4Address)));
376 private MapRequestBuilder getDefaultMapRequestBuilder() {
377 MapRequestBuilder mrBuilder = new MapRequestBuilder();
378 mrBuilder.setAuthoritative(false);
379 mrBuilder.setEidRecord(new ArrayList<EidRecord>());
380 mrBuilder.setItrRloc(new ArrayList<ItrRloc>());
381 mrBuilder.setMapDataPresent(true);
382 mrBuilder.setNonce((long) 0);
383 mrBuilder.setPitr(false);
384 mrBuilder.setProbe(false);
385 mrBuilder.setSmr(false);
386 mrBuilder.setSmrInvoked(true);
387 mrBuilder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(
388 LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("127.0.0.1"))).build());
392 private EidToLocatorRecordBuilder getDefaultEidToLocatorBuilder() {
393 EidToLocatorRecordBuilder builder = new EidToLocatorRecordBuilder();
394 builder.setAction(Action.NoAction);
395 builder.setAuthoritative(false);
396 builder.setLocatorRecord(new ArrayList<LocatorRecord>());
397 builder.setMapVersion((short) 0);
398 builder.setMaskLength((short) 32);
399 builder.setRecordTtl(60);
403 private LocatorRecordBuilder getDefaultLocatorBuilder() {
404 LocatorRecordBuilder builder = new LocatorRecordBuilder();
405 builder.setLocalLocator(false);
406 builder.setMulticastPriority((short) 0);
407 builder.setMulticastWeight((short) 0);
408 builder.setPriority((short) 0);
409 builder.setRlocProbed(false);
410 builder.setRouted(true);
411 builder.setWeight((short) 0);