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.LispAddressUtil;
22 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
23 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4;
24 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv4Prefix;
25 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.lisp.address.types.rev151105.lisp.address.address.Ipv6;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.MapReply;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecord;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.locatorrecords.LocatorRecordBuilder;
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;
33 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapreplymessage.MapReplyBuilder;
35 public class MapReplySerializationTest extends BaseTestCase {
39 public void todo() throws Exception {
40 fail("support no eid to locator???");
41 fail("Validation of values in setters (map-version)");
42 fail("Non NPE for no locator in LocatorRecord.serialize");
46 public void serialize__SomeFlags() throws Exception {
47 MapReplyBuilder mr = new MapReplyBuilder();
48 mr.setMappingRecordItem(new ArrayList<MappingRecordItem>());
49 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
50 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
51 mr.getMappingRecordItem().add(
52 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
54 mr.setEchoNonceEnabled(false);
56 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
57 byte firstByte = packet.get(0);
58 assertHexEquals((byte) 0x28, firstByte);
61 mr.setEchoNonceEnabled(true);
63 packet = MapReplySerializer.getInstance().serialize(mr.build());
64 firstByte = packet.get(0);
65 assertHexEquals((byte) 0x24, firstByte);
69 public void deserialize__SomeFlags() throws Exception {
71 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
73 + "00 00 00 00 00 00"));
74 assertEquals(true, mr.isProbe());
75 assertEquals(false, mr.isEchoNonceEnabled());
76 assertEquals(true, mr.isSecurityEnabled());
80 public void deserialize__All() throws Exception {
81 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
83 + "00 00 00 00 00 02 00 00 " //
84 + "00 02 02 20 00 00 00 00 " //
85 + "00 01 01 02 03 04 01 02 " //
86 + "03 04 00 06 00 01 0a 0a " //
87 + "0a 0a 04 03 02 01 00 01 " //
88 + "00 02 00 01 00 02 00 03 " //
89 + "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"));
90 assertEquals(2, mr.getNonce().longValue());
91 assertEquals("1.2.3.4/32", ((Ipv4Prefix) mr.getMappingRecordItem().get(0)
92 .getMappingRecord().getEid().getAddress()).getIpv4Prefix().getValue());
93 // XXX Why here normalized and other cases not normalized?
94 assertEquals("4.3.0.0/16", ((Ipv4Prefix) mr.getMappingRecordItem().get(1)
95 .getMappingRecord().getEid().getAddress()).getIpv4Prefix().getValue());
96 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().isAuthoritative());
97 assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().isAuthoritative());
98 assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
99 assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
100 assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
101 assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
102 assertEquals(32, mr.getMappingRecordItem().get(0).getMappingRecord().getMaskLength().shortValue());
103 assertEquals(16, mr.getMappingRecordItem().get(1).getMappingRecord().getMaskLength().shortValue());
104 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
105 assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
106 assertEquals("1:2:3:4:5:6:7:8", ((Ipv6) mr.getMappingRecordItem().get(0).getMappingRecord()
107 .getLocatorRecord().get(1).getRloc().getAddress()).getIpv6().getValue());
108 assertEquals("10.10.10.10", ((Ipv4) mr.getMappingRecordItem().get(0).getMappingRecord()
109 .getLocatorRecord().get(0).getRloc().getAddress()).getIpv4().getValue());
110 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getPriority().byteValue());
111 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getWeight().byteValue());
112 assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getMulticastPriority().byteValue());
113 assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).getMulticastWeight().byteValue());
114 assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).getPriority().byteValue());
115 assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).getWeight().byteValue());
116 assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).getMulticastPriority().byteValue());
117 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).getMulticastWeight().byteValue());
118 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).isLocalLocator());
119 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).isRlocProbed());
120 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0).isRouted());
121 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).isLocalLocator());
122 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).isRlocProbed());
123 assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).isRouted());
127 public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
128 MapReplyBuilder mrBuilder = new MapReplyBuilder();
129 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
130 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
131 recordBuilder.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:8/128"));
132 mrBuilder.getMappingRecordItem().add(
133 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
135 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("8.2.4.5/32"));
136 mrBuilder.getMappingRecordItem().add(
137 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
139 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
140 assertEquals(2, packet.get(3));
142 packet.position(24); // EID in first record
143 byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
144 byte[] actual = new byte[16];
146 ArrayAssert.assertEquals(expected, actual);
148 packet.position(packet.position() + 12); // EID in second record
149 assertEquals(0x08020405, packet.getInt());
153 public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
154 MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
156 + "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"));
157 assertEquals("1.2.3.4/32", ((Ipv4Prefix) mr.getMappingRecordItem().get(0)
158 .getMappingRecord().getEid().getAddress()).getIpv4Prefix().getValue());
159 // XXX Why here normalized and other cases not normalized?
160 assertEquals("4.3.0.0/16", ((Ipv4Prefix) mr.getMappingRecordItem().get(1)
161 .getMappingRecord().getEid().getAddress()).getIpv4Prefix().getValue());
162 assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().isAuthoritative());
163 assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().isAuthoritative());
164 assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
165 assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
166 assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
167 assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
168 assertEquals(32, mr.getMappingRecordItem().get(0).getMappingRecord().getMaskLength().shortValue());
169 assertEquals(16, mr.getMappingRecordItem().get(1).getMappingRecord().getMaskLength().shortValue());
170 assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
171 assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
175 public void serialize__EidRecordDefaultAction() throws Exception {
176 MapReplyBuilder mrBuilder = new MapReplyBuilder();
177 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
178 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
179 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
180 mrBuilder.getMappingRecordItem().add(
181 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
183 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
186 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
190 public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
191 MapReplyBuilder mrBuilder = new MapReplyBuilder();
192 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
193 MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
194 recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
195 recordBuilder.setAction(null);
196 mrBuilder.getMappingRecordItem().add(
197 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
199 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
202 assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
206 public void serialize__EidRecordFields() throws Exception {
207 MapReplyBuilder mrBuilder = new MapReplyBuilder();
208 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
210 MappingRecordBuilder eidToLocator1 = new MappingRecordBuilder();
211 eidToLocator1.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
212 eidToLocator1.setRecordTtl(7);
213 eidToLocator1.setAction(Action.SendMapRequest);
214 eidToLocator1.setAuthoritative(true);
215 eidToLocator1.setMapVersion((short) 3072);
216 mrBuilder.getMappingRecordItem().add(
217 new MappingRecordItemBuilder().setMappingRecord(eidToLocator1.build()).build());
219 MappingRecordBuilder eidToLocator2 = new MappingRecordBuilder();
220 eidToLocator2.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.7/32"));
221 eidToLocator2.setRecordTtl(1000000);
222 eidToLocator2.setAction(Action.Drop);
223 eidToLocator2.setAuthoritative(false);
224 eidToLocator2.setMapVersion((short) 29);
225 mrBuilder.getMappingRecordItem().add(
226 new MappingRecordItemBuilder().setMappingRecord(eidToLocator2.build()).build());
228 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
230 packet.position(12); // First record
231 assertEquals(7, packet.getInt());
232 packet.position(packet.position() + 2); // skip Locator Count & Mask-len
234 assertHexEquals((byte) 0x50, packet.get());
235 packet.position(packet.position() + 1); // skip Reserved byte
236 assertEquals((short) 3072, packet.getShort());
238 packet.position(packet.position() + 6); // Second record
239 assertEquals(1000000, packet.getInt());
240 packet.position(packet.position() + 2); // skip Locator Count & Mask-len
242 assertHexEquals((byte) 0x60, packet.get());
243 packet.position(packet.position() + 1); // skip Reserved byte
244 assertEquals((short) 29, packet.getShort());
248 public void serialize__LocatorRecordFields() throws Exception {
249 MapReplyBuilder mrBuilder = new MapReplyBuilder();
250 mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
252 MappingRecordBuilder eidToLocatorBuilder = new MappingRecordBuilder();
253 eidToLocatorBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
254 eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
256 LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
257 locatorBuilder1.setPriority((short) 0xF3);
258 locatorBuilder1.setWeight((short) 0xF6);
259 locatorBuilder1.setMulticastPriority((short) 0xA3);
260 locatorBuilder1.setMulticastWeight((short) 0x06);
261 locatorBuilder1.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.1"));
262 locatorBuilder1.setLocalLocator(true);
263 locatorBuilder1.setRlocProbed(true);
264 locatorBuilder1.setRouted(true);
265 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
267 LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
268 locatorBuilder2.setPriority((short) 0x03);
269 locatorBuilder2.setWeight((short) 0x06);
270 locatorBuilder2.setMulticastPriority((short) 0x03);
271 locatorBuilder2.setMulticastWeight((short) 0xF1);
272 locatorBuilder2.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.2"));
273 locatorBuilder2.setLocalLocator(false);
274 locatorBuilder2.setRlocProbed(false);
275 locatorBuilder2.setRouted(false);
276 eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
278 mrBuilder.getMappingRecordItem().add(
279 new MappingRecordItemBuilder().setMappingRecord(eidToLocatorBuilder.build()).build());
281 ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
283 packet.position(12 + 16); // First locator record
284 assertHexEquals((byte) 0xF3, packet.get());
285 assertHexEquals((byte) 0xF6, packet.get());
286 assertHexEquals((byte) 0xA3, packet.get());
287 assertHexEquals((byte) 0x06, packet.get());
288 packet.position(packet.position() + 1);
289 assertHexEquals((byte) 0x07, packet.get());
291 packet.position(packet.position() + 6); // Second locator record
292 assertHexEquals((byte) 0x03, packet.get());
293 assertHexEquals((byte) 0x06, packet.get());
294 assertHexEquals((byte) 0x03, packet.get());
295 assertHexEquals((byte) 0xF1, packet.get());
296 packet.position(packet.position() + 1);
297 assertHexEquals((byte) 0x00, packet.get());