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