2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
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
8 package org.opendaylight.lispflowmapping.implementation.lisp;
10 import static org.junit.Assert.assertEquals;
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.List;
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;
42 public class MapResolverTest extends BaseTestCase {
44 // private MapResolver testedMapResolver;
45 private LispMappingService testedMapResolver;
47 private ILispDAO lispDAO;
48 private MapRequestBuilder mapRequest;
49 private LispAFIAddress v4Address;
50 private LispAFIAddress v6Address;
52 private HashMap<IMappingServiceKey, Map<String, MappingServiceRLOCGroup>> daoResults;
56 public void before() throws Exception {
58 lispDAO = context.mock(ILispDAO.class);
59 testedMapResolver = new LispMappingService();
60 testedMapResolver.basicInit(lispDAO);
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>>();
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());
75 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
76 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
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());
88 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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());
100 assertLocator(LispAFIConvertor.asIPAfiAddress("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
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());
109 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
110 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
111 record.setRecordTtl(100);
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());
119 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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());
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());
136 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
137 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.3.0")));
138 record.setMaskLength((short) 24);
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());
145 MapRequest mr = mapRequest.build();
147 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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()));
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());
161 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
162 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:0")));
163 record.setMaskLength((short) 128);
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());
170 MapRequest mr = mapRequest.build();
172 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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()));
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());
186 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
187 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:1:0:0:0:0:0:1")));
188 record.setMaskLength((short) 112);
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());
195 MapRequest mr = mapRequest.build();
197 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
198 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
199 assertEquals(0, eidToLocators.getLocatorRecord().size());
203 public void handleMapRequest_VerifyNativelyForwardAutherized() {
204 MapRequest mr = getDefaultMapRequest();
206 Map<String, List<MappingServiceRLOCGroup>> result = new HashMap<String, List<MappingServiceRLOCGroup>>();
207 result.put(AbstractLispComponent.ADDRESS_SUBKEY, new ArrayList<MappingServiceRLOCGroup>());
209 MapReply mapReply = getNativelyForwardMapReply(mr, result);
211 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
212 assertEquals(1, eidToLocators.getRecordTtl().intValue());
213 assertEquals(Action.NativelyForward, eidToLocators.getAction());
216 private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, List<MappingServiceRLOCGroup>> result) {
217 allowing(lispDAO).get(wany(IMappingServiceKey.class));
219 allowing(lispDAO).getSpecific(wany(IMappingServiceKey.class), with(AbstractLispComponent.PASSWORD_SUBKEY));
221 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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();
234 public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
236 mapRequest = getDefaultMapRequestBuilder();
237 mapRequest.getEidRecord().add(
238 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
240 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
241 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("1.2.4.0")));
242 record.setMaskLength((short) 24);
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());
249 MapRequest mr = mapRequest.build();
251 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
253 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
254 assertEquals(0, eidToLocators.getLocatorRecord().size());
259 public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
261 mapRequest = getDefaultMapRequestBuilder();
262 mapRequest.getEidRecord().add(
263 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(v4Address)).build());
265 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
266 record.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
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());
278 prepareMapping(record.build());
280 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
282 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
283 assertEquals(3, eidToLocators.getLocatorRecord().size());
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));
291 public void handleMapRequest__MultipleEIDs() throws Exception {
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());
299 EidToLocatorRecordBuilder record1 = getDefaultEidToLocatorBuilder();
300 record1.setLispAddressContainer(LispAFIConvertor.toContainer(v4Address));
301 record1.setRecordTtl(100);
303 LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
304 locator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
305 record1.getLocatorRecord().add(locator1.build());
307 EidToLocatorRecordBuilder record2 = getDefaultEidToLocatorBuilder();
308 record2.setLispAddressContainer(LispAFIConvertor.toContainer(v6Address));
309 record2.setMaskLength((short) 128);
310 record2.setRecordTtl(100);
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());
316 prepareMapping(record1.build(), record2.build());
318 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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));
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));
329 private void assertLocator(LispAFIAddress expectedAddress, LocatorRecord locatorRecord) {
330 assertEquals(LispAFIConvertor.toContainer(expectedAddress), locatorRecord.getLispAddressContainer());
331 Assert.assertTrue(locatorRecord.isRouted());
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);
343 result.put(AbstractLispComponent.ADDRESS_SUBKEY, rlocs);
346 MappingServiceKeyUtil.generateMappingServiceKey(eidToLocatorRecord.getLispAddressContainer(),
347 (short) eidToLocatorRecord.getMaskLength()), result);
351 ValueSaverAction<IMappingServiceKey> daoGetSaverAction = new ValueSaverAction<IMappingServiceKey>() {
353 protected boolean validate(IMappingServiceKey value) {
358 public Object invoke(Invocation invocation) throws Throwable {
359 return daoResults.get(lastValue);
363 allowing(lispDAO).get(with(daoGetSaverAction));
364 will(daoGetSaverAction);
365 allowing(lispDAO).getSpecific(wany(IMappingServiceKey.class), with(AbstractLispComponent.PASSWORD_SUBKEY));
367 return daoResults.get(MappingServiceKeyUtil.generateMappingServiceKey(LispAFIConvertor.toContainer(v4Address)));
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());
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);
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);