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
8 package org.opendaylight.lispflowmapping.serializer;
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
13 import java.nio.ByteBuffer;
14 import java.util.ArrayList;
15 import junitx.framework.ArrayAssert;
16 import org.junit.Ignore;
17 import org.junit.Test;
18 import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
19 import org.opendaylight.lispflowmapping.lisp.util.LispAddressUtil;
20 import org.opendaylight.lispflowmapping.lisp.util.MaskUtil;
21 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4Binary;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv4PrefixBinary;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.binary.address.types.rev160504.augmented.lisp.address.address.Ipv6Binary;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
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.locatorrecords.LocatorRecordBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord.Action;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecordBuilder;
30 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItem;
31 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.list.MappingRecordItemBuilder;
32 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
34 public class MapReplySerializationTest extends BaseTestCase {
38 public void todo() throws Exception {
39 fail("support no eid to locator???");
40 fail("Validation of values in setters (map-version)");
41 fail("Non NPE for no locator in LocatorRecord.serialize");
45 public void serialize__SomeFlags() throws Exception {
46 MapReplyBuilder mr = new MapReplyBuilder();
47 mr.setMappingRecordItem(new ArrayList<MappingRecordItem>());
48 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
49 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
50 mr.getMappingRecordItem().add(
51 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
53 mr.setEchoNonceEnabled(false);
55 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
56 byte firstByte = packet.get(0);
57 assertHexEquals((byte) 0x28, firstByte);
60 mr.setEchoNonceEnabled(true);
62 packet = MapReplySerializer.getInstance().serialize(mr.build());
63 firstByte = packet.get(0);
64 assertHexEquals((byte) 0x24, firstByte);
68 public void deserialize__SomeFlags() throws Exception {
70 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
71 + "00 00 00 00 00 00"));
72 assertEquals(true, mr.isProbe());
73 assertEquals(false, mr.isEchoNonceEnabled());
74 assertEquals(true, mr.isSecurityEnabled());
78 public void deserialize__All() throws Exception {
79 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
80 + "00 00 00 00 00 02 00 00 "
81 + "00 02 02 20 00 00 00 00 "
82 + "00 01 01 02 03 04 01 02 "
83 + "03 04 00 06 00 01 0a 0a "
84 + "0a 0a 04 03 02 01 00 01 "
85 + "00 02 00 01 00 02 00 03 "
86 + "00 04 00 05 00 06 00 07 00 08 00 00 00 00 00 10 30 00 00 02 00 01 04 03 00 00"));
87 assertEquals(2, mr.getNonce().longValue());
88 assertArrayEquals(new byte[] {1, 2, 3, 4}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(0)
89 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
90 // XXX Why here normalized and other cases not normalized?
91 assertArrayEquals(new byte[] {4, 3, 0, 0}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(1)
92 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
93 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().isAuthoritative());
94 assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().isAuthoritative());
95 assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
96 assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
97 assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
98 assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
99 assertEquals(32, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(0).getMappingRecord()
100 .getEid().getAddress()));
101 assertEquals(16, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(1).getMappingRecord()
102 .getEid().getAddress()));
103 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
104 assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
105 assertArrayEquals(new byte[] {0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8},
106 ((Ipv6Binary) mr.getMappingRecordItem().get(0).getMappingRecord()
107 .getLocatorRecord().get(1).getRloc().getAddress()).getIpv6Binary().getValue());
108 assertArrayEquals(new byte[] {10, 10, 10, 10},
109 ((Ipv4Binary) mr.getMappingRecordItem().get(0).getMappingRecord()
110 .getLocatorRecord().get(0).getRloc().getAddress()).getIpv4Binary().getValue());
111 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
112 .getPriority().byteValue());
113 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
114 .getWeight().byteValue());
115 assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
116 .getMulticastPriority().byteValue());
117 assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
118 .getMulticastWeight().byteValue());
119 assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
120 .getPriority().byteValue());
121 assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
122 .getWeight().byteValue());
123 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
124 .getMulticastPriority().byteValue());
125 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
126 .getMulticastWeight().byteValue());
127 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
129 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
131 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
133 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
135 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
137 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).isRouted());
141 public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
142 MapReplyBuilder mrBuilder = new MapReplyBuilder();
143 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
144 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
145 recordBuilder.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:8/128"));
146 mrBuilder.getMappingRecordItem().add(
147 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
149 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("8.2.4.5/32"));
150 mrBuilder.getMappingRecordItem().add(
151 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
153 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
154 assertEquals(2, packet.get(3));
156 packet.position(24); // EID in first record
157 byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
159 byte[] actual = new byte[16];
161 ArrayAssert.assertEquals(expected, actual);
163 packet.position(packet.position() + 12); // EID in second record
164 assertEquals(0x08020405, packet.getInt());
168 public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
169 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
170 + "00 00 00 00 00 00 00 00 00 01 00 20 00 00 00 00 "
171 + "00 01 01 02 03 04 00 00 00 00 00 10 30 00 00 02 00 01 04 03 00 00"));
172 assertArrayEquals(new byte[] {1, 2, 3, 4}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(0)
173 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
174 // XXX Why here normalized and other cases not normalized?
175 assertArrayEquals(new byte[] {4, 3, 0, 0}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(1)
176 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
177 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().isAuthoritative());
178 assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().isAuthoritative());
179 assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
180 assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
181 assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
182 assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
183 assertEquals(32, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(0).getMappingRecord()
184 .getEid().getAddress()));
185 assertEquals(16, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(1).getMappingRecord()
186 .getEid().getAddress()));
187 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
188 assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
192 public void serialize__EidRecordDefaultAction() throws Exception {
193 MapReplyBuilder mrBuilder = new MapReplyBuilder();
194 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
195 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
196 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
197 mrBuilder.getMappingRecordItem().add(
198 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
200 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
203 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
207 public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
208 MapReplyBuilder mrBuilder = new MapReplyBuilder();
209 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
210 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
211 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
212 recordBuilder.setAction(null);
213 mrBuilder.getMappingRecordItem().add(
214 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
216 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
219 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
223 public void serialize__EidRecordFields() throws Exception {
224 MapReplyBuilder mrBuilder = new MapReplyBuilder();
225 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
227 MappingRecordBuilder eidToLocator1 = new MappingRecordBuilder();
228 eidToLocator1.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
229 eidToLocator1.setRecordTtl(7);
230 eidToLocator1.setAction(Action.SendMapRequest);
231 eidToLocator1.setAuthoritative(true);
232 eidToLocator1.setMapVersion((short) 3072);
233 mrBuilder.getMappingRecordItem().add(
234 new MappingRecordItemBuilder().setMappingRecord(eidToLocator1.build()).build());
236 MappingRecordBuilder eidToLocator2 = new MappingRecordBuilder();
237 eidToLocator2.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.7/32"));
238 eidToLocator2.setRecordTtl(1000000);
239 eidToLocator2.setAction(Action.Drop);
240 eidToLocator2.setAuthoritative(false);
241 eidToLocator2.setMapVersion((short) 29);
242 mrBuilder.getMappingRecordItem().add(
243 new MappingRecordItemBuilder().setMappingRecord(eidToLocator2.build()).build());
245 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
247 packet.position(12); // First record
248 assertEquals(7, packet.getInt());
249 packet.position(packet.position() + 2); // skip Locator Count & Mask-len
251 assertHexEquals((byte) 0x50, packet.get());
252 packet.position(packet.position() + 1); // skip Reserved byte
253 assertEquals((short) 3072, packet.getShort());
255 packet.position(packet.position() + 6); // Second record
256 assertEquals(1000000, packet.getInt());
257 packet.position(packet.position() + 2); // skip Locator Count & Mask-len
259 assertHexEquals((byte) 0x60, packet.get());
260 packet.position(packet.position() + 1); // skip Reserved byte
261 assertEquals((short) 29, packet.getShort());
265 public void serialize__LocatorRecordFields() throws Exception {
266 MapReplyBuilder mrBuilder = new MapReplyBuilder();
267 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
269 MappingRecordBuilder eidToLocatorBuilder = new MappingRecordBuilder();
270 eidToLocatorBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
271 eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
273 LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
274 locatorBuilder1.setPriority((short) 0xF3);
275 locatorBuilder1.setWeight((short) 0xF6);
276 locatorBuilder1.setMulticastPriority((short) 0xA3);
277 locatorBuilder1.setMulticastWeight((short) 0x06);
278 locatorBuilder1.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.1"));
279 locatorBuilder1.setLocalLocator(true);
280 locatorBuilder1.setRlocProbed(true);
281 locatorBuilder1.setRouted(true);
282 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
284 LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
285 locatorBuilder2.setPriority((short) 0x03);
286 locatorBuilder2.setWeight((short) 0x06);
287 locatorBuilder2.setMulticastPriority((short) 0x03);
288 locatorBuilder2.setMulticastWeight((short) 0xF1);
289 locatorBuilder2.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.2"));
290 locatorBuilder2.setLocalLocator(false);
291 locatorBuilder2.setRlocProbed(false);
292 locatorBuilder2.setRouted(false);
293 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
295 mrBuilder.getMappingRecordItem().add(
296 new MappingRecordItemBuilder().setMappingRecord(eidToLocatorBuilder.build()).build());
298 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
300 packet.position(12 + 16); // First locator record
301 assertHexEquals((byte) 0xF3, packet.get());
302 assertHexEquals((byte) 0xF6, packet.get());
303 assertHexEquals((byte) 0xA3, packet.get());
304 assertHexEquals((byte) 0x06, packet.get());
305 packet.position(packet.position() + 1);
306 assertHexEquals((byte) 0x07, packet.get());
308 packet.position(packet.position() + 6); // Second locator record
309 assertHexEquals((byte) 0x03, packet.get());
310 assertHexEquals((byte) 0x06, packet.get());
311 assertHexEquals((byte) 0x03, packet.get());
312 assertHexEquals((byte) 0xF1, packet.get());
313 packet.position(packet.position() + 1);
314 assertHexEquals((byte) 0x00, packet.get());