d0a2bfc6474b1d10e8b4a343f3fd68862fce1d27
[lispflowmapping.git] / mappingservice / lisp-proto / src / test / java / org / opendaylight / lispflowmapping / serializer / MapReplySerializationTest.java
1 /*
2  * Copyright (c) 2014 Contextream, Inc. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.lispflowmapping.serializer;
9
10 import static org.junit.Assert.assertArrayEquals;
11 import static org.junit.Assert.assertEquals;
12
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;
33 import org.opendaylight.yangtools.yang.common.Uint8;
34
35 public class MapReplySerializationTest extends BaseTestCase {
36
37     @Test
38     @Ignore
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");
43     }
44
45     @Test
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()).setMappingRecordItemId("xyzzy")
53                     .build());
54         mr.setProbe(true);
55         mr.setEchoNonceEnabled(false);
56
57         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
58         byte firstByte = packet.get(0);
59         assertHexEquals((byte) 0x28, firstByte);
60
61         mr.setProbe(false);
62         mr.setEchoNonceEnabled(true);
63
64         packet = MapReplySerializer.getInstance().serialize(mr.build());
65         firstByte = packet.get(0);
66         assertHexEquals((byte) 0x24, firstByte);
67     }
68
69     @Test
70     public void deserialize__SomeFlags() throws Exception {
71
72         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
73                 + "00 00 00 00 00 00"));
74         assertEquals(true, mr.getProbe());
75         assertEquals(false, mr.getEchoNonceEnabled());
76         assertEquals(true, mr.getSecurityEnabled());
77     }
78
79     @Test
80     public void deserialize__All() throws Exception {
81         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
82                 + "00 00 00 00 00 02 00 00 "
83                 + "00 02 02 20 00 00 00 00 "
84                 + "00 01 01 02 03 04 01 02 "
85                 + "03 04 00 06 00 01 0a 0a "
86                 + "0a 0a 04 03 02 01 00 01 "
87                 + "00 02 00 01 00 02 00 03 "
88                 + "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"));
89         assertEquals(2, mr.getNonce().longValue());
90         assertArrayEquals(new byte[] {1, 2, 3, 4}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(0)
91                 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
92         // XXX Why here normalized and other cases not normalized?
93         assertArrayEquals(new byte[] {4, 3, 0, 0}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(1)
94                 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
95         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getAuthoritative());
96         assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().getAuthoritative());
97         assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
98         assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
99         assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
100         assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
101         assertEquals(32, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(0).getMappingRecord()
102                 .getEid().getAddress()));
103         assertEquals(16, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(1).getMappingRecord()
104                 .getEid().getAddress()));
105         assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
106         assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
107         assertArrayEquals(new byte[] {0, 1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8},
108                 ((Ipv6Binary) mr.getMappingRecordItem().get(0).getMappingRecord()
109                 .getLocatorRecord().get(1).getRloc().getAddress()).getIpv6Binary().getValue());
110         assertArrayEquals(new byte[] {10, 10, 10, 10},
111                 ((Ipv4Binary) mr.getMappingRecordItem().get(0).getMappingRecord()
112                 .getLocatorRecord().get(0).getRloc().getAddress()).getIpv4Binary().getValue());
113         assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
114                 .getPriority().byteValue());
115         assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
116                 .getWeight().byteValue());
117         assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
118                 .getMulticastPriority().byteValue());
119         assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
120                 .getMulticastWeight().byteValue());
121         assertEquals(4, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
122                 .getPriority().byteValue());
123         assertEquals(3, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
124                 .getWeight().byteValue());
125         assertEquals(2, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
126                 .getMulticastPriority().byteValue());
127         assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
128                 .getMulticastWeight().byteValue());
129         assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
130                 .getLocalLocator());
131         assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
132                 .getRlocProbed());
133         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
134                 .getRouted());
135         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
136                 .getLocalLocator());
137         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
138                 .getRlocProbed());
139         assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).getRouted());
140     }
141
142     @Test
143     public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
144         MapReplyBuilder mrBuilder = new MapReplyBuilder();
145         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
146         MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
147         recordBuilder.setEid(LispAddressUtil.asIpv6PrefixEid("0:0:0:0:0:0:0:8/128"));
148         mrBuilder.getMappingRecordItem().add(
149                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).setMappingRecordItemId("xyzzy")
150                     .build());
151
152         recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("8.2.4.5/32"));
153         mrBuilder.getMappingRecordItem().add(
154                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).setMappingRecordItemId("xyzzy")
155                     .build());
156
157         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
158         assertEquals(2, packet.get(3));
159
160         packet.position(24); // EID in first record
161         byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
162             0x08 };
163         byte[] actual = new byte[16];
164         packet.get(actual);
165         ArrayAssert.assertEquals(expected, actual);
166
167         packet.position(packet.position() + 12); // EID in second record
168         assertEquals(0x08020405, packet.getInt());
169     }
170
171     @Test
172     public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
173         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
174                 + "00 00 00 00 00 00 00 00 00 01 00 20 00 00 00 00 "
175                 + "00 01 01 02 03 04 00 00 00 00 00 10 30 00 00 02 00 01 04 03 00 00"));
176         assertArrayEquals(new byte[] {1, 2, 3, 4}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(0)
177                 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
178         // XXX Why here normalized and other cases not normalized?
179         assertArrayEquals(new byte[] {4, 3, 0, 0}, ((Ipv4PrefixBinary) mr.getMappingRecordItem().get(1)
180                 .getMappingRecord().getEid().getAddress()).getIpv4AddressBinary().getValue());
181         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getAuthoritative());
182         assertEquals(true, mr.getMappingRecordItem().get(1).getMappingRecord().getAuthoritative());
183         assertEquals(Action.NoAction, mr.getMappingRecordItem().get(0).getMappingRecord().getAction());
184         assertEquals(Action.NativelyForward, mr.getMappingRecordItem().get(1).getMappingRecord().getAction());
185         assertEquals(0, mr.getMappingRecordItem().get(0).getMappingRecord().getMapVersion().shortValue());
186         assertEquals(2, mr.getMappingRecordItem().get(1).getMappingRecord().getMapVersion().shortValue());
187         assertEquals(32, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(0).getMappingRecord()
188                 .getEid().getAddress()));
189         assertEquals(16, MaskUtil.getMaskForAddress(mr.getMappingRecordItem().get(1).getMappingRecord()
190                 .getEid().getAddress()));
191         assertEquals(1, mr.getMappingRecordItem().get(0).getMappingRecord().getRecordTtl().byteValue());
192         assertEquals(0, mr.getMappingRecordItem().get(1).getMappingRecord().getRecordTtl().byteValue());
193     }
194
195     @Test
196     public void serialize__EidRecordDefaultAction() throws Exception {
197         MapReplyBuilder mrBuilder = new MapReplyBuilder();
198         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
199         MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
200         recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
201         mrBuilder.getMappingRecordItem().add(
202                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build())
203                     .setMappingRecordItemId("xyzzy").build());
204
205         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
206
207         packet.position(18);
208         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
209     }
210
211     @Test
212     public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
213         MapReplyBuilder mrBuilder = new MapReplyBuilder();
214         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
215         MappingRecordBuilder recordBuilder = new MappingRecordBuilder();
216         recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
217         recordBuilder.setAction(null);
218         mrBuilder.getMappingRecordItem().add(
219                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build())
220                     .setMappingRecordItemId("xyzzy").build());
221
222         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
223
224         packet.position(18);
225         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
226     }
227
228     @Test
229     public void serialize__EidRecordFields() throws Exception {
230         MapReplyBuilder mrBuilder = new MapReplyBuilder();
231         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
232
233         MappingRecordBuilder eidToLocator1 = new MappingRecordBuilder();
234         eidToLocator1.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
235         eidToLocator1.setRecordTtl(7);
236         eidToLocator1.setAction(Action.SendMapRequest);
237         eidToLocator1.setAuthoritative(true);
238         eidToLocator1.setMapVersion((short) 3072);
239         mrBuilder.getMappingRecordItem().add(
240                 new MappingRecordItemBuilder().setMappingRecord(eidToLocator1.build()).setMappingRecordItemId("xyzzy")
241                     .build());
242
243         MappingRecordBuilder eidToLocator2 = new MappingRecordBuilder();
244         eidToLocator2.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.7/32"));
245         eidToLocator2.setRecordTtl(1000000);
246         eidToLocator2.setAction(Action.Drop);
247         eidToLocator2.setAuthoritative(false);
248         eidToLocator2.setMapVersion((short) 29);
249         mrBuilder.getMappingRecordItem().add(
250                 new MappingRecordItemBuilder().setMappingRecord(eidToLocator2.build()).setMappingRecordItemId("xyzzy")
251                     .build());
252
253         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
254
255         packet.position(12); // First record
256         assertEquals(7, packet.getInt());
257         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
258
259         assertHexEquals((byte) 0x50, packet.get());
260         packet.position(packet.position() + 1); // skip Reserved byte
261         assertEquals((short) 3072, packet.getShort());
262
263         packet.position(packet.position() + 6); // Second record
264         assertEquals(1000000, packet.getInt());
265         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
266
267         assertHexEquals((byte) 0x60, packet.get());
268         packet.position(packet.position() + 1); // skip Reserved byte
269         assertEquals((short) 29, packet.getShort());
270     }
271
272     @Test
273     public void serialize__LocatorRecordFields() throws Exception {
274         MapReplyBuilder mrBuilder = new MapReplyBuilder();
275         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
276
277         MappingRecordBuilder eidToLocatorBuilder = new MappingRecordBuilder();
278         eidToLocatorBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
279         eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
280
281         LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
282         locatorBuilder1.setPriority(Uint8.valueOf(0xF3));
283         locatorBuilder1.setWeight(Uint8.valueOf(0xF6));
284         locatorBuilder1.setMulticastPriority(Uint8.valueOf(0xA3));
285         locatorBuilder1.setMulticastWeight(Uint8.valueOf(0x06));
286         locatorBuilder1.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.1"));
287         locatorBuilder1.setLocalLocator(true);
288         locatorBuilder1.setRlocProbed(true);
289         locatorBuilder1.setRouted(true);
290         locatorBuilder1.setLocatorId("someId");
291         eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
292
293         LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
294         locatorBuilder2.setPriority(Uint8.valueOf(0x03));
295         locatorBuilder2.setWeight(Uint8.valueOf(0x06));
296         locatorBuilder2.setMulticastPriority(Uint8.valueOf(0x03));
297         locatorBuilder2.setMulticastWeight(Uint8.valueOf(0xF1));
298         locatorBuilder2.setRloc(LispAddressUtil.asIpv4Rloc("0.0.0.2"));
299         locatorBuilder2.setLocalLocator(false);
300         locatorBuilder2.setRlocProbed(false);
301         locatorBuilder2.setRouted(false);
302         locatorBuilder2.setLocatorId("otherId");
303         eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
304
305         mrBuilder.getMappingRecordItem().add(
306                 new MappingRecordItemBuilder().setMappingRecord(eidToLocatorBuilder.build())
307                     .setMappingRecordItemId("xyzzy").build());
308
309         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
310
311         packet.position(12 + 16); // First locator record
312         assertHexEquals((byte) 0xF3, packet.get());
313         assertHexEquals((byte) 0xF6, packet.get());
314         assertHexEquals((byte) 0xA3, packet.get());
315         assertHexEquals((byte) 0x06, packet.get());
316         packet.position(packet.position() + 1);
317         assertHexEquals((byte) 0x07, packet.get());
318
319         packet.position(packet.position() + 6); // Second locator record
320         assertHexEquals((byte) 0x03, packet.get());
321         assertHexEquals((byte) 0x06, packet.get());
322         assertHexEquals((byte) 0x03, packet.get());
323         assertHexEquals((byte) 0xF1, packet.get());
324         packet.position(packet.position() + 1);
325         assertHexEquals((byte) 0x00, packet.get());
326     }
327 }