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.implementation.MappingService;
22 import org.opendaylight.lispflowmapping.implementation.MappingSystem;
23 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
24 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
25 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
26 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItem;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
38 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
42 public class MapResolverTest extends BaseTestCase {
44 // private MapResolver testedMapResolver;
45 private LispMappingService testedMapResolver;
47 private MappingService mapService;
48 private MapRequestBuilder mapRequest;
49 private Eid v4Address;
50 private Eid v6Address;
52 private HashMap<Eid, Map<String, MappingRecord>> daoResults;
56 public void before() throws Exception {
59 dao = context.mock(ILispDAO.class);
61 // map-cache init and table creation
62 allowing(dao).putTable(wany(String.class));will(returnValue(dao));
64 MappingSystem mapSystem = new MappingSystem(dao, true, true, true);
65 mapService = new MappingService();
66 mapService.setDaoService(dao);
67 inject(mapService, "mappingSystem", mapSystem);
69 testedMapResolver = new LispMappingService();
70 testedMapResolver.setMappingService(mapService);
71 testedMapResolver.basicInit();
73 mapRequest = new MapRequestBuilder();
74 v4Address = LispAddressUtil.asIpv4PrefixEid("1.2.3.4/32");
75 v6Address = LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:1/128");
76 daoResults = new HashMap<Eid, Map<String, MappingRecord>>();
80 public void handleMapRequest__ReplyWithSingleLocator() throws Exception {
81 mapRequest = getDefaultMapRequestBuilder();
82 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
84 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
85 record.setEid(v4Address);
87 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
88 locator.setLocalLocator(false);
89 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
90 locator.setRouted(true);
91 locator.setMulticastPriority((short) 5);
92 locator.setWeight((short) 17);
93 locator.setPriority((short) 16);
94 record.getLocatorRecord().add(locator.build());
95 prepareMapping(record.build());
97 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
99 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
100 assertEquals(1, eidToLocators.getLocatorRecord().size());
101 LocatorRecord resultLocator = mapReply.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0);
102 assertEquals(locator.isLocalLocator(), resultLocator.isLocalLocator());
103 assertEquals(locator.isRouted(), resultLocator.isRouted());
104 assertEquals(locator.getMulticastPriority(), resultLocator.getMulticastPriority());
105 assertEquals(locator.getMulticastWeight(), resultLocator.getMulticastWeight());
106 assertEquals(locator.getPriority(), resultLocator.getPriority());
107 assertEquals(locator.getWeight(), resultLocator.getWeight());
109 assertLocator(LispAddressUtil.asIpv4Rloc("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
113 public void handleMapRequest__VerifyBasicFields() throws Exception {
114 mapRequest = getDefaultMapRequestBuilder();
115 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
117 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
118 record.setEid(v4Address);
119 record.setRecordTtl(100);
121 record.setAuthoritative(true);
122 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
123 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
124 record.getLocatorRecord().add(locator.build());
125 prepareMapping(record.build());
127 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
129 assertEquals(mapRequest.getNonce(), mapReply.getNonce());
130 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
131 assertEquals(v4Address, eidToLocators.getEid());
132 assertEquals(record.isAuthoritative(), eidToLocators.isAuthoritative());
133 assertEquals(record.getAction(), eidToLocators.getAction());
134 assertEquals(record.getRecordTtl(), eidToLocators.getRecordTtl());
138 public void handleMapRequest__VerifyMask() throws Exception {
139 mapRequest = getDefaultMapRequestBuilder();
140 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
142 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
143 record.setEid(LispAddressUtil.asIpv4PrefixEid("1.2.3.0/24"));
145 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
146 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
147 record.getLocatorRecord().add(locator.build());
148 prepareMapping(record.build());
150 MapRequest mr = mapRequest.build();
151 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
153 assertEquals(mr.getNonce(), mapReply.getNonce());
154 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
155 assertEquals(LispAddressUtil.asIpv4PrefixEid("1.2.3.0/24"), eidToLocators.getEid());
159 public void handleMapRequest__VerifyMaskIPv6() throws Exception {
160 mapRequest = getDefaultMapRequestBuilder();
161 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
163 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
164 record.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:0/128"));
166 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
167 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
168 record.getLocatorRecord().add(locator.build());
169 prepareMapping(record.build());
171 MapRequest mr = mapRequest.build();
173 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
175 assertEquals(mr.getNonce(), mapReply.getNonce());
176 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
177 assertEquals(v6Address, eidToLocators.getEid());
181 public void handleMapRequest__VerifyMaskIPv6NoMatch() throws Exception {
182 mapRequest = getDefaultMapRequestBuilder();
183 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
185 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
186 record.setEid(LispAddressUtil.asIpv6PrefixEid("0:1:0:0:0:0:0:1/112"));
188 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
189 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
190 record.getLocatorRecord().add(locator.build());
191 prepareMapping(record.build());
193 MapRequest mr = mapRequest.build();
195 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
196 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
197 assertEquals(null, eidToLocators.getLocatorRecord());
201 public void handleMapRequest_VerifyNativelyForwardAuthorized() {
202 MapRequest mr = getDefaultMapRequest();
204 Map<String, MappingRecord> result = new HashMap<String, MappingRecord>();
205 result.put(SubKeys.RECORD, null);
207 MapReply mapReply = getNativelyForwardMapReply(mr, result);
209 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
210 assertEquals(1, eidToLocators.getRecordTtl().intValue());
211 assertEquals(Action.NativelyForward, eidToLocators.getAction());
214 private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, MappingRecord> result) {
215 allowing(dao).get(wany(Eid.class));
217 allowing(dao).getSpecific(wany(Eid.class), with(SubKeys.AUTH_KEY));
219 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
223 private MapRequest getDefaultMapRequest() {
224 mapRequest = getDefaultMapRequestBuilder();
225 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
226 MapRequest mr = mapRequest.build();
231 public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
232 mapRequest = getDefaultMapRequestBuilder();
233 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
235 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
236 record.setEid(LispAddressUtil.asIpv4PrefixEid("1.2.4.0/24"));
238 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
239 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
240 record.getLocatorRecord().add(locator.build());
241 prepareMapping(record.build());
243 MapRequest mr = mapRequest.build();
245 MapReply mapReply = testedMapResolver.handleMapRequest(mr);
247 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
248 assertEquals(null, eidToLocators.getLocatorRecord());
252 public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
254 mapRequest = getDefaultMapRequestBuilder();
255 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
257 MappingRecordBuilder record = getDefaultMappingRecordBuilder();
258 record.setEid(v4Address);
260 LocatorRecordBuilder locator = getDefaultLocatorBuilder();
261 locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
262 record.getLocatorRecord().add(locator.build());
263 locator = getDefaultLocatorBuilder();
264 locator.setRloc(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1"));
265 record.getLocatorRecord().add(locator.build());
266 locator = getDefaultLocatorBuilder();
267 locator.setRloc(LispAddressUtil.asIpv4Rloc("1.8.2.7"));
268 record.getLocatorRecord().add(locator.build());
270 prepareMapping(record.build());
272 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
274 MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
275 assertEquals(3, eidToLocators.getLocatorRecord().size());
277 assertLocator(LispAddressUtil.asIpv4Rloc("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
278 assertLocator(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1"), eidToLocators.getLocatorRecord().get(1));
279 assertLocator(LispAddressUtil.asIpv4Rloc("1.8.2.7"), eidToLocators.getLocatorRecord().get(2));
283 public void handleMapRequest__MultipleEIDs() throws Exception {
285 mapRequest = getDefaultMapRequestBuilder();
286 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
287 mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
289 MappingRecordBuilder record1 = getDefaultMappingRecordBuilder();
290 record1.setEid(v4Address);
291 record1.setRecordTtl(100);
293 LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
294 locator1.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
295 record1.getLocatorRecord().add(locator1.build());
297 MappingRecordBuilder record2 = getDefaultMappingRecordBuilder();
298 record2.setEid(v6Address);
299 record2.setRecordTtl(100);
301 LocatorRecordBuilder locator2 = getDefaultLocatorBuilder();
302 locator2.setRloc(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1"));
303 record2.getLocatorRecord().add(locator2.build());
305 prepareMapping(record1.build(), record2.build());
307 MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
309 MappingRecord eidToLocators1 = mapReply.getMappingRecordItem().get(0).getMappingRecord();
310 assertEquals(1, eidToLocators1.getLocatorRecord().size());
311 assertLocator(LispAddressUtil.asIpv4Rloc("4.3.2.1"), eidToLocators1.getLocatorRecord().get(0));
313 MappingRecord eidToLocators2 = mapReply.getMappingRecordItem().get(1).getMappingRecord();
314 assertEquals(1, eidToLocators2.getLocatorRecord().size());
315 assertLocator(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1"), eidToLocators2.getLocatorRecord().get(0));
318 private void assertLocator(Rloc expectedAddress, LocatorRecord locatorRecord) {
319 assertEquals(expectedAddress, locatorRecord.getRloc());
320 Assert.assertTrue(locatorRecord.isRouted());
323 private Map<String, MappingRecord> prepareMapping(MappingRecord... records) {
324 if (records.length > 0) {
325 for (MappingRecord eidToLocatorRecord : records) {
326 Map<String, MappingRecord> result = new HashMap<String, MappingRecord>();
327 result.put(SubKeys.RECORD, eidToLocatorRecord);
329 daoResults.put(eidToLocatorRecord.getEid(), result);
333 ValueSaverAction<Eid> daoGetSaverAction = new ValueSaverAction<Eid>() {
335 protected boolean validate(Eid value) {
340 public Object invoke(Invocation invocation) throws Throwable {
341 return daoResults.get(lastValue);
345 allowing(dao).get(with(daoGetSaverAction));
346 will(daoGetSaverAction);
347 allowing(dao).getSpecific(wany(Eid.class), with(SubKeys.AUTH_KEY));
349 return daoResults.get(v4Address);
352 private MapRequestBuilder getDefaultMapRequestBuilder() {
353 MapRequestBuilder mrBuilder = new MapRequestBuilder();
354 mrBuilder.setAuthoritative(false);
355 mrBuilder.setEidItem(new ArrayList<EidItem>());
356 mrBuilder.setItrRloc(new ArrayList<ItrRloc>());
357 mrBuilder.setMapDataPresent(true);
358 mrBuilder.setNonce((long) 0);
359 mrBuilder.setPitr(false);
360 mrBuilder.setProbe(false);
361 mrBuilder.setSmr(false);
362 mrBuilder.setSmrInvoked(true);
363 mrBuilder.setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid("127.0.0.1")).build());
367 private MappingRecordBuilder getDefaultMappingRecordBuilder() {
368 MappingRecordBuilder builder = new MappingRecordBuilder();
369 builder.setAction(Action.NoAction);
370 builder.setAuthoritative(false);
371 builder.setLocatorRecord(new ArrayList<LocatorRecord>());
372 builder.setMapVersion((short) 0);
373 builder.setRecordTtl(60);
377 private LocatorRecordBuilder getDefaultLocatorBuilder() {
378 LocatorRecordBuilder builder = new LocatorRecordBuilder();
379 builder.setLocalLocator(false);
380 builder.setMulticastPriority((short) 0);
381 builder.setMulticastWeight((short) 0);
382 builder.setPriority((short) 0);
383 builder.setRlocProbed(false);
384 builder.setRouted(true);
385 builder.setWeight((short) 0);