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 com.google.common.collect.Sets;
14 import java.lang.reflect.Field;
15 import java.util.ArrayList;
16 import java.util.Date;
17 import java.util.HashSet;
18 import java.util.List;
20 import org.junit.Before;
21 import org.junit.Test;
22 import org.junit.runner.RunWith;
23 import org.mockito.ArgumentCaptor;
24 import org.mockito.Mock;
25 import org.mockito.Mockito;
26 import org.mockito.Spy;
27 import org.mockito.runners.MockitoJUnitRunner;
28 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
29 import org.opendaylight.lispflowmapping.config.ConfigIni;
30 import org.opendaylight.lispflowmapping.interfaces.dao.SubKeys;
31 import org.opendaylight.lispflowmapping.interfaces.dao.SubscriberRLOC;
32 import org.opendaylight.lispflowmapping.interfaces.lisp.IMapNotifyHandler;
33 import org.opendaylight.lispflowmapping.interfaces.mappingservice.IMappingService;
34 import org.opendaylight.lispflowmapping.lisp.type.LispMessage;
35 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
36 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
37 import org.opendaylight.lispflowmapping.lisp.util.SourceDestKeyHelper;
38 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
39 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.IpAddressBinary;
40 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.inet.binary.types.rev160303.Ipv4AddressBinary;
41 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapRegister;
42 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
43 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
44 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
45 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
46 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
47 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapnotifymessage.MapNotify;
48 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapnotifymessage.MapNotifyBuilder;
49 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
50 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkeyBuilder;
51 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
52 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
53 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
54 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
55 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemKey;
56 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapregistermessage.MapRegisterBuilder;
57 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.maprequestnotification.MapRequest;
58 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.rloc.container.Rloc;
59 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.transport.address.TransportAddress;
60 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.transport.address.TransportAddressBuilder;
61 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.mappingservice.rev150906.MappingOrigin;
63 @RunWith(MockitoJUnitRunner.class)
64 public class MapServerTest {
66 @Mock private static IMappingService mapService;
67 @Mock private static IMapNotifyHandler notifyHandler;
68 @Mock private static NotificationService notificationService;
70 @Spy private static Set<SubscriberRLOC> subscriberSetMock_1 = new HashSet<>();
71 @Spy private static Set<SubscriberRLOC> subscriberSetMock_2 = new HashSet<>();
72 @Spy private static Set<SubscriberRLOC> subscriberSetMock_3 = new HashSet<>();
73 private static MapServer mapServer;
74 private static MapRegister mapRegister;
75 private static MappingData mappingData;
77 private static final String IPV4_STRING_1 = "1.2.3.0";
78 private static final String IPV4_STRING_2 = "1.2.4.0";
79 private static final String IPV4_STRING_3 = "192.168.0.1";
80 private static final String IPV4_STRING_4 = "192.168.0.2";
81 private static final String IPV4_STRING_5 = "192.168.0.3";
82 private static final String IPV4_STRING_6 = "192.168.0.4";
83 private static final String IPV4_SOURCE_STRING_1 = "127.0.0.1";
84 private static final String IPV4_SOURCE_STRING_2 = "127.0.0.2";
85 private static final String IPV4_SOURCE_STRING_3 = "127.0.0.3";
86 private static final String IPV4_SOURCE_STRING_4 = "127.0.0.4";
87 private static final String IPV4_SOURCE_STRING_5 = "127.0.0.5";
88 private static final String IPV4_SOURCE_STRING_6 = "127.0.0.6";
89 private static final String IPV4_PREFIX_1 = "/24";
90 private static final String IPV4_PREFIX_2 = "/16";
91 private static final int MASK = 24;
92 private static final int VNI = 10;
94 private static final Eid IPV4_EID_1 = LispAddressUtil.asIpv4Eid(IPV4_STRING_1);
95 private static final Eid IPV4_EID_2 = LispAddressUtil.asIpv4Eid(IPV4_STRING_2);
96 private static final Eid IPV4_PREFIX_EID_1 = LispAddressUtil.asIpv4PrefixBinaryEid(IPV4_STRING_1 + IPV4_PREFIX_1);
97 private static final Eid IPV4_PREFIX_EID_2 = LispAddressUtil.asIpv4PrefixBinaryEid(IPV4_STRING_1 + IPV4_PREFIX_2);
98 private static final Eid IPV4_SOURCE_EID_1 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_1);
99 private static final Eid IPV4_SOURCE_EID_2 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_2);
100 private static final Eid IPV4_SOURCE_EID_3 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_3);
101 private static final Eid IPV4_SOURCE_EID_4 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_4);
102 private static final Eid IPV4_SOURCE_EID_5 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_5);
103 private static final Eid IPV4_SOURCE_EID_6 = LispAddressUtil.asIpv4Eid(IPV4_SOURCE_STRING_6);
104 private static final Rloc RLOC_1 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_1);
105 private static final Rloc RLOC_2 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_2);
106 private static final Rloc RLOC_3 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_3);
107 private static final Rloc RLOC_4 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_4);
108 private static final Rloc RLOC_5 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_5);
109 private static final Rloc RLOC_6 = LispAddressUtil.asIpv4Rloc(IPV4_STRING_6);
111 private static final IpAddressBinary IPV4_BINARY_1 =
112 new IpAddressBinary(new Ipv4AddressBinary(new byte[] {1, 2, 3, 0}));
113 private static final IpAddressBinary IPV4_BINARY_2 =
114 new IpAddressBinary(new Ipv4AddressBinary(new byte[] {1, 2, 4, 0}));
116 private static final long TWO_DAYS = 86400000L * 2;
118 private static final SubscriberRLOC SUBSCRIBER_RLOC_1 = new SubscriberRLOC(RLOC_1, // timedOut() == true
119 IPV4_SOURCE_EID_1, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT,
120 new Date(System.currentTimeMillis() - TWO_DAYS));
121 private static final SubscriberRLOC SUBSCRIBER_RLOC_2 = new SubscriberRLOC(RLOC_2, // timedOut() == false
122 IPV4_SOURCE_EID_2, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT);
123 private static final SubscriberRLOC SUBSCRIBER_RLOC_3 = new SubscriberRLOC(RLOC_3, // timedOut() == true
124 IPV4_SOURCE_EID_3, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT,
125 new Date(System.currentTimeMillis() - TWO_DAYS));
126 private static final SubscriberRLOC SUBSCRIBER_RLOC_4 = new SubscriberRLOC(RLOC_4, // timedOut() == false
127 IPV4_SOURCE_EID_4, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT);
128 private static final SubscriberRLOC SUBSCRIBER_RLOC_5 = new SubscriberRLOC(RLOC_5, // timedOut() == true
129 IPV4_SOURCE_EID_5, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT,
130 new Date(System.currentTimeMillis() - TWO_DAYS));
131 private static final SubscriberRLOC SUBSCRIBER_RLOC_6 = new SubscriberRLOC(RLOC_6, // timedOut() == false
132 IPV4_SOURCE_EID_6, SubscriberRLOC.DEFAULT_SUBSCRIBER_TIMEOUT);
134 private static final Eid SOURCE_DEST_KEY_EID = LispAddressUtil
135 .asSrcDstEid(IPV4_STRING_1, IPV4_STRING_2, MASK, MASK, VNI);
136 private static final MappingAuthkey MAPPING_AUTHKEY = new MappingAuthkeyBuilder().setKeyType(0).build();
137 private static final ConfigIni CONFIG_INI = ConfigIni.getInstance();
139 private static final LocatorRecord LOCATOR_RECORD_1 = new LocatorRecordBuilder().setRloc(RLOC_1).build();
140 private static final LocatorRecord LOCATOR_RECORD_2 = new LocatorRecordBuilder().setRloc(RLOC_2).build();
142 private static final MappingRecord OLD_MAPPING_RECORD_1 = getDefaultMappingRecordBuilder()
143 .setLocatorRecord(Lists.newArrayList(LOCATOR_RECORD_1)).build();
144 private static final MappingRecord OLD_MAPPING_RECORD_2 = getDefaultMappingRecordBuilder()
145 .setLocatorRecord(Lists.newArrayList(LOCATOR_RECORD_2)).build();
146 private static final MappingData OLD_MAPPING_DATA_1 = new MappingData(OLD_MAPPING_RECORD_1);
147 private static final MappingData OLD_MAPPING_DATA_2 = new MappingData(OLD_MAPPING_RECORD_2);
149 private static final Set<IpAddressBinary> DEFAULT_IP_ADDRESS_SET = getDefaultIpAddressSet();
152 public void init() throws NoSuchFieldException, IllegalAccessException {
153 mapServer = new MapServer(mapService, true, notifyHandler, notificationService);
154 subscriberSetMock_1.add(SUBSCRIBER_RLOC_1);
155 subscriberSetMock_1.add(SUBSCRIBER_RLOC_2);
156 subscriberSetMock_2.add(SUBSCRIBER_RLOC_3);
157 subscriberSetMock_2.add(SUBSCRIBER_RLOC_4);
158 subscriberSetMock_3.add(SUBSCRIBER_RLOC_5);
159 subscriberSetMock_3.add(SUBSCRIBER_RLOC_6);
160 mapRegister = getDefaultMapRegisterBuilder().build();
161 mappingData = new MappingData(mapRegister.getMappingRecordItem().iterator().next().getMappingRecord(),
162 System.currentTimeMillis());
163 setConfigIniMappingMergeField(false);
167 public void handleMapRegisterTest_MappingMergeFalse() throws NoSuchFieldException, IllegalAccessException {
168 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1)).thenReturn(OLD_MAPPING_DATA_1);
169 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SUBSCRIBERS))
170 .thenReturn(subscriberSetMock_1);
172 mappingData.setMergeEnabled(false);
173 mapServer.handleMapRegister(mapRegister);
175 final ArgumentCaptor<MappingData> captor = ArgumentCaptor.forClass(MappingData.class);
176 Mockito.verify(mapService).addMapping(Mockito.eq(MappingOrigin.Southbound), Mockito.eq(IPV4_EID_1),
177 Mockito.eq(mapRegister.getSiteId()), captor.capture());
178 assertEquals(captor.getValue().getRecord(), mappingData.getRecord());
179 Mockito.verify(mapService).addData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SUBSCRIBERS,
180 subscriberSetMock_1);
181 Mockito.verify(notifyHandler).handleMapNotify(getDefaultMapNotifyBuilder(mapRegister)
182 .setAuthenticationData(null).build(), null);
184 // only 1 subscriber has timed out.
185 assertEquals(1, subscriberSetMock_1.size());
189 public void handleMapRegisterTest_MappingMergeTrue() throws NoSuchFieldException, IllegalAccessException {
190 setConfigIniMappingMergeField(true);
192 final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder()
193 .setMappingRecord(OLD_MAPPING_RECORD_1);
194 final MapNotifyBuilder mapNotifyBuilder = getDefaultMapNotifyBuilder(mapRegister)
195 .setMappingRecordItem(new ArrayList<>());
196 mapNotifyBuilder.getMappingRecordItem().add(mappingRecordItemBuilder.build());
198 // no mapping changes
199 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
200 .thenReturn(OLD_MAPPING_DATA_1);
202 mappingData.setMergeEnabled(true);
203 mapServer.handleMapRegister(mapRegister);
205 final ArgumentCaptor<MappingData> captor = ArgumentCaptor.forClass(MappingData.class);
206 Mockito.verify(mapService).addMapping(Mockito.eq(MappingOrigin.Southbound), Mockito.eq(IPV4_EID_1),
207 Mockito.eq(mapRegister.getSiteId()), captor.capture());
208 assertEquals(captor.getValue().getRecord(), mappingData.getRecord());
209 Mockito.verify(notifyHandler).handleMapNotify(mapNotifyBuilder.setAuthenticationData(null).build(), null);
213 public void handleMapRegisterTest_findNegativeSubscribers() throws NoSuchFieldException, IllegalAccessException {
214 setConfigIniMappingMergeField(true);
216 mapRegister.getMappingRecordItem().clear();
217 mapRegister.getMappingRecordItem().add(getDefaultMappingRecordItemBuilder(IPV4_PREFIX_EID_1).build());
219 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder()
221 .setEid(IPV4_PREFIX_EID_2);
222 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
223 final Eid maskedEid1 = LispAddressUtil.asIpv4Eid("1.2.0.0");
225 final SubscriberRLOC subscriber1 = Mockito.mock(SubscriberRLOC.class);
226 Mockito.when(subscriber1.timedOut()).thenReturn(true);
227 Mockito.when(subscriber1.toString()).thenReturn("sub1");
229 final Set<SubscriberRLOC> set1 = Sets.newHashSet(subscriber1);
231 Mockito.when(mapService.getAuthenticationKey(IPV4_PREFIX_EID_1)).thenReturn(MAPPING_AUTHKEY);
232 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SRC_RLOCS))
233 .thenReturn(DEFAULT_IP_ADDRESS_SET);
235 Mockito.when(mapService.getParentPrefix(IPV4_PREFIX_EID_1)).thenReturn(maskedEid1);
236 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_PREFIX_EID_1, SubKeys.SUBSCRIBERS))
238 Mockito.when(mapService.getData(MappingOrigin.Southbound, maskedEid1, SubKeys.SUBSCRIBERS)).thenReturn(set1);
240 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_PREFIX_EID_1))
241 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
242 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
245 mapServer.handleMapRegister(mapRegister);
246 Mockito.verify(subscriber1).timedOut();
250 public void handleMapRegisterTest_verifyTransportAddresses() throws NoSuchFieldException, IllegalAccessException {
251 setConfigIniMappingMergeField(true);
254 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
255 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
256 .thenReturn(OLD_MAPPING_DATA_1)
257 .thenReturn(OLD_MAPPING_DATA_2)
258 .thenReturn(getDefaultMappingData(getDefaultMappingRecordBuilder().build()));
259 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SUBSCRIBERS))
260 .thenReturn(subscriberSetMock_1);
261 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
262 .thenReturn(DEFAULT_IP_ADDRESS_SET);
265 final List<TransportAddress> transportAddressList = getTransportAddressList();
266 final MapNotifyBuilder mapNotifyBuilder = getDefaultMapNotifyBuilder(mapRegister);
267 mapNotifyBuilder.setMappingRecordItem(new ArrayList<>());
268 mapNotifyBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder()
269 .setMappingRecord(getDefaultMappingRecordBuilder().build()).build());
271 mapServer.handleMapRegister(mapRegister);
272 Mockito.verify(notifyHandler).handleMapNotify(mapNotifyBuilder.build(), transportAddressList);
276 public void handleMapRegisterTest_withTwoMappingRecords() throws NoSuchFieldException, IllegalAccessException {
277 setConfigIniMappingMergeField(true);
280 // Add a MappingRecord with SrcDestKey Eid Type
281 final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder()
282 .setMappingRecord(getDefaultMappingRecordBuilder().setEid(SOURCE_DEST_KEY_EID).build());
283 final MapRegisterBuilder mapRegisterSrcDstBuilder = getDefaultMapRegisterBuilder();
285 final List<MappingRecordItem> list = mapRegisterSrcDstBuilder.getMappingRecordItem();
286 list.add(mappingRecordItemBuilder.build());
288 // ------------- Stubbing for SourceDestKey type Eid mapping -------------------
290 Mockito.when(mapService.getAuthenticationKey(SOURCE_DEST_KEY_EID)).thenReturn(MAPPING_AUTHKEY);
291 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, SOURCE_DEST_KEY_EID))
292 // ensure mappings are different
293 .thenReturn(OLD_MAPPING_DATA_1)
294 .thenReturn(OLD_MAPPING_DATA_2)
295 .thenReturn(OLD_MAPPING_DATA_2);
296 // return a subscriberSet for SrcDestKeyEid MappingRecord
297 Mockito.when(mapService.getData(MappingOrigin.Southbound, SOURCE_DEST_KEY_EID, SubKeys.SUBSCRIBERS))
298 .thenReturn(subscriberSetMock_1);
300 // return a subscriberSet for SrcDestKeyEid destination MappingRecord
301 Mockito.when(mapService.getData(MappingOrigin.Southbound, SourceDestKeyHelper.getDstBinary(SOURCE_DEST_KEY_EID),
302 SubKeys.SUBSCRIBERS)).thenReturn(subscriberSetMock_2);
304 // ----------------- Stubbing for Ipv4 type Eid mapping ------------------------
306 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
307 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
308 // ensure mappings are different
309 .thenReturn(OLD_MAPPING_DATA_1)
310 .thenReturn(OLD_MAPPING_DATA_2);
311 // return a subscriberSet for Ipv4Eid MappingRecord
312 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1,SubKeys.SUBSCRIBERS))
313 .thenReturn(subscriberSetMock_3);
315 // -----------------------------------------------------------------------------
318 mapServer.handleMapRegister(mapRegisterSrcDstBuilder.build());
320 // for SrcDstKey mapping
321 final ArgumentCaptor<MapRequest> captor_1 = ArgumentCaptor.forClass(MapRequest.class);
322 Mockito.verify(notifyHandler, Mockito.times(1)).handleSMR(captor_1.capture(), Mockito.eq(RLOC_2));
323 Mockito.verify(mapService).addData(MappingOrigin.Southbound, SOURCE_DEST_KEY_EID, SubKeys.SUBSCRIBERS,
324 subscriberSetMock_1);
325 final Eid resultEid_1 = captor_1.getValue().getEidItem().iterator().next().getEid();
326 assertEquals(IPV4_SOURCE_EID_2, resultEid_1);
328 // for SrcDst destination mapping
329 final ArgumentCaptor<MapRequest> captor_2 = ArgumentCaptor.forClass(MapRequest.class);
330 Mockito.verify(notifyHandler, Mockito.times(1)).handleSMR(captor_2.capture(), Mockito.eq(RLOC_4));
331 Mockito.verify(mapService).addData(MappingOrigin.Southbound,
332 SourceDestKeyHelper.getDstBinary(SOURCE_DEST_KEY_EID),
333 SubKeys.SUBSCRIBERS, subscriberSetMock_2);
334 final Eid resultEid_2 = captor_2.getValue().getEidItem().iterator().next().getEid();
335 assertEquals(IPV4_SOURCE_EID_4, resultEid_2);
338 final ArgumentCaptor<MapRequest> captor_3 = ArgumentCaptor.forClass(MapRequest.class);
339 Mockito.verify(notifyHandler, Mockito.times(1)).handleSMR(captor_3.capture(), Mockito.eq(RLOC_6));
340 Mockito.verify(mapService).addData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SUBSCRIBERS,
341 subscriberSetMock_3);
342 final Eid resultEid_3 = captor_3.getValue().getEidItem().iterator().next().getEid();
343 assertEquals(IPV4_SOURCE_EID_6, resultEid_3);
347 @SuppressWarnings({ "unchecked", "rawtypes" })
348 public void mappingChangedTest_withDifferentEid() throws NoSuchFieldException, IllegalAccessException {
349 setConfigIniMappingMergeField(true);
351 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder()
354 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
355 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
357 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
358 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
359 .thenReturn(DEFAULT_IP_ADDRESS_SET);
361 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
362 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
363 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
366 mapServer.handleMapRegister(mapRegister);
367 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
368 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
369 assertEquals(2, captor.getValue().size());
373 @SuppressWarnings({ "unchecked", "rawtypes" })
374 public void mappingChangedTest_withDifferentRLOC() throws NoSuchFieldException, IllegalAccessException {
375 setConfigIniMappingMergeField(true);
377 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder();
379 mappingRecordBuilder_1.getLocatorRecord().add(new LocatorRecordBuilder().build());
380 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
381 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
383 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
384 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
385 .thenReturn(DEFAULT_IP_ADDRESS_SET);
387 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
388 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
389 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
392 mapServer.handleMapRegister(mapRegister);
393 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
394 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
395 assertEquals(2, captor.getValue().size());
399 @SuppressWarnings({ "unchecked", "rawtypes" })
400 public void mappingChangedTest_withDifferentAction() throws NoSuchFieldException, IllegalAccessException {
401 setConfigIniMappingMergeField(true);
403 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder()
405 .setAction(MappingRecord.Action.NativelyForward);
406 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
407 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
409 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
410 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
411 .thenReturn(DEFAULT_IP_ADDRESS_SET);
413 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
414 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
415 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
418 mapServer.handleMapRegister(mapRegister);
419 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
420 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
421 assertEquals(2, captor.getValue().size());
425 @SuppressWarnings({ "unchecked", "rawtypes" })
426 public void mappingChangedTest_withDifferentTTL() throws NoSuchFieldException, IllegalAccessException {
427 setConfigIniMappingMergeField(true);
429 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder()
432 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
433 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
435 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
436 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
437 .thenReturn(DEFAULT_IP_ADDRESS_SET);
439 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
440 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
441 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
444 mapServer.handleMapRegister(mapRegister);
445 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
446 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
447 assertEquals(2, captor.getValue().size());
451 @SuppressWarnings({ "unchecked", "rawtypes" })
452 public void mappingChangedTest_withDifferentMapVersion() throws NoSuchFieldException, IllegalAccessException {
453 setConfigIniMappingMergeField(true);
455 final MappingRecordBuilder mappingRecordBuilder_1 = getDefaultMappingRecordBuilder()
457 .setMapVersion((short) 10);
458 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
459 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
461 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
462 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
463 .thenReturn(DEFAULT_IP_ADDRESS_SET);
466 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
467 .thenReturn(getDefaultMappingData(mappingRecordBuilder_1.build()))
468 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
471 mapServer.handleMapRegister(mapRegister);
472 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
473 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
474 assertEquals(2, captor.getValue().size());
478 @SuppressWarnings({ "unchecked", "rawtypes" })
479 public void mappingChangedTest_withNullMap() throws NoSuchFieldException, IllegalAccessException {
480 setConfigIniMappingMergeField(true);
482 final MappingRecordBuilder mappingRecordBuilder_2 = getDefaultMappingRecordBuilder();
483 final ArgumentCaptor<List> captor = ArgumentCaptor.forClass(List.class);
485 Mockito.when(mapService.getAuthenticationKey(IPV4_EID_1)).thenReturn(MAPPING_AUTHKEY);
486 Mockito.when(mapService.getData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SRC_RLOCS))
487 .thenReturn(DEFAULT_IP_ADDRESS_SET);
489 Mockito.when(mapService.getMapping(MappingOrigin.Southbound, IPV4_EID_1))
491 .thenReturn(getDefaultMappingData(mappingRecordBuilder_2.build()))
494 mapServer.handleMapRegister(mapRegister);
495 Mockito.verify(notifyHandler).handleMapNotify(Mockito.any(MapNotify.class), captor.capture());
496 // verify that a list of transport addresses has 2 values - happens only if mappingUpdated == true
497 assertEquals(2, captor.getValue().size());
500 private static MapRegisterBuilder getDefaultMapRegisterBuilder() {
501 final MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder()
502 .setProxyMapReply(true)
503 .setWantMapNotify(true)
505 .setMappingRecordItem(new ArrayList<>())
506 .setMergeEnabled(true)
508 .setSiteId(new SiteId(new byte[]{0, 1, 2, 3, 4, 5, 6, 7}))
509 .setXtrId(new XtrId(new byte[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}))
510 .setXtrSiteIdPresent(true);
511 mapRegisterBuilder.getMappingRecordItem().add(getDefaultMappingRecordItemBuilder().build());
513 return mapRegisterBuilder;
516 private static MappingData getDefaultMappingData(MappingRecord mappingRecord) {
517 if (mappingRecord == null) {
518 mappingRecord = getDefaultMappingRecordBuilder().build();
520 return new MappingData(mappingRecord, System.currentTimeMillis());
523 private static MappingRecordItemBuilder getDefaultMappingRecordItemBuilder() {
524 return getDefaultMappingRecordItemBuilder(IPV4_EID_1);
527 private static MappingRecordItemBuilder getDefaultMappingRecordItemBuilder(Eid eid) {
528 return new MappingRecordItemBuilder()
529 .setMappingRecordItemId("mapping-record-item-id")
530 .setKey(new MappingRecordItemKey("mapping-record-item-key"))
531 .setMappingRecord(getDefaultMappingRecordBuilder(eid).build());
534 private static MappingRecordBuilder getDefaultMappingRecordBuilder() {
535 return getDefaultMappingRecordBuilder(IPV4_EID_1);
538 private static MappingRecordBuilder getDefaultMappingRecordBuilder(Eid eid) {
539 return new MappingRecordBuilder()
540 .setAction(MappingRecord.Action.NoAction)
541 .setAuthoritative(false)
542 .setLocatorRecord(new ArrayList<>())
543 .setMapVersion((short) 0)
548 private static MapNotifyBuilder getDefaultMapNotifyBuilder(MapRegister mapRegister) {
549 final MapNotifyBuilder mapNotifyBuilder = new MapNotifyBuilder()
550 .setXtrSiteIdPresent(mapRegister.isXtrSiteIdPresent())
551 .setSiteId(mapRegister.getSiteId())
552 .setXtrId(mapRegister.getXtrId())
553 .setNonce(mapRegister.getNonce())
554 .setKeyId(mapRegister.getKeyId())
555 .setMergeEnabled(mapRegister.isMergeEnabled())
556 .setMappingRecordItem(new ArrayList<>())
557 .setAuthenticationData(new byte[]{});
558 mapNotifyBuilder.getMappingRecordItem().add(getDefaultMappingRecordItemBuilder().build());
560 return mapNotifyBuilder;
563 private static void setConfigIniMappingMergeField(boolean value) throws NoSuchFieldException,
564 IllegalAccessException {
565 final Field mappingMergeField = CONFIG_INI.getClass().getDeclaredField("mappingMerge");
566 mappingMergeField.setAccessible(true);
567 mappingMergeField.setBoolean(CONFIG_INI, value);
570 private static Set<IpAddressBinary> getDefaultIpAddressSet() {
571 final Set<IpAddressBinary> addressSet = Sets.newHashSet(IPV4_BINARY_1, IPV4_BINARY_2);
576 private static List<TransportAddress> getTransportAddressList() {
577 TransportAddressBuilder transportAddressBuilder1 = new TransportAddressBuilder()
578 .setIpAddress(IPV4_BINARY_1)
579 .setPort(new PortNumber(LispMessage.PORT_NUM));
581 TransportAddressBuilder transportAddressBuilder2 = new TransportAddressBuilder()
582 .setIpAddress(IPV4_BINARY_2)
583 .setPort(new PortNumber(LispMessage.PORT_NUM));
585 final List<TransportAddress> transportAddressList = Lists.newArrayList(
586 transportAddressBuilder1.build(),
587 transportAddressBuilder2.build());
589 return transportAddressList;