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;
13 import java.nio.ByteBuffer;
14 import java.util.ArrayList;
16 import junitx.framework.ArrayAssert;
18 import org.junit.Ignore;
19 import org.junit.Test;
20 import org.opendaylight.lispflowmapping.lisp.serializer.MapReplySerializer;
21 import org.opendaylight.lispflowmapping.lisp.util.LispAFIConvertor;
22 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.EidToLocatorRecord.Action;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.MapReply;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidtolocatorrecords.EidToLocatorRecord;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.eidtolocatorrecords.EidToLocatorRecordBuilder;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.locatorrecords.LocatorRecord;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.locatorrecords.LocatorRecordBuilder;
29 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev150820.mapreplymessage.MapReplyBuilder;
31 public class MapReplySerializationTest extends BaseTestCase {
35 public void todo() throws Exception {
36 fail("support no eid to locator???");
37 fail("Validation of values in setters (map-version)");
38 fail("Non NPE for no locator in LocatorRecord.serialize");
42 public void serialize__SomeFlags() throws Exception {
43 MapReplyBuilder mr = new MapReplyBuilder();
44 mr.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
45 mr.getEidToLocatorRecord().add(
46 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")))
49 mr.setEchoNonceEnabled(false);
51 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
52 byte firstByte = packet.get(0);
53 assertHexEquals((byte) 0x28, firstByte);
56 mr.setEchoNonceEnabled(true);
58 packet = MapReplySerializer.getInstance().serialize(mr.build());
59 firstByte = packet.get(0);
60 assertHexEquals((byte) 0x24, firstByte);
64 public void deserialize__SomeFlags() throws Exception {
66 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
68 + "00 00 00 00 00 00"));
69 assertEquals(true, mr.isProbe());
70 assertEquals(false, mr.isEchoNonceEnabled());
71 assertEquals(true, mr.isSecurityEnabled());
75 public void deserialize__All() throws Exception {
76 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
78 + "00 00 00 00 00 02 00 00 " //
79 + "00 02 02 20 00 00 00 00 " //
80 + "00 01 01 02 03 04 01 02 " //
81 + "03 04 00 06 00 01 0a 0a " //
82 + "0a 0a 04 03 02 01 00 01 " //
83 + "00 02 00 01 00 02 00 03 " //
84 + "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"));
85 assertEquals(2, mr.getNonce().longValue());
86 assertEquals(LispAFIConvertor.asIPv4Address(("1.2.3.4")), mr.getEidToLocatorRecord().get(0)
87 .getLispAddressContainer());
88 assertEquals(LispAFIConvertor.asIPv4Prefix(("4.3.2.1"), 16), mr.getEidToLocatorRecord().get(1)
89 .getLispAddressContainer());
90 assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
91 assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
92 assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
93 assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
94 assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
95 assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
96 assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
97 assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
98 assertEquals(2, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
99 assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
100 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("1:2:3:4:5:6:7:8"))), mr.getEidToLocatorRecord().get(0)
101 .getLocatorRecord().get(1).getLispAddressContainer());
102 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("10.10.10.10"))), mr.getEidToLocatorRecord().get(0)
103 .getLocatorRecord().get(0).getLispAddressContainer());
104 assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getPriority().byteValue());
105 assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getWeight().byteValue());
106 assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastPriority().byteValue());
107 assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastWeight().byteValue());
108 assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getPriority().byteValue());
109 assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getWeight().byteValue());
110 assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastPriority().byteValue());
111 assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastWeight().byteValue());
112 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isLocalLocator());
113 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRlocProbed());
114 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRouted());
115 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isLocalLocator());
116 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRlocProbed());
117 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRouted());
121 public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
122 MapReplyBuilder mrBuilder = new MapReplyBuilder();
123 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
124 mrBuilder.getEidToLocatorRecord().add(
125 new EidToLocatorRecordBuilder().setLispAddressContainer(
126 LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("0:0:0:0:0:0:0:8")))).build());
127 mrBuilder.getEidToLocatorRecord().add(
128 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("8.2.4.5")))
131 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
132 assertEquals(2, packet.get(3));
134 packet.position(24); /* EID in first record */
135 byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
136 byte[] actual = new byte[16];
138 ArrayAssert.assertEquals(expected, actual);
140 packet.position(packet.position() + 12); /* EID in second record */
141 assertEquals(0x08020405, packet.getInt());
145 public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
146 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
148 + "00 00 00 00 00 00 00 00 00 01 00 20 00 00 00 00 00 01 01 02 03 04 00 00 00 00 00 10 30 00 00 02 00 01 04 03 00 00"));
149 assertEquals(LispAFIConvertor.asIPv4Address(("1.2.3.4")), mr.getEidToLocatorRecord().get(0)
150 .getLispAddressContainer());
151 assertEquals(LispAFIConvertor.asIPv4Prefix("4.3.2.1", 16), mr.getEidToLocatorRecord().get(1)
152 .getLispAddressContainer());
153 assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
154 assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
155 assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
156 assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
157 assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
158 assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
159 assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
160 assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
161 assertEquals(1, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
162 assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
166 public void serialize__EidRecordDefaultAction() throws Exception {
167 MapReplyBuilder mrBuilder = new MapReplyBuilder();
168 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
169 mrBuilder.getEidToLocatorRecord().add(
170 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1"))))
173 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
176 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
180 public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
181 MapReplyBuilder mrBuilder = new MapReplyBuilder();
182 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
183 mrBuilder.getEidToLocatorRecord().add(
184 new EidToLocatorRecordBuilder().setAction(null)
185 .setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1")))).build());
187 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
190 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
194 public void serialize__EidRecordFields() throws Exception {
195 MapReplyBuilder mrBuilder = new MapReplyBuilder();
196 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
198 EidToLocatorRecordBuilder eidToLocator1 = new EidToLocatorRecordBuilder();
199 eidToLocator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
200 eidToLocator1.setRecordTtl(7);
201 eidToLocator1.setAction(Action.SendMapRequest);
202 eidToLocator1.setAuthoritative(true);
203 eidToLocator1.setMapVersion((short) 3072);
204 mrBuilder.getEidToLocatorRecord().add(eidToLocator1.build());
206 EidToLocatorRecordBuilder eidToLocator2 = new EidToLocatorRecordBuilder();
207 eidToLocator2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.7")));
208 eidToLocator2.setRecordTtl(1000000);
209 eidToLocator2.setAction(Action.Drop);
210 eidToLocator2.setAuthoritative(false);
211 eidToLocator2.setMapVersion((short) 29);
212 mrBuilder.getEidToLocatorRecord().add(eidToLocator2.build());
214 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
216 packet.position(12); /* First record */
217 assertEquals(7, packet.getInt());
218 packet.position(packet.position() + 2); /*
219 * skip Locator Count & Mask-len
221 assertHexEquals((byte) 0x50, packet.get());
222 packet.position(packet.position() + 1); /* skip Reserved byte */
223 assertEquals((short) 3072, packet.getShort());
225 packet.position(packet.position() + 6); /* Second record */
226 assertEquals(1000000, packet.getInt());
227 packet.position(packet.position() + 2); /*
228 * skip Locator Count & Mask-len
230 assertHexEquals((byte) 0x60, packet.get());
231 packet.position(packet.position() + 1); /* skip Reserved byte */
232 assertEquals((short) 29, packet.getShort());
236 public void serialize__LocatorRecordFields() throws Exception {
237 MapReplyBuilder mrBuilder = new MapReplyBuilder();
238 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
240 EidToLocatorRecordBuilder eidToLocatorBuilder = new EidToLocatorRecordBuilder();
241 eidToLocatorBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
242 eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
244 LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
245 locatorBuilder1.setPriority((short) 0xF3);
246 locatorBuilder1.setWeight((short) 0xF6);
247 locatorBuilder1.setMulticastPriority((short) 0xA3);
248 locatorBuilder1.setMulticastWeight((short) 0x06);
249 locatorBuilder1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
250 locatorBuilder1.setLocalLocator(true);
251 locatorBuilder1.setRlocProbed(true);
252 locatorBuilder1.setRouted(true);
253 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
255 LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
256 locatorBuilder2.setPriority((short) 0x03);
257 locatorBuilder2.setWeight((short) 0x06);
258 locatorBuilder2.setMulticastPriority((short) 0x03);
259 locatorBuilder2.setMulticastWeight((short) 0xF1);
260 locatorBuilder2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.2")));
261 locatorBuilder2.setLocalLocator(false);
262 locatorBuilder2.setRlocProbed(false);
263 locatorBuilder2.setRouted(false);
264 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
266 mrBuilder.getEidToLocatorRecord().add(eidToLocatorBuilder.build());
268 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
270 packet.position(12 + 16); /* First locator record */
271 assertHexEquals((byte) 0xF3, packet.get());
272 assertHexEquals((byte) 0xF6, packet.get());
273 assertHexEquals((byte) 0xA3, packet.get());
274 assertHexEquals((byte) 0x06, packet.get());
275 packet.position(packet.position() + 1);
276 assertHexEquals((byte) 0x07, packet.get());
278 packet.position(packet.position() + 6); /* Second locator record */
279 assertHexEquals((byte) 0x03, packet.get());
280 assertHexEquals((byte) 0x06, packet.get());
281 assertHexEquals((byte) 0x03, packet.get());
282 assertHexEquals((byte) 0xF1, packet.get());
283 packet.position(packet.position() + 1);
284 assertHexEquals((byte) 0x00, packet.get());