8c1206028aa9c3aebd57216e6f98d2bd77e0cfea
[lispflowmapping.git] / mappingservice / implementation / src / test / java / org / opendaylight / lispflowmapping / implementation / 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.implementation.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.implementation.util.LispAFIConvertor;
21 import org.opendaylight.lispflowmapping.tools.junit.BaseTestCase;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.EidToLocatorRecord.Action;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.MapReply;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecord;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.eidtolocatorrecords.EidToLocatorRecordBuilder;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecord;
27 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.locatorrecords.LocatorRecordBuilder;
28 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.control.plane.rev150314.mapreplymessage.MapReplyBuilder;
29
30 public class MapReplySerializationTest extends BaseTestCase {
31
32     @Test
33     @Ignore
34     public void todo() throws Exception {
35         fail("support no eid to locator???");
36         fail("Validation of values in setters (map-version)");
37         fail("Non NPE for no locator in LocatorRecord.serialize");
38     }
39
40     @Test
41     public void serialize__SomeFlags() throws Exception {
42         MapReplyBuilder mr = new MapReplyBuilder();
43         mr.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
44         mr.getEidToLocatorRecord().add(
45                 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")))
46                         .build());
47         mr.setProbe(true);
48         mr.setEchoNonceEnabled(false);
49
50         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mr.build());
51         byte firstByte = packet.get(0);
52         assertHexEquals((byte) 0x28, firstByte);
53
54         mr.setProbe(false);
55         mr.setEchoNonceEnabled(true);
56
57         packet = MapReplySerializer.getInstance().serialize(mr.build());
58         firstByte = packet.get(0);
59         assertHexEquals((byte) 0x24, firstByte);
60     }
61
62     @Test
63     public void deserialize__SomeFlags() throws Exception {
64
65         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("2A 00 00 00 00 00 "
66         //
67                 + "00 00 00 00 00 00"));
68         assertEquals(true, mr.isProbe());
69         assertEquals(false, mr.isEchoNonceEnabled());
70         assertEquals(true, mr.isSecurityEnabled());
71     }
72
73     @Test
74     public void deserialize__All() throws Exception {
75         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
76         //
77                 + "00 00 00 00 00 02 00 00 " //
78                 + "00 02 02 20 00 00 00 00 " //
79                 + "00 01 01 02 03 04 01 02 " //
80                 + "03 04 00 06 00 01 0a 0a " //
81                 + "0a 0a 04 03 02 01 00 01 " //
82                 + "00 02 00 01 00 02 00 03 " //
83                 + "00 04 00 05 00 06 00 07 00 08 00 00 00 00 00 10 30 00 00 02 00 01 04 03 02 01"));
84         assertEquals(2, mr.getNonce().longValue());
85         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("1.2.3.4"))), mr.getEidToLocatorRecord().get(0)
86                 .getLispAddressContainer());
87         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("4.3.2.1"))), mr.getEidToLocatorRecord().get(1)
88                 .getLispAddressContainer());
89         assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
90         assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
91         assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
92         assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
93         assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
94         assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
95         assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
96         assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
97         assertEquals(2, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
98         assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
99         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("1:2:3:4:5:6:7:8"))), mr.getEidToLocatorRecord().get(0)
100                 .getLocatorRecord().get(1).getLispAddressContainer());
101         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("10.10.10.10"))), mr.getEidToLocatorRecord().get(0)
102                 .getLocatorRecord().get(0).getLispAddressContainer());
103         assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getPriority().byteValue());
104         assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getWeight().byteValue());
105         assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastPriority().byteValue());
106         assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getMulticastWeight().byteValue());
107         assertEquals(4, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getPriority().byteValue());
108         assertEquals(3, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getWeight().byteValue());
109         assertEquals(2, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastPriority().byteValue());
110         assertEquals(1, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getMulticastWeight().byteValue());
111         assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isLocalLocator());
112         assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRlocProbed());
113         assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).isRouted());
114         assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isLocalLocator());
115         assertEquals(false, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRlocProbed());
116         assertEquals(true, mr.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).isRouted());
117     }
118
119     @Test
120     public void serialize__MultipleRecordsWithoutRLOCs() throws Exception {
121         MapReplyBuilder mrBuilder = new MapReplyBuilder();
122         mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
123         mrBuilder.getEidToLocatorRecord().add(
124                 new EidToLocatorRecordBuilder().setLispAddressContainer(
125                         LispAFIConvertor.toContainer(LispAFIConvertor.asIPv6AfiAddress(("0:0:0:0:0:0:0:8")))).build());
126         mrBuilder.getEidToLocatorRecord().add(
127                 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("8.2.4.5")))
128                         .build());
129
130         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
131         assertEquals(2, packet.get(3));
132
133         packet.position(24); /* EID in first record */
134         byte[] expected = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08 };
135         byte[] actual = new byte[16];
136         packet.get(actual);
137         ArrayAssert.assertEquals(expected, actual);
138
139         packet.position(packet.position() + 12); /* EID in second record */
140         assertEquals(0x08020405, packet.getInt());
141     }
142
143     @Test
144     public void deserialize__MultipleRecordsWithoutRLOCs() throws Exception {
145         MapReply mr = MapReplySerializer.getInstance().deserialize(hexToByteBuffer("20 00 00 02 00 00 "
146         //
147                 + "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 02 01"));
148         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("1.2.3.4"))), mr.getEidToLocatorRecord().get(0)
149                 .getLispAddressContainer());
150         assertEquals(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("4.3.2.1"))), mr.getEidToLocatorRecord().get(1)
151                 .getLispAddressContainer());
152         assertEquals(false, mr.getEidToLocatorRecord().get(0).isAuthoritative());
153         assertEquals(true, mr.getEidToLocatorRecord().get(1).isAuthoritative());
154         assertEquals(Action.NoAction, mr.getEidToLocatorRecord().get(0).getAction());
155         assertEquals(Action.NativelyForward, mr.getEidToLocatorRecord().get(1).getAction());
156         assertEquals(0, mr.getEidToLocatorRecord().get(0).getMapVersion().shortValue());
157         assertEquals(2, mr.getEidToLocatorRecord().get(1).getMapVersion().shortValue());
158         assertEquals(32, mr.getEidToLocatorRecord().get(0).getMaskLength().shortValue());
159         assertEquals(16, mr.getEidToLocatorRecord().get(1).getMaskLength().shortValue());
160         assertEquals(1, mr.getEidToLocatorRecord().get(0).getRecordTtl().byteValue());
161         assertEquals(0, mr.getEidToLocatorRecord().get(1).getRecordTtl().byteValue());
162     }
163
164     @Test
165     public void serialize__EidRecordDefaultAction() throws Exception {
166         MapReplyBuilder mrBuilder = new MapReplyBuilder();
167         mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
168         mrBuilder.getEidToLocatorRecord().add(
169                 new EidToLocatorRecordBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1"))))
170                         .build());
171
172         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
173
174         packet.position(18);
175         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
176     }
177
178     @Test
179     public void serialize__EidRecordNullActionShouldTranslateToDefault() throws Exception {
180         MapReplyBuilder mrBuilder = new MapReplyBuilder();
181         mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
182         mrBuilder.getEidToLocatorRecord().add(
183                 new EidToLocatorRecordBuilder().setAction(null)
184                         .setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(("0.0.0.1")))).build());
185
186         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
187
188         packet.position(18);
189         assertHexEquals((byte) 0x00, packet.get()); // MapReplyAction.NoAction
190     }
191
192     @Test
193     public void serialize__EidRecordFields() throws Exception {
194         MapReplyBuilder mrBuilder = new MapReplyBuilder();
195         mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
196
197         EidToLocatorRecordBuilder eidToLocator1 = new EidToLocatorRecordBuilder();
198         eidToLocator1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
199         eidToLocator1.setRecordTtl(7);
200         eidToLocator1.setAction(Action.SendMapRequest);
201         eidToLocator1.setAuthoritative(true);
202         eidToLocator1.setMapVersion((short) 3072);
203         mrBuilder.getEidToLocatorRecord().add(eidToLocator1.build());
204
205         EidToLocatorRecordBuilder eidToLocator2 = new EidToLocatorRecordBuilder();
206         eidToLocator2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.7")));
207         eidToLocator2.setRecordTtl(1000000);
208         eidToLocator2.setAction(Action.Drop);
209         eidToLocator2.setAuthoritative(false);
210         eidToLocator2.setMapVersion((short) 29);
211         mrBuilder.getEidToLocatorRecord().add(eidToLocator2.build());
212
213         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
214
215         packet.position(12); /* First record */
216         assertEquals(7, packet.getInt());
217         packet.position(packet.position() + 2); /*
218                                                  * skip Locator Count & Mask-len
219                                                  */
220         assertHexEquals((byte) 0x50, packet.get());
221         packet.position(packet.position() + 1); /* skip Reserved byte */
222         assertEquals((short) 3072, packet.getShort());
223
224         packet.position(packet.position() + 6); /* Second record */
225         assertEquals(1000000, packet.getInt());
226         packet.position(packet.position() + 2); /*
227                                                  * skip Locator Count & Mask-len
228                                                  */
229         assertHexEquals((byte) 0x60, packet.get());
230         packet.position(packet.position() + 1); /* skip Reserved byte */
231         assertEquals((short) 29, packet.getShort());
232     }
233
234     @Test
235     public void serialize__LocatorRecordFields() throws Exception {
236         MapReplyBuilder mrBuilder = new MapReplyBuilder();
237         mrBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
238
239         EidToLocatorRecordBuilder eidToLocatorBuilder = new EidToLocatorRecordBuilder();
240         eidToLocatorBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
241         eidToLocatorBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
242
243         LocatorRecordBuilder locatorBuilder1 = new LocatorRecordBuilder();
244         locatorBuilder1.setPriority((short) 0xF3);
245         locatorBuilder1.setWeight((short) 0xF6);
246         locatorBuilder1.setMulticastPriority((short) 0xA3);
247         locatorBuilder1.setMulticastWeight((short) 0x06);
248         locatorBuilder1.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.1")));
249         locatorBuilder1.setLocalLocator(true);
250         locatorBuilder1.setRlocProbed(true);
251         locatorBuilder1.setRouted(true);
252         eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder1.build());
253
254         LocatorRecordBuilder locatorBuilder2 = new LocatorRecordBuilder();
255         locatorBuilder2.setPriority((short) 0x03);
256         locatorBuilder2.setWeight((short) 0x06);
257         locatorBuilder2.setMulticastPriority((short) 0x03);
258         locatorBuilder2.setMulticastWeight((short) 0xF1);
259         locatorBuilder2.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("0.0.0.2")));
260         locatorBuilder2.setLocalLocator(false);
261         locatorBuilder2.setRlocProbed(false);
262         locatorBuilder2.setRouted(false);
263         eidToLocatorBuilder.getLocatorRecord().add(locatorBuilder2.build());
264
265         mrBuilder.getEidToLocatorRecord().add(eidToLocatorBuilder.build());
266
267         ByteBuffer packet = MapReplySerializer.getInstance().serialize(mrBuilder.build());
268
269         packet.position(12 + 16); /* First locator record */
270         assertHexEquals((byte) 0xF3, packet.get());
271         assertHexEquals((byte) 0xF6, packet.get());
272         assertHexEquals((byte) 0xA3, packet.get());
273         assertHexEquals((byte) 0x06, packet.get());
274         packet.position(packet.position() + 1);
275         assertHexEquals((byte) 0x07, packet.get());
276
277         packet.position(packet.position() + 6); /* Second locator record */
278         assertHexEquals((byte) 0x03, packet.get());
279         assertHexEquals((byte) 0x06, packet.get());
280         assertHexEquals((byte) 0x03, packet.get());
281         assertHexEquals((byte) 0xF1, packet.get());
282         packet.position(packet.position() + 1);
283         assertHexEquals((byte) 0x00, packet.get());
284     }
285 }