2 * Copyright (c) 2014 Contextream, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.serializer;
11 import static org.junit.Assert.assertEquals;
12 import static org.junit.Assert.assertFalse;
13 import static org.junit.Assert.assertTrue;
15 import java.nio.ByteBuffer;
16 import java.util.ArrayList;
18 import junitx.framework.ArrayAssert;
20 import org.junit.Test;
21 import org.opendaylight.lispflowmapping.lisp.serializer.MapNotifySerializer;
22 import org.opendaylight.lispflowmapping.lisp.serializer.exception.LispSerializationException;
23 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
24 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapNotify;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapnotifymessage.MapNotifyBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
34 public class MapNotifySerializationTest extends BaseTestCase {
37 public void serialize__Fields() throws Exception {
38 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
39 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
40 mnBuilder.getMappingRecordItem().add(
41 new MappingRecordItemBuilder().setMappingRecord(
42 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32")).build())
44 mnBuilder.getMappingRecordItem().add(
45 new MappingRecordItemBuilder().setMappingRecord(
46 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.73/32")).build())
49 mnBuilder.setNonce(6161616161L);
50 mnBuilder.setKeyId((short) 0x0001);
51 byte[] authenticationData = new byte[] { (byte) 0x16, (byte) 0x98, (byte) 0x96, (byte) 0xeb, (byte) 0x88, (byte) 0x2d, (byte) 0x4d,
52 (byte) 0x22, (byte) 0xe5, (byte) 0x8f, (byte) 0xe6, (byte) 0x89, (byte) 0x64, (byte) 0xb9, (byte) 0x17, (byte) 0xa4, (byte) 0xba,
53 (byte) 0x4e, (byte) 0x8c, (byte) 0x41 };
54 mnBuilder.setAuthenticationData(authenticationData);
56 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
57 assertHexEquals((byte) 0x40, bb.get()); // Type + MSByte of reserved
58 assertEquals(0, bb.getShort()); // Rest of reserved
59 assertEquals(2, bb.get()); // Record Count
60 assertEquals(6161616161L, bb.getLong()); // Nonce
61 assertHexEquals((short) 0x0001, bb.getShort()); // Key ID
62 assertEquals(authenticationData.length, bb.getShort());
64 byte[] actualAuthenticationData = new byte[20];
65 bb.get(actualAuthenticationData);
66 ArrayAssert.assertEquals(authenticationData, actualAuthenticationData);
68 bb.position(bb.position() + 12); /* EID in first record */
69 assertEquals(0x1, bb.getInt());
71 bb.position(bb.position() + 12); /* EID in second record */
72 assertEquals(73, bb.getInt());
74 assertEquals(bb.position(), bb.capacity());
78 public void serialize__deserialize() throws Exception {
79 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
80 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
81 mnBuilder.getMappingRecordItem().add(
82 new MappingRecordItemBuilder().setMappingRecord(
83 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32")).build())
85 mnBuilder.getMappingRecordItem().add(
86 new MappingRecordItemBuilder().setMappingRecord(
87 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.73/32")).build())
90 mnBuilder.setNonce(6161616161L);
91 mnBuilder.setKeyId((short) 0x0001);
92 byte[] authenticationData = new byte[] { (byte) 0x16, (byte) 0x98, (byte) 0x96, (byte) 0xeb, (byte) 0x88, (byte) 0x2d, (byte) 0x4d,
93 (byte) 0x22, (byte) 0xe5, (byte) 0x8f, (byte) 0xe6, (byte) 0x89, (byte) 0x64, (byte) 0xb9, (byte) 0x17, (byte) 0xa4, (byte) 0xba,
94 (byte) 0x4e, (byte) 0x8c, (byte) 0x41 };
95 mnBuilder.setAuthenticationData(authenticationData);
97 MapNotify mn = mnBuilder.build();
98 ArrayAssert.assertEquals(
99 MapNotifySerializer.getInstance().serialize(mn).array(),
100 MapNotifySerializer.getInstance()
101 .serialize(MapNotifySerializer.getInstance().deserialize(MapNotifySerializer.getInstance().serialize(mn))).array());
106 public void deserialize__AllFields() throws Exception {
107 // LISP(Type = 4 Map-Notify, I=1
109 // Nonce: (something)
111 // AuthDataLength: 00 Data:
112 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
114 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
115 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
118 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("48 00 00 01 FF BB "
120 + "00 00 00 00 00 00 00 00 00 00 00 00 " //
121 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
122 + "ff 00 00 05 00 01 c0 a8 88 0a "
123 + "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 " // xTR-ID
124 + "00 00 00 00 00 00 00 01 " // Site-ID
128 assertTrue(mn.isXtrSiteIdPresent());
130 assertEquals(1, mn.getMappingRecordItem().size());
131 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
132 assertEquals(0x0000, mn.getKeyId().shortValue());
133 byte[] expectedAuthenticationData = {};
134 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());
138 public void serialize__NoAuthenticationData() throws Exception {
139 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
140 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
141 mnBuilder.getMappingRecordItem().add(
142 new MappingRecordItemBuilder().setMappingRecord(
143 new MappingRecordBuilder().setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"))
144 .setRecordTtl(55).build()).build());
146 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
147 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
148 assertEquals(0, bb.getShort());
149 assertEquals(55, bb.getInt());
151 mnBuilder.setAuthenticationData(null);
153 bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
154 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
155 assertEquals(0, bb.getShort());
156 assertEquals(55, bb.getInt());
158 mnBuilder.setAuthenticationData(new byte[0]);
160 bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
161 bb.position(bb.position() + 14); // jump to AuthenticationDataLength
162 assertEquals(0, bb.getShort());
163 assertEquals(55, bb.getInt());
167 public void serialize__NoPrefixInEidToLocator() throws Exception {
168 MapNotifyBuilder mnBuilder = new MapNotifyBuilder();
169 mnBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
170 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
171 new MappingRecordBuilder().build()).build());
172 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord
173 (new MappingRecordBuilder().setEid(null).build()).build());
174 mnBuilder.getMappingRecordItem().add(new MappingRecordItemBuilder().setMappingRecord(
175 new MappingRecordBuilder().setEid(LispAddressUtil.getNoAddressEid()).build()).build());
177 ByteBuffer bb = MapNotifySerializer.getInstance().serialize(mnBuilder.build());
178 bb.position(bb.position() + 16); // jump to first record prefix AFI
179 assertEquals(0, bb.getShort());
181 bb.position(bb.position() + 10); // jump to second record prefix AFI
182 assertEquals(0, bb.getShort());
184 bb.position(bb.position() + 10); // jump to third record prefix AFI
185 assertEquals(0, bb.getShort());
189 public void deserialize__MultipleRecords() throws Exception {
190 // LISP(Type = 4 Map-Notify, I=1
192 // EID prefixes: 153.16.254.1 -- 152.16.254.1 -- 151.16.254.1 --
194 // Local RLOCs: 192.168.136.10 -- 192.168.136.11 -- 192.168.136.12 --
197 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 "
199 + "04 " // Record count
200 + "FF BB 00 00 00 00 00 00 00 01 00 14 87 c1 33 cd " //
201 + "d1 1e bc 80 fd 3e 71 11 81 17 40 74 26 25 44 bd " //
202 + "00 00 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " // Record
204 + "ff 00 00 05 00 01 c0 a8 88 0a " // contd
205 + "00 00 00 0a 01 20 10 00 00 00 00 01 98 10 fe 01 01 64 " // Record
207 + "ff 00 00 05 00 01 c0 a8 88 0b " // contd
208 + "00 00 00 0a 01 20 10 00 00 00 00 01 97 10 fe 01 01 64 " // Record
210 + "ff 00 00 05 00 01 c0 a8 88 0c " // contd
211 + "00 00 00 0a 01 20 10 00 00 00 00 01 96 10 fe 01 01 64 " // Record
213 + "ff 00 00 05 00 01 c0 a8 88 0d " // contd
216 assertEquals(4, mn.getMappingRecordItem().size());
217 assertEquals(LispAddressUtil.asIpv4PrefixEid("153.16.254.1/32"), mn.getMappingRecordItem().get(0)
218 .getMappingRecord().getEid());
219 assertEquals(LispAddressUtil.asIpv4PrefixEid("151.16.254.1/32"), mn.getMappingRecordItem().get(2)
220 .getMappingRecord().getEid());
221 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.11"), mn.getMappingRecordItem().get(1)
222 .getMappingRecord().getLocatorRecord().get(0).getRloc());
223 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.13"), mn.getMappingRecordItem().get(3)
224 .getMappingRecord().getLocatorRecord().get(0).getRloc());
228 public void deserialize__Locators() throws Exception {
229 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 01 01 "
231 + "FF BB 00 00 00 00 00 00 00 01 00 14 f1 b8 ab f0 " //
232 + "66 bb 2e ef 12 70 74 46 6f 6b 8e ca bf 1e 68 40 " //
234 + "03 " // Locator Count
235 + "20 10 00 00 00 00 01 99 10 fe 01 "
237 + "01 64 1f 00 " // priorities + weights
239 + "00 01 c0 a8 88 0a " // Locator
241 + "67 00 30 34 " // priorities + weights
243 + "00 01 cc aa AA 11 " // Locator
245 + "60 11 34 A4 " // priorities + weights
247 + "00 01 c0 a8 88 0a " // Locator
250 assertEquals(1, mn.getMappingRecordItem().size());
251 MappingRecordItem eidToLocator = mn.getMappingRecordItem().get(0);
252 assertEquals(3, eidToLocator.getMappingRecord().getLocatorRecord().size());
253 LocatorRecord loc0 = eidToLocator.getMappingRecord().getLocatorRecord().get(0);
254 LocatorRecord loc1 = eidToLocator.getMappingRecord().getLocatorRecord().get(1);
255 LocatorRecord loc2 = eidToLocator.getMappingRecord().getLocatorRecord().get(2);
256 assertEquals((byte) 0x01, loc0.getPriority().byteValue());
257 assertEquals((byte) 0x67, loc1.getPriority().byteValue());
258 assertEquals((byte) 0x60, loc2.getPriority().byteValue());
260 assertEquals((byte) 0x64, loc0.getWeight().byteValue());
261 assertEquals((byte) 0x00, loc1.getWeight().byteValue());
262 assertEquals((byte) 0x11, loc2.getWeight().byteValue());
264 assertEquals((byte) 0x1F, loc0.getMulticastPriority().byteValue());
265 assertEquals((byte) 0x30, loc1.getMulticastPriority().byteValue());
266 assertEquals((byte) 0x34, loc2.getMulticastPriority().byteValue());
268 assertEquals((byte) 0x00, loc0.getMulticastWeight().byteValue());
269 assertEquals((byte) 0x34, loc1.getMulticastWeight().byteValue());
270 assertEquals((byte) 0xA4, loc2.getMulticastWeight().byteValue());
272 assertTrue(loc0.isLocalLocator());
273 assertFalse(loc1.isLocalLocator());
274 assertFalse(loc2.isLocalLocator());
276 assertFalse(loc0.isRlocProbed());
277 assertTrue(loc1.isRlocProbed());
278 assertTrue(loc2.isRlocProbed());
280 assertTrue(loc0.isRouted());
281 assertFalse(loc1.isRouted());
282 assertTrue(loc2.isRouted());
284 assertEquals(LispAddressUtil.asIpv4Rloc("192.168.136.10"), loc0.getRloc());
285 assertEquals(LispAddressUtil.asIpv4Rloc("204.170.170.17"), loc1.getRloc());
289 public void deserialize__SomeEidToLocatorFiels() throws Exception {
290 // LISP(Type = 4 Map-Notify, I=0
292 // EID prefixes: 153.16.254.1 -- 152.16.254.1 -- 151.16.254.1 --
294 // Local RLOCs: 192.168.136.10 -- 192.168.136.11 -- 192.168.136.12 --
297 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 "
299 + "04 " // Record count
300 + "FF BB 00 00 00 00 00 00 00 01 00 14 b9 cd 7b 89 " //
301 + "65 c2 56 03 be dd 81 20 47 e5 c3 4f 56 02 e1 59 " //
302 + "00 00 00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " // Record
304 + "ff 00 00 05 00 01 c0 a8 88 0a " // contd
305 + "00 00 00 0b 01 17 50 00 01 11 00 01 98 10 fe 01 01 64 " // Record
307 + "ff 00 00 05 00 01 c0 a8 88 0b " // contd
308 + "00 00 00 0c 01 20 00 00 02 22 00 01 97 10 fe 01 01 64 " // Record
310 + "ff 00 00 05 00 01 c0 a8 88 0c " // contd
311 + "00 00 00 0d 01 20 20 00 03 33 00 01 96 10 fe 01 01 64 " // Record
313 + "ff 00 00 05 00 01 c0 a8 88 0d " // contd
316 assertEquals(4, mn.getMappingRecordItem().size());
318 MappingRecord record0 = mn.getMappingRecordItem().get(0).getMappingRecord();
319 MappingRecord record1 = mn.getMappingRecordItem().get(1).getMappingRecord();
320 MappingRecord record2 = mn.getMappingRecordItem().get(2).getMappingRecord();
321 MappingRecord record3 = mn.getMappingRecordItem().get(3).getMappingRecord();
323 assertEquals(10, record0.getRecordTtl().intValue());
324 assertEquals(13, record3.getRecordTtl().intValue());
326 assertEquals(32, record0.getMaskLength().intValue());
327 assertEquals(23, record1.getMaskLength().intValue());
329 assertEquals(Action.NoAction, record0.getAction());
330 assertEquals(Action.SendMapRequest, record1.getAction());
331 assertEquals(Action.NoAction, record2.getAction());
332 assertEquals(Action.NativelyForward, record3.getAction());
334 assertTrue(record0.isAuthoritative());
335 assertTrue(record1.isAuthoritative());
336 assertFalse(record2.isAuthoritative());
337 assertFalse(record3.isAuthoritative());
339 assertEquals(0x000, record0.getMapVersion().shortValue());
340 assertEquals(0x111, record1.getMapVersion().shortValue());
341 assertEquals(0x222, record2.getMapVersion().shortValue());
342 assertEquals(0x333, record3.getMapVersion().shortValue());
346 public void deserialize__IllegalAction() throws Exception {
347 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 01 01 FF BB "
349 + "00 00 00 00 00 00 00 01 00 14 ec 47 1e 53 25 91 " //
350 + "2f 68 10 75 13 dd 2c e8 6e 3c ac 94 ed e4 00 00 " //
351 + "00 0a 01 20 F0 00 00 00 00 01 99 10 fe 01 01 64 " //
352 + "ff 00 00 05 00 01 c0 a8 88 0a"));
354 assertEquals(1, mn.getMappingRecordItem().size());
355 assertEquals(Action.NoAction, mn.getMappingRecordItem().get(0).getMappingRecord().getAction());
358 @Test(expected = LispSerializationException.class)
359 public void deserialize_WrongAuthenticationLength() throws Exception {
360 // LISP(Type = 4 Map-Notify, I=0
362 // Nonce: (something)
364 // AuthDataLength: 20 Data:
365 // e8:f5:0b:c5:c5:f2:b0:21:27:a8:a5:68:89:ec
366 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
368 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
369 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
371 MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("48 00 00 01 FF BB "
373 + "00 00 00 00 00 00 00 00 00 14 e8 f5 0b c5 c5 f2 " //
374 + "b0 21 27 a8 21 a5 68 89 ec 00 00 " //
375 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
376 + "ff 00 00 05 00 01 c0 a8 88 0a"));
380 public void deserialize__SHA1() throws Exception {
381 // LISP(Type = 4 Map-Notify, I=0
383 // Nonce: (something)
385 // AuthDataLength: 20 Data:
386 // b2:dd:1a:25:c0:60:b1:46:e8:dc:6d:a6:ae:2e:92:92:a6:ca:b7:9d
387 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
389 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
390 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
392 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 01 FF BB "
394 + "00 00 00 00 00 00 00 01 00 14 2c 61 b9 c9 9a 20 " //
395 + "ba d8 f5 40 d3 55 6f 5f 6e 5a b2 0a bf b5 00 00 " //
396 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
397 + "ff 00 00 05 00 01 c0 a8 88 0a"));
399 assertFalse(mn.isXtrSiteIdPresent());
401 assertEquals(1, mn.getMappingRecordItem().size());
402 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
403 assertEquals(0x0001, mn.getKeyId().shortValue());
404 byte[] expectedAuthenticationData = { (byte) 0x2c, (byte) 0x61, (byte) 0xb9, (byte) 0xc9, (byte) 0x9a, (byte) 0x20, (byte) 0xba, (byte) 0xd8, //
405 (byte) 0xf5, (byte) 0x40, (byte) 0xd3, (byte) 0x55, (byte) 0x6f, (byte) 0x5f, (byte) 0x6e, (byte) 0x5a, //
406 (byte) 0xb2, (byte) 0x0a, (byte) 0xbf, (byte) 0xb5 };
407 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());
411 public void deserialize__SHA256() throws Exception {
412 // LISP(Type = 4 Map-Notify, I=0
414 // Nonce: (something)
416 // AuthDataLength: 32 Data:
417 // 70 30 d4 c6 10 44 0d 83 be 4d bf fd a9 8c 57 6d 68 a5 bf 32 11 c9 7b
418 // 58 c4 b9 9f 06 11 23 b9 38
419 // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
421 // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
422 // Priority/Weight: 1/100, Multicast Priority/Weight: 255/0
424 MapNotify mn = MapNotifySerializer.getInstance().deserialize(hexToByteBuffer("40 00 00 01 FF BB "
426 + "00 00 00 00 00 00 00 02 00 20 70 30 d4 c6 10 44 0d 83 be 4d bf fd a9 8c 57 6d 68 a5 bf 32 "
428 + "11 c9 7b 58 c4 b9 9f 06 11 23 b9 38 00 00 " //
429 + "00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
430 + "ff 00 00 05 00 01 c0 a8 88 0a"));
432 assertFalse(mn.isXtrSiteIdPresent());
434 assertEquals(1, mn.getMappingRecordItem().size());
435 assertEquals(0xFFBB000000000000L, mn.getNonce().longValue());
436 assertEquals(0x0002, mn.getKeyId().shortValue());
437 byte[] expectedAuthenticationData = { (byte) 0x70, (byte) 0x30, (byte) 0xd4, (byte) 0xc6, (byte) 0x10, (byte) 0x44, (byte) 0x0d, (byte) 0x83,
438 (byte) 0xbe, (byte) 0x4d, (byte) 0xbf, (byte) 0xfd, (byte) 0xa9, (byte) 0x8c, (byte) 0x57, (byte) 0x6d, (byte) 0x68, (byte) 0xa5,
439 (byte) 0xbf, (byte) 0x32, (byte) 0x11, (byte) 0xc9, (byte) 0x7b, (byte) 0x58, (byte) 0xc4, (byte) 0xb9, (byte) 0x9f, (byte) 0x06,
440 (byte) 0x11, (byte) 0x23, (byte) 0xb9, (byte) 0x38 };
441 ArrayAssert.assertEquals(expectedAuthenticationData, mn.getAuthenticationData());