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;
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;
39 public class MapResolverTest extends BaseTestCase {
41 // private MapResolver testedMapResolver;
42 private LispMappingService testedMapResolver;
44 private ILispDAO lispDAO;
45 private MapRequestBuilder mapRequest;
46 private LispAddressContainer v4Address;
47 private LispAddressContainer v6Address;
49 private HashMap<LispAddressContainer, Map<String, EidToLocatorRecord>> daoResults;
53 public void before() throws Exception {
55 lispDAO = context.mock(ILispDAO.class);
56 testedMapResolver = new LispMappingService();
57 testedMapResolver.basicInit(lispDAO);
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>>();
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());
72 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
73 record.setLispAddressContainer(v4Address);
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());
85 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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());
97 assertLocator(LispAFIConvertor.asIPv4Address("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
101 public void handleMapRequest__VerifyBasicFields() throws Exception {
102 mapRequest = getDefaultMapRequestBuilder();
103 mapRequest.getEidRecord().add(
104 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(v4Address).build());
106 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
107 record.setLispAddressContainer(v4Address);
108 record.setRecordTtl(100);
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());
116 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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());
128 public void handleMapRequest__VerifyMask() throws Exception {
129 mapRequest = getDefaultMapRequestBuilder();
130 mapRequest.getEidRecord().add(
131 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(v4Address).build());
133 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
134 record.setLispAddressContainer(LispAFIConvertor.asIPv4Prefix("1.2.3.0", 24));
135 record.setMaskLength((short) 24);
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());
142 MapRequest mr = mapRequest.build();
143 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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());
152 public void handleMapRequest__VerifyMaskIPv6() throws Exception {
153 mapRequest = getDefaultMapRequestBuilder();
154 mapRequest.getEidRecord().add(
155 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(v6Address).build());
157 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
158 record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress("0:0:0:0:0:0:0:0")));
159 record.setMaskLength((short) 128);
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());
166 MapRequest mr = mapRequest.build();
168 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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());
177 public void handleMapRequest__VerifyMaskIPv6NoMatch() throws Exception {
178 mapRequest = getDefaultMapRequestBuilder();
179 mapRequest.getEidRecord().add(
180 new EidRecordBuilder().setMask((short) 128).setLispAddressContainer(v6Address).build());
182 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
183 record.setLispAddressContainer(LispAFIConvertor.asIPv6Prefix("0:1:0:0:0:0:0:1", 112));
184 record.setMaskLength((short) 112);
186 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
187 locator.setLispAddressContainer(LispAFIConvertor.asIPv4Address("4.3.2.1"));
188 record.getLocatorRecord().add(locator.build());
189 prepareMapping(record.build());
191 MapRequest mr = mapRequest.build();
193 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
194 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
195 assertEquals(null, eidToLocators.getLocatorRecord());
199 public void handleMapRequest_VerifyNativelyForwardAutherized() {
200 MapRequest mr = getDefaultMapRequest();
202 Map<String, EidToLocatorRecord> result = new HashMap<String, EidToLocatorRecord>();
203 result.put(SubKeys.RECORD, null);
205 MapReply mapReply = getNativelyForwardMapReply(mr, result);
207 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
208 assertEquals(1, eidToLocators.getRecordTtl().intValue());
209 assertEquals(Action.NativelyForward, eidToLocators.getAction());
212 private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, EidToLocatorRecord> result) {
213 allowing(lispDAO).get(wany(LispAddressContainer.class));
215 allowing(lispDAO).getSpecific(wany(LispAddressContainer.class), with(SubKeys.PASSWORD));
217 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
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();
230 public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
232 mapRequest = getDefaultMapRequestBuilder();
233 mapRequest.getEidRecord().add(
234 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(v4Address).build());
236 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
237 record.setLispAddressContainer(LispAFIConvertor.asIPv4Prefix("1.2.4.0", 24));
238 record.setMaskLength((short) 24);
240 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
241 locator.setLispAddressContainer(LispAFIConvertor.asIPv4Address("4.3.2.1"));
242 record.getLocatorRecord().add(locator.build());
243 prepareMapping(record.build());
245 MapRequest mr = mapRequest.build();
247 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
249 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
250 assertEquals(null, eidToLocators.getLocatorRecord());
254 public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
256 mapRequest = getDefaultMapRequestBuilder();
257 mapRequest.getEidRecord().add(
258 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(v4Address).build());
260 EidToLocatorRecordBuilder record = getDefaultEidToLocatorBuilder();
261 record.setLispAddressContainer(v4Address);
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());
273 prepareMapping(record.build());
275 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
277 EidToLocatorRecord eidToLocators = mapReply.getEidToLocatorRecord().get(0);
278 assertEquals(3, eidToLocators.getLocatorRecord().size());
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));
286 public void handleMapRequest__MultipleEIDs() throws Exception {
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());
294 EidToLocatorRecordBuilder record1 = getDefaultEidToLocatorBuilder();
295 record1.setLispAddressContainer(v4Address);
296 record1.setRecordTtl(100);
298 LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
299 locator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
300 record1.getLocatorRecord().add(locator1.build());
302 EidToLocatorRecordBuilder record2 = getDefaultEidToLocatorBuilder();
303 record2.setLispAddressContainer(v6Address);
304 record2.setMaskLength((short) 128);
305 record2.setRecordTtl(100);
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());
311 prepareMapping(record1.build(), record2.build());
313 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
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));
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));
326 private void assertLocator(LispAddressContainer expectedAddress, LocatorRecord locatorRecord) {
327 assertEquals(expectedAddress, locatorRecord.getLispAddressContainer());
328 Assert.assertTrue(locatorRecord.isRouted());
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);
337 daoResults.put(eidToLocatorRecord.getLispAddressContainer(), result);
341 ValueSaverAction<LispAddressContainer> daoGetSaverAction = new ValueSaverAction<LispAddressContainer>() {
343 protected boolean validate(LispAddressContainer value) {
348 public Object invoke(Invocation invocation) throws Throwable {
349 return daoResults.get(lastValue);
353 allowing(lispDAO).get(with(daoGetSaverAction));
354 will(daoGetSaverAction);
355 allowing(lispDAO).getSpecific(wany(LispAddressContainer.class), with(SubKeys.PASSWORD));
357 return daoResults.get(v4Address);
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());
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);
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);