Migrate lisp-proto implementation to IETF YANG model
[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         //
73                 + "00 00 00 00 00 00"));
74         assertEquals(true, mr.isProbe());
75         assertEquals(false, mr.isEchoNonceEnabled());
76         assertEquals(true, mr.isSecurityEnabled());
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         //
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());
124     }
125
126     @Test
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());
134
135         recordBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("8.2.4.5/32"));
136         mrBuilder.getMappingRecordItem().add(
137                 new MappingRecordItemBuilder().setMappingRecord(recordBuilder.build()).build());
138
139         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
140         assertEquals(2, packet.get(3));
141
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];
145         packet.get(actual);
146         ArrayAssert.assertEquals(expected, actual);
147
148         packet.position(packet.position() + 12); // EID in second record
149         assertEquals(0x08020405, packet.getInt());
150     }
151
152     @Test
153     public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
154         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
155         //
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());
172     }
173
174     @Test
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());
182
183         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
184
185         packet.position(18);
186         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
187     }
188
189     @Test
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());
198
199         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
200
201         packet.position(18);
202         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
203     }
204
205     @Test
206     public void serialize__EidRecordFields() throws Exception {
207         MapReplyBuilder mrBuilder = new MapReplyBuilder();
208         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
209
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());
218
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());
227
228         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
229
230         packet.position(12); // First record
231         assertEquals(7, packet.getInt());
232         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
233
234         assertHexEquals((byte) 0x50, packet.get());
235         packet.position(packet.position() + 1); // skip Reserved byte
236         assertEquals((short) 3072, packet.getShort());
237
238         packet.position(packet.position() + 6); // Second record
239         assertEquals(1000000, packet.getInt());
240         packet.position(packet.position() + 2); // skip Locator Count & Mask-len
241
242         assertHexEquals((byte) 0x60, packet.get());
243         packet.position(packet.position() + 1); // skip Reserved byte
244         assertEquals((short) 29, packet.getShort());
245     }
246
247     @Test
248     public void serialize__LocatorRecordFields() throws Exception {
249         MapReplyBuilder mrBuilder = new MapReplyBuilder();
250         mrBuilder.setMappingRecordItem(new ArrayList<MappingRecordItem>());
251
252         MappingRecordBuilder eidToLocatorBuilder = new MappingRecordBuilder();
253         eidToLocatorBuilder.setEid(LispAddressUtil.asIpv4PrefixEid("0.0.0.1/32"));
254         eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
255
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());
266
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());
277
278         mrBuilder.getMappingRecordItem().add(
279                 new MappingRecordItemBuilder().setMappingRecord(eidToLocatorBuilder.build()).build());
280
281         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
282
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());
290
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());
298     }
299 }