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 availabl at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.lispflowmapping.implementation.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.implementation.util.LispAFIConvertor;
21 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.EidToLocatorRecord.Action;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapReply;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecord;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecordBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecord;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecordBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.mapreplymessage.MapReplyBuilder;
30 public class MapReplySerializationTest extends BaseTestCase {
34 public void todo() throws Exception {
35 fail("support no eid to locator???");
36 fail("Validation of values in setters (map-version)");
37 fail("Non NPE for no locator in LocatorRecord.serialize");
41 public void serialize__SomeFlags() throws Exception {
42 MapReplyBuilder mr = new MapReplyBuilder();
43 mr.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
44 mr.getEidToLocatorRecord().add(
45 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")))
48 mr.setEchoNonceEnabled(false);
50 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
51 byte firstByte = packet.get(0);
52 assertHexEquals((byte) 0x28, firstByte);
55 mr.setEchoNonceEnabled(true);
57 packet = MapReplySerializer.getInstance().serialize(mr.build());
58 firstByte = packet.get(0);
59 assertHexEquals((byte) 0x24, firstByte);
63 public void deserialize__SomeFlags() throws Exception {
65 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
67 + "00 00 00 00 00 00"));
68 assertEquals(true, mr.isProbe());
69 assertEquals(false, mr.isEchoNonceEnabled());
70 assertEquals(true, mr.isSecurityEnabled());
74 public void deserialize__All() throws Exception {
75 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
77 + "00 00 00 00 00 02 00 00 " //
78 + "00 02 02 20 00 00 00 00 " //
79 + "00 01 01 02 03 04 01 02 " //
80 + "03 04 00 06 00 01 0a 0a " //
81 + "0a 0a 04 03 02 01 00 01 " //
82 + "00 02 00 01 00 02 00 03 " //
83 + "00 04 00 05 00 06 00 07 00 08 00 00 00 00 00 10 30 00 00 02 00 01 04 03 02 01"));
84 assertEquals(2, mr.getNonce().longValue());
85 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("1.2.3.4"))), mr.getEidToLocatorRecord().get(0)
86 .getLispAddressContainer());
87 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("4.3.2.1"))), mr.getEidToLocatorRecord().get(1)
88 .getLispAddressContainer());
89 assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
90 assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
91 assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
92 assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
93 assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
94 assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
95 assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
96 assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
97 assertEquals(2, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
98 assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
99 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("1:2:3:4:5:6:7:8"))), mr.getEidToLocatorRecord().get(0)
100 .getLocatorRecord().get(1).getLispAddressContainer());
101 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("10.10.10.10"))), mr.getEidToLocatorRecord().get(0)
102 .getLocatorRecord().get(0).getLispAddressContainer());
103 assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getPriority().byteValue());
104 assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getWeight().byteValue());
105 assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastPriority().byteValue());
106 assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastWeight().byteValue());
107 assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getPriority().byteValue());
108 assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getWeight().byteValue());
109 assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastPriority().byteValue());
110 assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastWeight().byteValue());
111 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isLocalLocator());
112 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRlocProbed());
113 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRouted());
114 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isLocalLocator());
115 assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRlocProbed());
116 assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRouted());
120 public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
121 MapReplyBuilder mrBuilder = new MapReplyBuilder();
122 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
123 mrBuilder.getEidToLocatorRecord().add(
124 new EidToLocatorRecordBuilder().setLispAddressContainer(
125 LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("0:0:0:0:0:0:0:8")))).build());
126 mrBuilder.getEidToLocatorRecord().add(
127 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("8.2.4.5")))
130 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
131 assertEquals(2, packet.get(3));
133 packet.position(24); /* EID in first record */
134 byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
135 byte[] actual = new byte[16];
137 ArrayAssert.assertEquals(expected, actual);
139 packet.position(packet.position() + 12); /* EID in second record */
140 assertEquals(0x08020405, packet.getInt());
144 public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
145 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
147 + "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 02 01"));
148 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("1.2.3.4"))), mr.getEidToLocatorRecord().get(0)
149 .getLispAddressContainer());
150 assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("4.3.2.1"))), mr.getEidToLocatorRecord().get(1)
151 .getLispAddressContainer());
152 assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
153 assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
154 assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
155 assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
156 assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
157 assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
158 assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
159 assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
160 assertEquals(1, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
161 assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
165 public void serialize__EidRecordDefaultAction() throws Exception {
166 MapReplyBuilder mrBuilder = new MapReplyBuilder();
167 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
168 mrBuilder.getEidToLocatorRecord().add(
169 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1"))))
172 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
175 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
179 public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
180 MapReplyBuilder mrBuilder = new MapReplyBuilder();
181 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
182 mrBuilder.getEidToLocatorRecord().add(
183 new EidToLocatorRecordBuilder().setAction(null)
184 .setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1")))).build());
186 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
189 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
193 public void serialize__EidRecordFields() throws Exception {
194 MapReplyBuilder mrBuilder = new MapReplyBuilder();
195 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
197 EidToLocatorRecordBuilder eidToLocator1 = new EidToLocatorRecordBuilder();
198 eidToLocator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
199 eidToLocator1.setRecordTtl(7);
200 eidToLocator1.setAction(Action.SendMapRequest);
201 eidToLocator1.setAuthoritative(true);
202 eidToLocator1.setMapVersion((short) 3072);
203 mrBuilder.getEidToLocatorRecord().add(eidToLocator1.build());
205 EidToLocatorRecordBuilder eidToLocator2 = new EidToLocatorRecordBuilder();
206 eidToLocator2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.7")));
207 eidToLocator2.setRecordTtl(1000000);
208 eidToLocator2.setAction(Action.Drop);
209 eidToLocator2.setAuthoritative(false);
210 eidToLocator2.setMapVersion((short) 29);
211 mrBuilder.getEidToLocatorRecord().add(eidToLocator2.build());
213 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
215 packet.position(12); /* First record */
216 assertEquals(7, packet.getInt());
217 packet.position(packet.position() + 2); /*
218 * skip Locator Count & Mask-len
220 assertHexEquals((byte) 0x50, packet.get());
221 packet.position(packet.position() + 1); /* skip Reserved byte */
222 assertEquals((short) 3072, packet.getShort());
224 packet.position(packet.position() + 6); /* Second record */
225 assertEquals(1000000, packet.getInt());
226 packet.position(packet.position() + 2); /*
227 * skip Locator Count & Mask-len
229 assertHexEquals((byte) 0x60, packet.get());
230 packet.position(packet.position() + 1); /* skip Reserved byte */
231 assertEquals((short) 29, packet.getShort());
235 public void serialize__LocatorRecordFields() throws Exception {
236 MapReplyBuilder mrBuilder = new MapReplyBuilder();
237 mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
239 EidToLocatorRecordBuilder eidToLocatorBuilder = new EidToLocatorRecordBuilder();
240 eidToLocatorBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
241 eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
243 LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
244 locatorBuilder1.setPriority((short) 0xF3);
245 locatorBuilder1.setWeight((short) 0xF6);
246 locatorBuilder1.setMulticastPriority((short) 0xA3);
247 locatorBuilder1.setMulticastWeight((short) 0x06);
248 locatorBuilder1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
249 locatorBuilder1.setLocalLocator(true);
250 locatorBuilder1.setRlocProbed(true);
251 locatorBuilder1.setRouted(true);
252 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
254 LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
255 locatorBuilder2.setPriority((short) 0x03);
256 locatorBuilder2.setWeight((short) 0x06);
257 locatorBuilder2.setMulticastPriority((short) 0x03);
258 locatorBuilder2.setMulticastWeight((short) 0xF1);
259 locatorBuilder2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.2")));
260 locatorBuilder2.setLocalLocator(false);
261 locatorBuilder2.setRlocProbed(false);
262 locatorBuilder2.setRouted(false);
263 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
265 mrBuilder.getEidToLocatorRecord().add(eidToLocatorBuilder.build());
267 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
269 packet.position(12 + 16); /* First locator record */
270 assertHexEquals((byte) 0xF3, packet.get());
271 assertHexEquals((byte) 0xF6, packet.get());
272 assertHexEquals((byte) 0xA3, packet.get());
273 assertHexEquals((byte) 0x06, packet.get());
274 packet.position(packet.position() + 1);
275 assertHexEquals((byte) 0x07, packet.get());
277 packet.position(packet.position() + 6); /* Second locator record */
278 assertHexEquals((byte) 0x03, packet.get());
279 assertHexEquals((byte) 0x06, packet.get());
280 assertHexEquals((byte) 0x03, packet.get());
281 assertHexEquals((byte) 0xF1, packet.get());
282 packet.position(packet.position() + 1);
283 assertHexEquals((byte) 0x00, packet.get());