2 * Copyright (c) 2016 Cisco Systems, 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 java.util.ArrayList;
11 import java.util.List;
13 import org.junit.Before;
14 import org.junit.Test;
15 import org.mockito.Mockito;
16 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
17 import org.opendaylight.lispflowmapping.implementation.MappingService;
18 import org.opendaylight.lispflowmapping.implementation.config.ConfigIni;
19 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
20 import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
21 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
22 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list
26 .MappingRecordItemBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordKey;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container
33 .MappingRecordBuilder;
34 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
35 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
36 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
37 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocKey;
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;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container
43 .MappingAuthkeyBuilder;
45 public class MapResolverTest {
47 private static MapResolver mapResolver;
48 private static MappingService mapServiceMock;
49 private static Set<SubscriberRLOC> subscriberSetMock;
50 private static LispMappingService lispMappingServiceMock;
52 private static final String ITR_RLOC_KEY_STRING = "itr_rloc_key";
53 private static final String ITR_RLOC_ID_STRING = "itr_rloc_id";
54 private static final String IPV4_STRING_1 = "1.2.3.0";
55 private static final String IPV4_STRING_2 = "1.2.4.0";
56 private static final String IPV4_RLOC_STRING_1 = "100.100.100.100";
57 private static final String IPV4_SOURCE = "127.0.0.1";
58 private static final String IPV4_PREFIX_STRING = "/24";
59 private static final String IPV6_STRING = "0:0:0:0:0:0:0:1";
60 private static final String IPV6_PREFIX_STRING = "/128";
62 private static final LocatorRecordKey LOCATOR_RECORD_KEY = new LocatorRecordKey("key");
63 private static final int TTL_RLOC_TIMED_OUT = 1;
65 private static final IpAddress IPV4_ADDRESS_1 = new IpAddress(new Ipv4Address(IPV4_STRING_1));
66 private static final IpAddress IPV4_ADDRESS_2 = new IpAddress(new Ipv4Address(IPV4_STRING_2));
68 private static final Eid IPV4_PREFIX_EID_1 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_1 + IPV4_PREFIX_STRING);
69 private static final Eid IPV4_PREFIX_EID_2 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_2 + IPV4_PREFIX_STRING);
70 private static final Eid IPV6_PREFIX_EID = LispAddressUtil.asIpv6PrefixEid(IPV6_STRING + IPV6_PREFIX_STRING);
71 private static final Eid SOURCE_DEST_KEY_EID = LispAddressUtil.asSrcDstEid(IPV4_SOURCE, IPV4_STRING_2, 24, 24, 0);
73 private static final Rloc RLOC_1 = LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1);
74 private static MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
75 private static final SubscriberRLOC SUBSCRIBER_RLOC_1 = new SubscriberRLOC(RLOC_1,
76 LispAddressUtil.asIpv4Eid(IPV4_SOURCE));
79 @SuppressWarnings("unchecked")
80 public void init() throws Exception {
81 mapServiceMock = Mockito.mock(MappingService.class, "mapService");
82 subscriberSetMock = Mockito.mock(Set.class);
83 lispMappingServiceMock = Mockito.mock(LispMappingService.class, "requestHandler");
84 mapResolver = new MapResolver(mapServiceMock, true, ConfigIni.getInstance().getElpPolicy(),
85 lispMappingServiceMock);
86 mapRequestBuilder = getDefaultMapRequestBuilder();
90 * Tests {@link MapResolver#handleMapRequest} method.
93 public void handleMapRequest__withSingleLocator() {
95 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
96 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
97 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
99 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
100 .thenReturn(mappingRecordBuilder.build());
103 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
104 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
105 .setMappingRecord(mappingRecordBuilder.build()).build());
107 mapResolver.handleMapRequest(mapRequestBuilder.build());
108 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
112 * Tests {@link MapResolver#handleMapRequest} method.
115 public void handleMapRequest__withNoMapping() {
116 final MappingRecordBuilder mappingRecordBuilder = new MappingRecordBuilder()
117 .setAuthoritative(false)
118 .setMapVersion((short) 0)
119 .setEid(IPV4_PREFIX_EID_1)
120 .setAction(MappingRecord.Action.NativelyForward)
121 .setRecordTtl(TTL_RLOC_TIMED_OUT);
124 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
126 Mockito.when(mapServiceMock.getAuthenticationKey(IPV4_PREFIX_EID_1))
127 .thenReturn(new MappingAuthkeyBuilder().build());
128 Mockito.when(mapServiceMock.getWidestNegativePrefix(IPV4_PREFIX_EID_1)).thenReturn(IPV4_PREFIX_EID_1);
131 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
132 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
133 .setMappingRecord(mappingRecordBuilder.build()).build());
135 mapResolver.handleMapRequest(mapRequestBuilder.build());
136 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
140 * Tests {@link MapResolver#handleMapRequest} method.
143 public void handleMapRequest__withSubscribers() {
145 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
146 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
147 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
149 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
150 .thenReturn(mappingRecordBuilder.build());
151 Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
152 .thenReturn(subscriberSetMock);
153 Mockito.when(subscriberSetMock.contains(Mockito.any(SubscriberRLOC.class))).thenReturn(false);
156 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
157 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
158 .setMappingRecord(mappingRecordBuilder.build()).build());
160 mapResolver.handleMapRequest(mapRequestBuilder.build());
161 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
162 Mockito.verify(subscriberSetMock, Mockito.never()).remove(Mockito.any(SubscriberRLOC.class));
166 * Tests {@link MapResolver#handleMapRequest} method.
169 public void handleMapRequest__withSubscribersToRemove() {
171 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
172 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
173 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
175 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
176 .thenReturn(mappingRecordBuilder.build());
177 Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
178 .thenReturn(subscriberSetMock);
179 Mockito.when(subscriberSetMock.contains(new SubscriberRLOC(
180 mapRequestBuilder.getItrRloc().get(0).getRloc(),
181 mapRequestBuilder.getSourceEid().getEid())))
185 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
186 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
187 .setMappingRecord(mappingRecordBuilder.build()).build());
189 // check if a subscriber is re-instantiating when there already is one in the subscriber set
190 mapResolver.handleMapRequest(mapRequestBuilder.build());
191 Mockito.verify(subscriberSetMock).remove(SUBSCRIBER_RLOC_1);
192 Mockito.verify(subscriberSetMock).add(SUBSCRIBER_RLOC_1);
193 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
194 Mockito.verify(mapServiceMock).addData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1,
195 SubKeys.SUBSCRIBERS, subscriberSetMock);
197 // verify that itrRloc is subscribed to dst address
198 mappingRecordBuilder.setEid(SOURCE_DEST_KEY_EID);
199 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV4_PREFIX_EID_2).build());
200 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_2))
201 .thenReturn(mappingRecordBuilder.build());
203 mapResolver.handleMapRequest(mapRequestBuilder.build());
204 Mockito.verify(mapServiceMock).getData(MappingOrigin.Southbound,
205 SourceDestKeyHelper.getDstBinary(SOURCE_DEST_KEY_EID), SubKeys.SUBSCRIBERS);
209 * Tests {@link MapResolver#handleMapRequest} method.
212 public void handleMapRequest_withBothPolicy() {
213 mapResolver = new MapResolver(mapServiceMock, true, "both", lispMappingServiceMock);
215 final List<IpAddress> ipAddressList = new ArrayList<>();
216 ipAddressList.add(IPV4_ADDRESS_1); // hop 1
217 ipAddressList.add(IPV4_ADDRESS_2); // hop 2
219 final Rloc rloc = LispAddressUtil.asTeLcafRloc(ipAddressList);
220 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
221 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder().setRloc(rloc);
224 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
225 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build());
226 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build());
228 final MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
229 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_1))
231 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2))
234 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
235 .thenReturn(mappingRecordBuilder.build());
238 final LocatorRecordBuilder locatorRecordBuilder_3 = getDefaultLocatorBuilder()
239 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2)).setPriority((short) 1); // priority increased by 1
240 final MappingRecordBuilder resultMappingRecordBuilder = getDefaultMappingRecordBuilder();
242 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build()); // as Ipv4
243 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build()); // as ELP
244 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_3.build()); // added to the result
246 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
247 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
248 .setMappingRecord(resultMappingRecordBuilder.build()).build());
251 mapResolver.handleMapRequest(mapRequestBuilder.build());
252 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
256 * Tests {@link MapResolver#handleMapRequest} method.
259 public void handleMapRequest_withReplacePolicy() {
260 mapResolver = new MapResolver(mapServiceMock, true, "replace", lispMappingServiceMock);
262 final List<IpAddress> ipAddressList = new ArrayList<>();
263 ipAddressList.add(IPV4_ADDRESS_1); // hop 1
264 ipAddressList.add(IPV4_ADDRESS_2); // hop 2
266 final Rloc rloc = LispAddressUtil.asTeLcafRloc(ipAddressList);
267 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
268 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder().setRloc(rloc);
271 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
272 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build());
273 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build());
275 final MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
276 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_1))
278 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2))
281 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
282 .thenReturn(mappingRecordBuilder.build());
285 final LocatorRecordBuilder locatorRecordBuilder_3 = getDefaultLocatorBuilder()
286 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2));
287 final MappingRecordBuilder resultMappingRecordBuilder = getDefaultMappingRecordBuilder();
289 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build()); // as Ipv4
290 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_3.build()); // added to the result
292 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
293 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
294 .setMappingRecord(resultMappingRecordBuilder.build()).build());
297 mapResolver.handleMapRequest(mapRequestBuilder.build());
298 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
302 * Tests {@link MapResolver#handleMapRequest} method.
305 public void handleMapRequest_withMultipleEids() {
306 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV6_PREFIX_EID).build());
308 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
309 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder();
310 locatorRecordBuilder_2.setRloc(LispAddressUtil.asIpv6Rloc(IPV6_STRING));
313 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder();
314 mappingRecordBuilder_1.getLocatorRecord().add(locatorRecordBuilder_1.build());
315 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
316 mappingRecordBuilder_2.getLocatorRecord().add(locatorRecordBuilder_2.build());
317 mappingRecordBuilder_2.setEid(IPV6_PREFIX_EID);
319 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(),
320 mapRequestBuilder.getEidItem().get(0).getEid())).thenReturn(mappingRecordBuilder_1.build());
321 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(),
322 mapRequestBuilder.getEidItem().get(1).getEid())).thenReturn(mappingRecordBuilder_2.build());
325 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
326 mapReplyBuilder.getMappingRecordItem()
327 .add(new MappingRecordItemBuilder().setMappingRecord(mappingRecordBuilder_1.build()).build());
328 mapReplyBuilder.getMappingRecordItem()
329 .add(new MappingRecordItemBuilder().setMappingRecord(mappingRecordBuilder_2.build()).build());
331 mapResolver.handleMapRequest(mapRequestBuilder.build());
332 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
335 private static List<ItrRloc> getDefaultItrRlocList() {
336 final List<ItrRloc> itrRlocList = new ArrayList<>();
337 final ItrRloc itrRloc = new ItrRlocBuilder()
338 .setKey(new ItrRlocKey(ITR_RLOC_KEY_STRING))
339 .setItrRlocId(ITR_RLOC_ID_STRING)
340 .setRloc(RLOC_1).build();
341 itrRlocList.add(itrRloc);
346 private static MapRequestBuilder getDefaultMapRequestBuilder() {
347 MapRequestBuilder mrBuilder = new MapRequestBuilder()
348 .setAuthoritative(false)
349 .setEidItem(new ArrayList<>())
350 .setItrRloc(new ArrayList<>())
351 .setMapDataPresent(true)
357 .setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(IPV4_SOURCE)).build())
358 .setItrRloc(getDefaultItrRlocList());
360 mrBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV4_PREFIX_EID_1).build());
365 private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
366 return new MappingRecordBuilder()
367 .setAction(MappingRecord.Action.NoAction)
368 .setAuthoritative(false)
369 .setLocatorRecord(new ArrayList<>())
370 .setMapVersion((short) 0)
372 .setEid(IPV4_PREFIX_EID_1);
375 private static LocatorRecordBuilder getDefaultLocatorBuilder() {
376 return new LocatorRecordBuilder()
377 .setLocalLocator(false)
378 .setMulticastPriority((short) 0)
379 .setMulticastWeight((short) 0)
380 .setPriority((short) 0)
381 .setRlocProbed(false)
383 .setWeight((short) 0)
384 .setKey(LOCATOR_RECORD_KEY)
385 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1));
388 private static MapReplyBuilder getDefaultMapReplyBuilder() {
389 return new MapReplyBuilder()
390 .setEchoNonceEnabled(false)
392 .setSecurityEnabled(false)
393 .setNonce(mapRequestBuilder.getNonce())
394 .setMappingRecordItem(new ArrayList<>());