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 static org.junit.Assert.assertEquals;
12 import com.google.common.collect.Lists;
13 import java.util.ArrayList;
14 import java.util.List;
16 import org.junit.Before;
17 import org.junit.Test;
18 import org.mockito.ArgumentCaptor;
19 import org.mockito.Mockito;
20 import org.opendaylight.lispflowmapping.config.ConfigIni;
21 import org.opendaylight.lispflowmapping.implementation.LispMappingService;
22 import org.opendaylight.lispflowmapping.implementation.MappingService;
23 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
24 import org.opendaylight.lispflowmapping.interfaces.dao.Subscriber;
25 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
26 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
27 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
28 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
29 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
30 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv6Address;
31 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv4Afi;
32 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.Ipv6Afi;
33 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.LispAddressFamily;
34 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.MacAfi;
35 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.NoAddressAfi;
36 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.Address;
37 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Builder;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6Builder;
39 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Mac;
40 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.MacBuilder;
41 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.NoAddress;
42 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv6AddressBinary;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.Ipv4BinaryAfi;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRequest;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.list.EidItemBuilder;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordKey;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRloc;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocBuilder;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.ItrRlocKey;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequest.SourceEidBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequestBuilder;
62 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
63 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.RlocBuilder;
64 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
66 public class MapResolverTest {
68 private static MapResolver mapResolver;
69 private static MappingService mapServiceMock;
70 private static Set<Subscriber> subscriberSetMock;
71 private static LispMappingService lispMappingServiceMock;
73 private static final String ITR_RLOC_KEY_STRING = "itr_rloc_key";
74 private static final String ITR_RLOC_ID_STRING = "itr_rloc_id";
75 private static final String IPV4_STRING_1 = "1.2.3.0";
76 private static final String IPV4_STRING_2 = "1.2.4.0";
77 private static final String IPV4_RLOC_STRING_1 = "100.100.100.100";
78 private static final String IPV4_SOURCE = "127.0.0.1";
79 private static final String IPV4_PREFIX_STRING = "/24";
80 private static final String IPV6_STRING = "0:0:0:0:0:0:0:1";
81 private static final String IPV6_PREFIX_STRING = "/128";
83 private static final byte[] IPV4_BINARY_BYTES_1 = new byte[]{1, 2, 3, 0};
84 private static final byte[] IPV4_BINARY_BYTES_2 = new byte[]{1, 2, 5, 0};
85 private static final byte[] IPV6_BINARY_BYTES_1 = new byte[]{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
87 private static final LocatorRecordKey LOCATOR_RECORD_KEY = new LocatorRecordKey("key");
88 private static final int TTL_RLOC_TIMED_OUT = 1;
90 private static final IpAddress IPV4_ADDRESS_1 = new IpAddress(new Ipv4Address(IPV4_STRING_1));
91 private static final IpAddress IPV4_ADDRESS_2 = new IpAddress(new Ipv4Address(IPV4_STRING_2));
93 private static final IpAddressBinary IPV4_ADDRESS_BINARY_1 =
94 new IpAddressBinary(new Ipv4AddressBinary(IPV4_BINARY_BYTES_1));
95 private static final IpAddressBinary IPV4_ADDRESS_BINARY_2 =
96 new IpAddressBinary(new Ipv4AddressBinary(IPV4_BINARY_BYTES_2));
97 private static final IpAddressBinary IPV6_ADDRESS_BINARY =
98 new IpAddressBinary(new Ipv6AddressBinary(IPV6_BINARY_BYTES_1));
100 private static final Eid IPV4_PREFIX_EID_1 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_1 + IPV4_PREFIX_STRING);
101 private static final Eid IPV4_PREFIX_EID_2 = LispAddressUtil.asIpv4PrefixEid(IPV4_STRING_2 + IPV4_PREFIX_STRING);
102 private static final Eid IPV6_PREFIX_EID = LispAddressUtil.asIpv6PrefixEid(IPV6_STRING + IPV6_PREFIX_STRING);
103 private static final Eid SOURCE_DEST_KEY_EID = LispAddressUtil.asSrcDstEid(IPV4_SOURCE, IPV4_STRING_2, 24, 24, 0);
105 private static final Address IPV4_ADDRESS = new Ipv4Builder().setIpv4(new Ipv4Address(IPV4_STRING_1)).build();
106 private static final Address IPV6_ADDRESS = new Ipv6Builder().setIpv6(new Ipv6Address(IPV6_STRING)).build();
108 private static final Rloc RLOC_1 = LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1);
109 private static MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
110 private static final Subscriber SUBSCRIBER_RLOC_1 = new Subscriber(RLOC_1,
111 LispAddressUtil.asIpv4Eid(IPV4_SOURCE), Subscriber.DEFAULT_SUBSCRIBER_TIMEOUT);
114 @SuppressWarnings("unchecked")
115 public void init() throws Exception {
116 mapServiceMock = Mockito.mock(MappingService.class, "mapService");
117 subscriberSetMock = Mockito.mock(Set.class);
118 lispMappingServiceMock = Mockito.mock(LispMappingService.class, "requestHandler");
119 mapResolver = new MapResolver(mapServiceMock, true, ConfigIni.getInstance().getElpPolicy(),
120 lispMappingServiceMock);
121 mapRequestBuilder = getDefaultMapRequestBuilder();
125 * Tests {@link MapResolver#handleMapRequest} method.
128 public void handleMapRequest__withSingleLocator() {
130 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
131 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
132 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
133 final MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
135 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
136 .thenReturn(mappingData);
139 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
140 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
141 .setMappingRecord(mappingRecordBuilder.build()).build());
143 mapResolver.handleMapRequest(mapRequestBuilder.build());
144 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
148 * Tests {@link MapResolver#handleMapRequest} method.
151 public void handleMapRequest__withNoMapping() {
152 final MappingRecordBuilder mappingRecordBuilder = new MappingRecordBuilder()
153 .setAuthoritative(false)
154 .setMapVersion((short) 0)
155 .setEid(IPV4_PREFIX_EID_1)
156 .setAction(MappingRecord.Action.NativelyForward)
157 .setRecordTtl(TTL_RLOC_TIMED_OUT);
159 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
161 Mockito.when(mapServiceMock.getAuthenticationKey(IPV4_PREFIX_EID_1))
162 .thenReturn(new MappingAuthkeyBuilder().build());
163 Mockito.when(mapServiceMock.getWidestNegativePrefix(IPV4_PREFIX_EID_1)).thenReturn(IPV4_PREFIX_EID_1);
166 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
167 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
168 .setMappingRecord(mappingRecordBuilder.build()).build());
170 mapResolver.handleMapRequest(mapRequestBuilder.build());
171 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
175 * Tests {@link MapResolver#handleMapRequest} method.
178 public void handleMapRequest__withSubscribers() {
180 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
181 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
182 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
183 final MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
185 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
186 .thenReturn(mappingData);
187 Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
188 .thenReturn(subscriberSetMock);
189 Mockito.when(subscriberSetMock.contains(Mockito.any(Subscriber.class))).thenReturn(false);
192 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
193 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
194 .setMappingRecord(mappingRecordBuilder.build()).build());
196 mapResolver.handleMapRequest(mapRequestBuilder.build());
197 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
198 Mockito.verify(subscriberSetMock, Mockito.never()).remove(Mockito.any(Subscriber.class));
202 * Tests {@link MapResolver#isEqualIpVersion} method.
205 public void isEqualIpVersionTest() {
207 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
208 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
209 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
210 final MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
212 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
213 .thenReturn(mappingData);
214 Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
215 .thenReturn(subscriberSetMock);
216 Mockito.when(subscriberSetMock.contains(Mockito.any(Subscriber.class))).thenReturn(false);
218 // ----------------------
219 // with sourceRloc = null
220 List<ItrRloc> itrRlocList = Lists.newArrayList(
221 newItrRloc(MacAfi.class, null),
222 newItrRloc(Ipv4BinaryAfi.class, IPV4_ADDRESS));
224 ArgumentCaptor<Subscriber> captor = ArgumentCaptor.forClass(Subscriber.class);
225 mapResolver.handleMapRequest(mapRequestBuilder.setSourceRloc(null).setItrRloc(itrRlocList).build());
226 Mockito.verify(subscriberSetMock).add(captor.capture());
227 // Since mapRequest's sourceRloc is null, first ItrRloc from the itrRlocList must be used.
228 assertEquals(MacAfi.class, captor.getValue().getSrcRloc().getAddressType());
230 // ----------------------
231 // with sourceRloc address = itrRloc address
232 itrRlocList = Lists.newArrayList(
233 newItrRloc(MacAfi.class, null),
234 newItrRloc(Ipv4BinaryAfi.class, IPV4_ADDRESS));
236 MapRequest mapRequest = mapRequestBuilder
237 .setSourceRloc(IPV4_ADDRESS_BINARY_1)
238 .setItrRloc(itrRlocList).build();
240 captor = ArgumentCaptor.forClass(Subscriber.class);
241 mapResolver.handleMapRequest(mapRequest);
242 Mockito.verify(subscriberSetMock, Mockito.times(2)).add(captor.capture());
243 assertEquals(IPV4_ADDRESS, captor.getValue().getSrcRloc().getAddress());
245 // ----------------------
246 // with sourceRloc address Afi = itrRloc address Afi (for Ipv4)
247 itrRlocList = Lists.newArrayList(
248 newItrRloc(MacAfi.class, null),
249 newItrRloc(Ipv6Afi.class, IPV6_ADDRESS),
250 newItrRloc(Ipv4Afi.class, IPV4_ADDRESS));
252 mapRequest = mapRequestBuilder
253 .setSourceRloc(IPV6_ADDRESS_BINARY)
254 .setItrRloc(itrRlocList).build();
256 captor = ArgumentCaptor.forClass(Subscriber.class);
257 mapResolver.handleMapRequest(mapRequest);
258 Mockito.verify(subscriberSetMock, Mockito.times(3)).add(captor.capture());
259 assertEquals(IPV6_ADDRESS, captor.getValue().getSrcRloc().getAddress());
261 // ----------------------
262 // with sourceRloc address Afi = itrRloc address Afi (for Ipv6)
263 itrRlocList = Lists.newArrayList(
264 newItrRloc(MacAfi.class, null),
265 newItrRloc(Ipv6Afi.class, IPV6_ADDRESS),
266 newItrRloc(Ipv4Afi.class, IPV4_ADDRESS));
268 mapRequest = mapRequestBuilder
269 .setSourceRloc(IPV4_ADDRESS_BINARY_2)
270 .setItrRloc(itrRlocList).build();
272 captor = ArgumentCaptor.forClass(Subscriber.class);
273 mapResolver.handleMapRequest(mapRequest);
274 Mockito.verify(subscriberSetMock, Mockito.times(4)).add(captor.capture());
275 assertEquals(IPV4_ADDRESS, captor.getValue().getSrcRloc().getAddress());
277 // ----------------------
278 // with no common ip address nor Afi
279 final Mac mac = new MacBuilder().setMac(new MacAddress("aa:bb:cc:dd:ee:ff")).build();
280 itrRlocList = Lists.newArrayList(
281 newItrRloc(MacAfi.class, mac),
282 newItrRloc(NoAddressAfi.class, Mockito.mock(NoAddress.class)));
284 mapRequest = mapRequestBuilder
285 .setSourceRloc(IPV4_ADDRESS_BINARY_1)
286 .setItrRloc(itrRlocList).build();
288 captor = ArgumentCaptor.forClass(Subscriber.class);
289 mapResolver.handleMapRequest(mapRequest);
290 Mockito.verify(subscriberSetMock, Mockito.times(5)).add(captor.capture());
291 assertEquals(mac, captor.getValue().getSrcRloc().getAddress());
295 * Tests {@link MapResolver#handleMapRequest} method.
298 public void handleMapRequest__withSubscribersToRemove() {
300 final LocatorRecordBuilder locatorRecordBuilder = getDefaultLocatorBuilder();
301 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
302 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder.build());
303 MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
305 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
306 .thenReturn(mappingData);
307 Mockito.when(mapServiceMock.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
308 .thenReturn(subscriberSetMock);
309 Subscriber subscriberMock = new Subscriber(
310 mapRequestBuilder.getItrRloc().get(0).getRloc(),
311 mapRequestBuilder.getSourceEid().getEid(), Subscriber.DEFAULT_SUBSCRIBER_TIMEOUT);
312 subscriberMock.setSubscriberTimeoutByRecordTtl(
313 mappingRecordBuilder.getRecordTtl());
314 Mockito.when(subscriberSetMock.contains(subscriberMock))
318 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
319 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
320 .setMappingRecord(mappingRecordBuilder.build()).build());
322 // check if a subscriber is re-instantiating when there already is one in the subscriber set
323 mapResolver.handleMapRequest(mapRequestBuilder.build());
324 Mockito.verify(subscriberSetMock).remove(SUBSCRIBER_RLOC_1);
325 Mockito.verify(subscriberSetMock).add(SUBSCRIBER_RLOC_1);
326 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
327 Mockito.verify(mapServiceMock).addData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1,
328 SubKeys.SUBSCRIBERS, subscriberSetMock);
330 // verify that itrRloc is subscribed to dst address
331 mappingRecordBuilder.setEid(SOURCE_DEST_KEY_EID);
332 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV4_PREFIX_EID_2).build());
333 mappingData = getDefaultMappingData(mappingRecordBuilder.build());
334 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_2))
335 .thenReturn(mappingData);
337 mapResolver.handleMapRequest(mapRequestBuilder.build());
338 Mockito.verify(mapServiceMock).getData(MappingOrigin.Southbound,
339 SourceDestKeyHelper.getDstBinary(SOURCE_DEST_KEY_EID), SubKeys.SUBSCRIBERS);
343 * Tests {@link MapResolver#handleMapRequest} method.
346 public void handleMapRequest_withBothPolicy() {
347 mapResolver = new MapResolver(mapServiceMock, true, "both", lispMappingServiceMock);
349 final List<IpAddress> ipAddressList = new ArrayList<>();
350 ipAddressList.add(IPV4_ADDRESS_1); // hop 1
351 ipAddressList.add(IPV4_ADDRESS_2); // hop 2
353 final Rloc rloc = LispAddressUtil.asTeLcafRloc(ipAddressList);
354 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
355 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder().setRloc(rloc);
358 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
359 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build());
360 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build());
361 final MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
363 final MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
364 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_1))
366 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2))
369 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
370 .thenReturn(mappingData);
373 final LocatorRecordBuilder locatorRecordBuilder_3 = getDefaultLocatorBuilder()
374 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2)).setPriority((short) 1); // priority increased by 1
375 final MappingRecordBuilder resultMappingRecordBuilder = getDefaultMappingRecordBuilder();
377 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build()); // as Ipv4
378 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build()); // as ELP
379 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_3.build()); // added to the result
381 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
382 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
383 .setMappingRecord(resultMappingRecordBuilder.build()).build());
386 mapResolver.handleMapRequest(mapRequestBuilder.build());
387 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
391 * Tests {@link MapResolver#handleMapRequest} method.
394 public void handleMapRequest_withReplacePolicy() {
395 mapResolver = new MapResolver(mapServiceMock, true, "replace", lispMappingServiceMock);
397 final List<IpAddress> ipAddressList = new ArrayList<>();
398 ipAddressList.add(IPV4_ADDRESS_1); // hop 1
399 ipAddressList.add(IPV4_ADDRESS_2); // hop 2
401 final Rloc rloc = LispAddressUtil.asTeLcafRloc(ipAddressList);
402 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
403 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder().setRloc(rloc);
406 final MappingRecordBuilder mappingRecordBuilder = getDefaultMappingRecordBuilder();
407 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build());
408 mappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_2.build());
409 final MappingData mappingData = getDefaultMappingData(mappingRecordBuilder.build());
411 final MapRequestBuilder mapRequestBuilder = getDefaultMapRequestBuilder();
412 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_1))
414 mapRequestBuilder.getItrRloc().add(new ItrRlocBuilder().setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2))
417 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(), IPV4_PREFIX_EID_1))
418 .thenReturn(mappingData);
421 final LocatorRecordBuilder locatorRecordBuilder_3 = getDefaultLocatorBuilder()
422 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_STRING_2));
423 final MappingRecordBuilder resultMappingRecordBuilder = getDefaultMappingRecordBuilder();
425 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_1.build()); // as Ipv4
426 resultMappingRecordBuilder.getLocatorRecord().add(locatorRecordBuilder_3.build()); // added to the result
428 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
429 mapReplyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
430 .setMappingRecord(resultMappingRecordBuilder.build()).build());
433 mapResolver.handleMapRequest(mapRequestBuilder.build());
434 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
438 * Tests {@link MapResolver#handleMapRequest} method.
441 public void handleMapRequest_withMultipleEids() {
442 mapRequestBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV6_PREFIX_EID).build());
444 final LocatorRecordBuilder locatorRecordBuilder_1 = getDefaultLocatorBuilder();
445 final LocatorRecordBuilder locatorRecordBuilder_2 = getDefaultLocatorBuilder();
446 locatorRecordBuilder_2.setRloc(LispAddressUtil.asIpv6Rloc(IPV6_STRING));
449 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder();
450 mappingRecordBuilder_1.getLocatorRecord().add(locatorRecordBuilder_1.build());
451 final MappingData mappingData_1 = getDefaultMappingData(mappingRecordBuilder_1.build());
452 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
453 mappingRecordBuilder_2.getLocatorRecord().add(locatorRecordBuilder_2.build());
454 mappingRecordBuilder_2.setEid(IPV6_PREFIX_EID);
455 final MappingData mappingData_2 = getDefaultMappingData(mappingRecordBuilder_2.build());
457 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(),
458 mapRequestBuilder.getEidItem().get(0).getEid())).thenReturn(mappingData_1);
459 Mockito.when(mapServiceMock.getMapping(mapRequestBuilder.getSourceEid().getEid(),
460 mapRequestBuilder.getEidItem().get(1).getEid())).thenReturn(mappingData_2);
463 final MapReplyBuilder mapReplyBuilder = getDefaultMapReplyBuilder();
464 mapReplyBuilder.getMappingRecordItem()
465 .add(new MappingRecordItemBuilder().setMappingRecord(mappingRecordBuilder_1.build()).build());
466 mapReplyBuilder.getMappingRecordItem()
467 .add(new MappingRecordItemBuilder().setMappingRecord(mappingRecordBuilder_2.build()).build());
469 mapResolver.handleMapRequest(mapRequestBuilder.build());
470 Mockito.verify(lispMappingServiceMock).handleMapReply(mapReplyBuilder.build());
473 private static ItrRloc newItrRloc(Class<? extends LispAddressFamily> clazz, Address address) {
474 return new ItrRlocBuilder().setRloc(new RlocBuilder()
476 .setAddressType(clazz).build()).build();
479 private static List<ItrRloc> getDefaultItrRlocList() {
480 final List<ItrRloc> itrRlocList = new ArrayList<>();
481 final ItrRloc itrRloc = new ItrRlocBuilder()
482 .setKey(new ItrRlocKey(ITR_RLOC_KEY_STRING))
483 .setItrRlocId(ITR_RLOC_ID_STRING)
484 .setRloc(RLOC_1).build();
485 itrRlocList.add(itrRloc);
490 private static MapRequestBuilder getDefaultMapRequestBuilder() {
491 MapRequestBuilder mrBuilder = new MapRequestBuilder()
492 .setAuthoritative(false)
493 .setEidItem(new ArrayList<>())
494 .setItrRloc(new ArrayList<>())
495 .setMapDataPresent(true)
500 .setSmrInvoked(false)
501 .setSourceEid(new SourceEidBuilder().setEid(LispAddressUtil.asIpv4Eid(IPV4_SOURCE)).build())
502 .setItrRloc(getDefaultItrRlocList());
504 mrBuilder.getEidItem().add(new EidItemBuilder().setEid(IPV4_PREFIX_EID_1).build());
509 private static MappingData getDefaultMappingData(MappingRecord mappingRecord) {
510 if (mappingRecord == null) {
511 mappingRecord = getDefaultMappingRecordBuilder().build();
513 return new MappingData(mappingRecord, System.currentTimeMillis());
516 private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
517 return new MappingRecordBuilder()
518 .setAction(MappingRecord.Action.NoAction)
519 .setAuthoritative(false)
520 .setLocatorRecord(new ArrayList<>())
521 .setMapVersion((short) 0)
523 .setEid(IPV4_PREFIX_EID_1);
526 private static LocatorRecordBuilder getDefaultLocatorBuilder() {
527 return new LocatorRecordBuilder()
528 .setLocalLocator(false)
529 .setMulticastPriority((short) 0)
530 .setMulticastWeight((short) 0)
531 .setPriority((short) 0)
532 .setRlocProbed(false)
534 .setWeight((short) 0)
535 .setKey(LOCATOR_RECORD_KEY)
536 .setRloc(LispAddressUtil.asIpv4Rloc(IPV4_RLOC_STRING_1));
539 private static MapReplyBuilder getDefaultMapReplyBuilder() {
540 return new MapReplyBuilder()
541 .setEchoNonceEnabled(false)
543 .setSecurityEnabled(false)
544 .setNonce(mapRequestBuilder.getNonce())
545 .setMappingRecordItem(new ArrayList<>());