Fix checkstyle
[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
34 public class MapReplySerializationTest extends BaseTestCase {
35
36     @Test
37     @Ignore
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");
42     }
43
44     @Test
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());
52         mr.setProbe(true);
53         mr.setEchoNonceEnabled(false);
54
55         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
56         byte firstByte = packet.get(0);
57         assertHexEquals((byte) 0x28, firstByte);
58
59         mr.setProbe(false);
60         mr.setEchoNonceEnabled(true);
61
62         packet = MapReplySerializer.getInstance().serialize(mr.build());
63         firstByte = packet.get(0);
64         assertHexEquals((byte) 0x24, firstByte);
65     }
66
67     @Test
68     public void deserialize__SomeFlags() throws Exception {
69
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());
75     }
76
77     @Test
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)
128                 .isLocalLocator());
129         assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
130                 .isRlocProbed());
131         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(0)
132                 .isRouted());
133         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
134                 .isLocalLocator());
135         assertEquals(false, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1)
136                 .isRlocProbed());
137         assertEquals(true, mr.getMappingRecordItem().get(0).getMappingRecord().getLocatorRecord().get(1).isRouted());
138     }
139
140     @Test
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());
148
149         recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("8.2.4.5/32"));
150         mrBuilder.getMappingRecordItem().add(
151                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
152
153         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
154         assertEquals(2, packet.get(3));
155
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,
158             0x08 };
159         byte[] actual = new byte[16];
160         packet.get(actual);
161         ArrayAssert.assertEquals(expected, actual);
162
163         packet.position(packet.position() + 12); // EID in second record
164         assertEquals(0x08020405, packet.getInt());
165     }
166
167     @Test
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());
189     }
190
191     @Test
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());
199
200         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
201
202         packet.position(18);
203         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
204     }
205
206     @Test
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());
215
216         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
217
218         packet.position(18);
219         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
220     }
221
222     @Test
223     public void serialize__EidRecordFields() throws Exception {
224         MapReplyBuilder mrBuilder = new MapReplyBuilder();
225         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
226
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());
235
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());
244
245         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
246
247         packet.position(12); // First record
248         assertEquals(7, packet.getInt());
249         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
250
251         assertHexEquals((byte) 0x50, packet.get());
252         packet.position(packet.position() + 1); // skip Reserved byte
253         assertEquals((short) 3072, packet.getShort());
254
255         packet.position(packet.position() + 6); // Second record
256         assertEquals(1000000, packet.getInt());
257         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
258
259         assertHexEquals((byte) 0x60, packet.get());
260         packet.position(packet.position() + 1); // skip Reserved byte
261         assertEquals((short) 29, packet.getShort());
262     }
263
264     @Test
265     public void serialize__LocatorRecordFields() throws Exception {
266         MapReplyBuilder mrBuilder = new MapReplyBuilder();
267         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
268
269         MappingRecordBuilder eidToLocatorBuilder = new MappingRecordBuilder();
270         eidToLocatorBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
271         eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
272
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());
283
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());
294
295         mrBuilder.getMappingRecordItem().add(
296                 new MappingRecordItemBuilder().setMappingRecord(eidToLocatorBuilder.build()).build());
297
298         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
299
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());
307
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());
315     }
316 }