Migrate implementation/neutron/southbound to IETF YANG model
[lispflowmapping.git] / mappingservice / implementation / src / test / java / org / opendaylight / lispflowmapping / implementation / lisp / MapResolverTest.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.lispflowmapping.implementation.lisp;
9
10 import static org.junit.Assert.assertEquals;
11
12 import java.util.ArrayList;
13 import java.util.HashMap;
14 import java.util.Map;
15
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;
41
42 public class MapResolverTest extends BaseTestCase {
43
44     // private MapResolver testedMapResolver;
45     private LispMappingService testedMapResolver;
46     private ILispDAO dao;
47     private MappingService mapService;
48     private MapRequestBuilder mapRequest;
49     private Eid v4Address;
50     private Eid v6Address;
51
52     private HashMap<Eid, Map<String, MappingRecord>> daoResults;
53
54     @Override
55     @Before
56     public void before() throws Exception {
57         super.before();
58
59         dao = context.mock(ILispDAO.class);
60
61         // map-cache init and table creation
62         allowing(dao).putTable(wany(String.class));will(returnValue(dao));
63
64         MappingSystem mapSystem = new MappingSystem(dao, true, true, true);
65         mapService = new MappingService();
66         mapService.setDaoService(dao);
67         inject(mapService, "mappingSystem", mapSystem);
68
69         testedMapResolver = new LispMappingService();
70         testedMapResolver.setMappingService(mapService);
71         testedMapResolver.basicInit();
72
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>>();
77     }
78
79     @Test
80     public void handleMapRequest__ReplyWithSingleLocator() throws Exception {
81         mapRequest = getDefaultMapRequestBuilder();
82         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
83
84         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
85         record.setEid(v4Address);
86
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());
96
97         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
98
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());
108
109         assertLocator(LispAddressUtil.asIpv4Rloc("4.3.2.1"), eidToLocators.getLocatorRecord().get(0));
110     }
111
112     @Test
113     public void handleMapRequest__VerifyBasicFields() throws Exception {
114         mapRequest = getDefaultMapRequestBuilder();
115         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
116
117         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
118         record.setEid(v4Address);
119         record.setRecordTtl(100);
120
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());
126
127         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
128
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());
135     }
136
137     @Test
138     public void handleMapRequest__VerifyMask() throws Exception {
139         mapRequest = getDefaultMapRequestBuilder();
140         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
141
142         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
143         record.setEid(LispAddressUtil.asIpv4PrefixEid("1.2.3.0/24"));
144
145         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
146         locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
147         record.getLocatorRecord().add(locator.build());
148         prepareMapping(record.build());
149
150         MapRequest mr = mapRequest.build();
151         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
152
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());
156     }
157
158     @Test
159     public void handleMapRequest__VerifyMaskIPv6() throws Exception {
160         mapRequest = getDefaultMapRequestBuilder();
161         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
162
163         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
164         record.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:0/128"));
165
166         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
167         locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
168         record.getLocatorRecord().add(locator.build());
169         prepareMapping(record.build());
170
171         MapRequest mr = mapRequest.build();
172
173         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
174
175         assertEquals(mr.getNonce(), mapReply.getNonce());
176         MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
177         assertEquals(v6Address, eidToLocators.getEid());
178     }
179
180     @Test
181     public void handleMapRequest__VerifyMaskIPv6NoMatch() throws Exception {
182         mapRequest = getDefaultMapRequestBuilder();
183         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
184
185         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
186         record.setEid(LispAddressUtil.asIpv6PrefixEid("0:1:0:0:0:0:0:1/112"));
187
188         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
189         locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
190         record.getLocatorRecord().add(locator.build());
191         prepareMapping(record.build());
192
193         MapRequest mr = mapRequest.build();
194
195         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
196         MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
197         assertEquals(null, eidToLocators.getLocatorRecord());
198     }
199
200     @Test
201     public void handleMapRequest_VerifyNativelyForwardAuthorized() {
202         MapRequest mr = getDefaultMapRequest();
203
204         Map<String, MappingRecord> result = new HashMap<String, MappingRecord>();
205         result.put(SubKeys.RECORD, null);
206
207         MapReply mapReply = getNativelyForwardMapReply(mr, result);
208
209         MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
210         assertEquals(1, eidToLocators.getRecordTtl().intValue());
211         assertEquals(Action.NativelyForward, eidToLocators.getAction());
212     }
213
214     private MapReply getNativelyForwardMapReply(MapRequest mr, Map<String, MappingRecord> result) {
215         allowing(dao).get(wany(Eid.class));
216         ret(result);
217         allowing(dao).getSpecific(wany(Eid.class), with(SubKeys.AUTH_KEY));
218         ret("pass");
219         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
220         return mapReply;
221     }
222
223     private MapRequest getDefaultMapRequest() {
224         mapRequest = getDefaultMapRequestBuilder();
225         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
226         MapRequest mr = mapRequest.build();
227         return mr;
228     }
229
230     @Test
231     public void handleMapRequest__VerifyMaskNoMatch() throws Exception {
232         mapRequest = getDefaultMapRequestBuilder();
233         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
234
235         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
236         record.setEid(LispAddressUtil.asIpv4PrefixEid("1.2.4.0/24"));
237
238         LocatorRecordBuilder locator = getDefaultLocatorBuilder();
239         locator.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
240         record.getLocatorRecord().add(locator.build());
241         prepareMapping(record.build());
242
243         MapRequest mr = mapRequest.build();
244
245         MapReply mapReply = testedMapResolver.handleMapRequest(mr);
246
247         MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
248         assertEquals(null, eidToLocators.getLocatorRecord());
249     }
250
251     @Test
252     public void handleMapRequest__ReplyWithMultipleLocators() throws Exception {
253
254         mapRequest = getDefaultMapRequestBuilder();
255         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
256
257         MappingRecordBuilder record = getDefaultMappingRecordBuilder();
258         record.setEid(v4Address);
259
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());
269
270         prepareMapping(record.build());
271
272         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
273
274         MappingRecord eidToLocators = mapReply.getMappingRecordItem().get(0).getMappingRecord();
275         assertEquals(3, eidToLocators.getLocatorRecord().size());
276
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));
280     }
281
282     @Test
283     public void handleMapRequest__MultipleEIDs() throws Exception {
284
285         mapRequest = getDefaultMapRequestBuilder();
286         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v4Address).build());
287         mapRequest.getEidItem().add(new EidItemBuilder().setEid(v6Address).build());
288
289         MappingRecordBuilder record1 = getDefaultMappingRecordBuilder();
290         record1.setEid(v4Address);
291         record1.setRecordTtl(100);
292
293         LocatorRecordBuilder locator1 = getDefaultLocatorBuilder();
294         locator1.setRloc(LispAddressUtil.asIpv4Rloc("4.3.2.1"));
295         record1.getLocatorRecord().add(locator1.build());
296
297         MappingRecordBuilder record2 = getDefaultMappingRecordBuilder();
298         record2.setEid(v6Address);
299         record2.setRecordTtl(100);
300
301         LocatorRecordBuilder locator2 = getDefaultLocatorBuilder();
302         locator2.setRloc(LispAddressUtil.asIpv6Rloc("0:0:0:0:0:0:0:1"));
303         record2.getLocatorRecord().add(locator2.build());
304
305         prepareMapping(record1.build(), record2.build());
306
307         MapReply mapReply = testedMapResolver.handleMapRequest(mapRequest.build());
308
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));
312
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));
316     }
317
318     private void assertLocator(Rloc expectedAddress, LocatorRecord locatorRecord) {
319         assertEquals(expectedAddress, locatorRecord.getRloc());
320         Assert.assertTrue(locatorRecord.isRouted());
321     }
322
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);
328
329                 daoResults.put(eidToLocatorRecord.getEid(), result);
330             }
331         }
332
333         ValueSaverAction<Eid> daoGetSaverAction = new ValueSaverAction<Eid>() {
334             @Override
335             protected boolean validate(Eid value) {
336                 return true;
337             }
338
339             @Override
340             public Object invoke(Invocation invocation) throws Throwable {
341                 return daoResults.get(lastValue);
342             }
343         };
344
345         allowing(dao).get(with(daoGetSaverAction));
346         will(daoGetSaverAction);
347         allowing(dao).getSpecific(wany(Eid.class), with(SubKeys.AUTH_KEY));
348
349         return daoResults.get(v4Address);
350     }
351
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());
364         return mrBuilder;
365     }
366
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);
374         return builder;
375     }
376
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);
386         return builder;
387     }
388
389 }