fixed northbound source dest mapping and auth TELSDN-644: #close
[lispflowmapping.git] / mappingservice / integrationtest / src / test / java / org / opendaylight / lispflowmapping / integrationtest / MappingServiceIntegrationTest.java
1 package org.opendaylight.lispflowmapping.integrationtest;
2
3 import static org.junit.Assert.assertEquals;
4 import static org.junit.Assert.assertNotNull;
5 import static org.junit.Assert.assertTrue;
6 import static org.junit.Assert.fail;
7 import static org.ops4j.pax.exam.CoreOptions.junitBundles;
8 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
9 import static org.ops4j.pax.exam.CoreOptions.options;
10 import static org.ops4j.pax.exam.CoreOptions.systemPackages;
11 import static org.ops4j.pax.exam.CoreOptions.systemProperty;
12
13 import java.io.BufferedReader;
14 import java.io.IOException;
15 import java.io.InputStream;
16 import java.io.InputStreamReader;
17 import java.io.OutputStreamWriter;
18 import java.net.DatagramPacket;
19 import java.net.DatagramSocket;
20 import java.net.HttpURLConnection;
21 import java.net.InetAddress;
22 import java.net.InetSocketAddress;
23 import java.net.MalformedURLException;
24 import java.net.SocketException;
25 import java.net.SocketTimeoutException;
26 import java.net.URL;
27 import java.net.UnknownHostException;
28 import java.nio.ByteBuffer;
29 import java.nio.charset.Charset;
30 import java.util.ArrayList;
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.concurrent.TimeUnit;
34
35 import javax.inject.Inject;
36
37 import org.apache.commons.codec.binary.Base64;
38 import org.codehaus.jettison.json.JSONException;
39 import org.codehaus.jettison.json.JSONObject;
40 import org.codehaus.jettison.json.JSONTokener;
41 import org.junit.After;
42 import org.junit.Before;
43 import org.junit.Test;
44 import org.junit.runner.RunWith;
45 import org.opendaylight.lispflowmapping.implementation.dao.ClusterDAOService;
46 import org.opendaylight.lispflowmapping.implementation.serializer.LispMessage;
47 import org.opendaylight.lispflowmapping.implementation.serializer.MapNotifySerializer;
48 import org.opendaylight.lispflowmapping.implementation.serializer.MapRegisterSerializer;
49 import org.opendaylight.lispflowmapping.implementation.serializer.MapReplySerializer;
50 import org.opendaylight.lispflowmapping.implementation.serializer.MapRequestSerializer;
51 import org.opendaylight.lispflowmapping.implementation.util.LispAFIConvertor;
52 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
53 import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
54 import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispPlugin;
55 import org.opendaylight.lispflowmapping.type.sbplugin.IConfigLispPlugin;
56 import org.opendaylight.lispflowmapping.type.AddressFamilyNumberEnum;
57 import org.opendaylight.lispflowmapping.type.LispCanonicalAddressFormatEnum;
58 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafApplicationDataAddress;
59 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafListAddress;
60 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSegmentAddress;
61 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafSourceDestAddress;
62 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LcafTrafficEngineeringAddress;
63 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispAFIAddress;
64 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispIpv4Address;
65 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.LispMacAddress;
66 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapNotify;
67 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRegister;
68 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
69 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
70 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.ReencapHop;
71 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecord;
72 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidrecords.EidRecordBuilder;
73 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord;
74 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecord.Action;
75 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.eidtolocatorrecords.EidToLocatorRecordBuilder;
76 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaflistaddress.Addresses;
77 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaflistaddress.AddressesBuilder;
78 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsegmentaddress.AddressBuilder;
79 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.DstAddressBuilder;
80 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafsourcedestaddress.SrcAddressBuilder;
81 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.Hops;
82 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcaftrafficengineeringaddress.HopsBuilder;
83 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainer;
84 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.LispAddressContainerBuilder;
85 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4;
86 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv4Builder;
87 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6;
88 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Ipv6Builder;
89 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafApplicationDataBuilder;
90 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafListBuilder;
91 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSegmentBuilder;
92 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDest;
93 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafSourceDestBuilder;
94 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.LcafTrafficEngineeringBuilder;
95 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.Mac;
96 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.MacBuilder;
97 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispaddress.lispaddresscontainer.address.NoBuilder;
98 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.PrimitiveAddress;
99 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecord;
100 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.locatorrecords.LocatorRecordBuilder;
101 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.mapregisternotification.MapRegisterBuilder;
102 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRloc;
103 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.ItrRlocBuilder;
104 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequest.SourceEidBuilder;
105 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.maprequestnotification.MapRequestBuilder;
106 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.reencaphop.Hop;
107 import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.reencaphop.HopBuilder;
108 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
109 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv6Address;
110 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.PortNumber;
111 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
112 //import org.opendaylight.lispflowmapping.interfaces.lisp.IFlowMapping;
113 //import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapNotify;
114 //import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRegister;
115 //import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapReply;
116 //import org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.MapRequest;
117 import org.ops4j.pax.exam.Option;
118 import org.ops4j.pax.exam.junit.Configuration;
119 import org.ops4j.pax.exam.junit.PaxExam;
120 import org.ops4j.pax.exam.util.PathUtils;
121 import org.osgi.framework.Bundle;
122 import org.osgi.framework.BundleContext;
123 import org.osgi.framework.BundleException;
124 import org.osgi.framework.InvalidSyntaxException;
125 import org.osgi.framework.ServiceReference;
126 import org.slf4j.Logger;
127 import org.slf4j.LoggerFactory;
128
129 import aQute.lib.osgi.Constants;
130
131 @RunWith(PaxExam.class)
132 public class MappingServiceIntegrationTest {
133
134     private IFlowMapping lms;
135     protected static final Logger logger = LoggerFactory.getLogger(MappingServiceIntegrationTest.class);
136     private byte[] mapRequestPacket;
137     private byte[] mapRegisterPacketWithNotify;
138     private byte[] mapRegisterPacketWithoutNotify;
139     int lispPortNumber = LispMessage.PORT_NUM;
140     String lispBindAddress = "127.0.0.1";
141     String ourAddress = "127.0.0.2";
142     private LispAFIAddress locatorEid;
143     private DatagramSocket socket;
144     private byte[] mapRegisterPacketWithAuthenticationAndMapNotify;
145
146     public static final String ODL = "org.opendaylight.controller";
147     public static final String YANG = "org.opendaylight.yangtools";
148     public static final String JERSEY = "com.sun.jersey";
149
150     @After
151     public void after() {
152         if (socket != null) {
153             socket.close();
154         }
155         if (connection != null) {
156             connection.disconnect();
157         }
158     }
159
160     @Before
161     public void before() throws Exception {
162         locatorEid = asIPAfiAddress("4.3.2.1");
163         socket = initSocket(socket);
164         // mapResolver = context.mock(IMapResolver.class);
165         // mapServer = context.mock(IMapServer.class);
166
167         // SRC: 127.0.0.1:58560 to 127.0.0.1:4342
168         // LISP(Type = 8 - Encapsulated)
169         // IP: 192.168.136.10 -> 1.2.3.4
170         // UDP: 56756
171         // LISP(Type = 1 Map-Request
172         // Record Count: 1
173         // ITR-RLOC count: 0
174         // Source EID AFI: 0
175         // Source EID not present
176         // Nonce: 0x3d8d2acd39c8d608
177         // ITR-RLOC AFI=1 Address=192.168.136.10
178         // Record 1: 1.2.3.4/32
179         mapRequestPacket = extractWSUdpByteArray(new String("0000   00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00 " //
180                 + "0010   00 58 00 00 40 00 40 11 3c 93 7f 00 00 01 7f 00 "
181                 + "0020   00 01 e4 c0 10 f6 00 44 fe 57 80 00 00 00 45 00 "
182                 + "0030   00 38 d4 31 00 00 ff 11 56 f3 7f 00 00 02 01 02 "
183                 + "0040   03 04 dd b4 10 f6 00 24 ef 3a 10 00 00 01 3d 8d "
184                 + "0050   2a cd 39 c8 d6 08 00 01 01 02 03 04 00 01 7f 00 00 02 00 20 " //
185                 + "0060   00 01 01 02 03 04"));
186
187         // IP: 192.168.136.10 -> 128.223.156.35
188         // UDP: 49289 -> 4342
189         // LISP(Type = 3 Map-Register, P=1, M=1
190         // Record Counter: 1
191         // Nonce: 0
192         // Key ID: 0x0001
193         // AuthDataLength: 20 Data:
194         // e8:f5:0b:c5:c5:f2:b0:21:27:a8:21:41:04:f3:46:5a:a5:68:89:ec
195         // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
196         // No-Action
197         // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
198         // Priority/Weight: 1/100, Multicast Priority/Weight:
199         // 255/0
200         //
201
202         mapRegisterPacketWithAuthenticationAndMapNotify = extractWSUdpByteArray(new String("0000   00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
203                 + "0010   00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
204                 + "0020   9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
205                 + "0030   00 00 00 00 00 00 00 01 00 14 0e a4 c6 d8 a4 06 "
206                 + "0040   71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
207                 + "0050   00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
208                 + "0060   ff 00 00 05 00 01 c0 a8 88 0a"));
209
210         // IP: 192.168.136.10 -> 128.223.156.35
211         // UDP: 49289 -> 4342
212         // LISP(Type = 3 Map-Register, P=1, M=1
213         // Record Counter: 1
214         // Nonce: 7
215         // Key ID: 0x0000 NO AUTHENTICATION!!
216         // AuthDataLength: 00 Data:
217         // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
218         // No-Action
219         // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
220         // Priority/Weight: 1/100, Multicast Priority/Weight:
221         // 255/0
222         //
223
224         mapRegisterPacketWithNotify = extractWSUdpByteArray(new String("0000   00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
225                 + "0010   00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
226                 + "0020   9c 23 d6 40 10 f6 00 48 59 a4 38 00 01 01 00 00 "
227                 + "0030   00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
228                 + "0040   71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
229                 + "0050   00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
230                 + "0060   ff 00 00 05 00 01 c0 a8 88 0a"));
231
232         // IP: 192.168.136.10 -> 128.223.156.35
233         // UDP: 49289 -> 4342
234         // LISP(Type = 3 Map-Register, P=1, M=1
235         // Record Counter: 1
236         // Nonce: 7
237         // Key ID: 0x0000 NO AUTHENTICATION!!
238         // AuthDataLength: 00 Data:
239         // EID prefix: 153.16.254.1/32 (EID=0x9910FE01), TTL: 10, Authoritative,
240         // No-Action
241         // Local RLOC: 192.168.136.10 (RLOC=0xC0A8880A), Reachable,
242         // Priority/Weight: 1/100, Multicast Priority/Weight:
243         // 255/0
244         //
245
246         mapRegisterPacketWithoutNotify = extractWSUdpByteArray(new String("0000   00 50 56 ee d1 4f 00 0c 29 7a ce 79 08 00 45 00 " //
247                 + "0010   00 5c 00 00 40 00 40 11 d4 db c0 a8 88 0a 80 df "
248                 + "0020   9c 23 d6 40 10 f6 00 48 59 a4 38 00 00 01 00 00 "
249                 + "0030   00 00 00 00 00 07 00 00 00 14 0e a4 c6 d8 a4 06 "
250                 + "0040   71 7c 33 a4 5c 4a 83 1c de 74 53 03 0c ad 00 00 "
251                 + "0050   00 0a 01 20 10 00 00 00 00 01 99 10 fe 01 01 64 " //
252                 + "0060   ff 00 00 05 00 01 c0 a8 88 0a"));
253     }
254
255     @Inject
256     private BundleContext bc;
257     private HttpURLConnection connection;
258
259     // Configure the OSGi container
260     @Configuration
261     public Option[] config() {
262         return options(
263                 //
264                 systemProperty("logback.configurationFile").value("file:" + PathUtils.getBaseDir() + "/src/test/resources/logback.xml"),
265                 // To start OSGi console for inspection remotely
266                 systemProperty("osgi.console").value("2401"),
267                 systemProperty("org.eclipse.gemini.web.tomcat.config.path").value(PathUtils.getBaseDir() + "/src/test/resources/tomcat-server.xml"),
268
269                 // setting default level. Jersey bundles will need to be started
270                 // earlier.
271                 systemProperty("osgi.bundles.defaultStartLevel").value("4"),
272
273                 // Set the systemPackages (used by clustering)
274                 systemPackages("sun.reflect", "sun.reflect.misc", "sun.misc", "javax.crypto", "javax.crypto.spec"),
275
276                 // OSGI infra
277                 mavenBundle("org.jboss.spec.javax.transaction", "jboss-transaction-api_1.1_spec").versionAsInProject(),
278                 mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(),
279                 mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(),
280
281                 // List logger bundles
282                 mavenBundle("org.slf4j", "jcl-over-slf4j").versionAsInProject(),
283                 mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(),
284                 mavenBundle("org.slf4j", "log4j-over-slf4j").versionAsInProject(),
285                 mavenBundle("ch.qos.logback", "logback-core").versionAsInProject(),
286                 mavenBundle("ch.qos.logback", "logback-classic").versionAsInProject(),
287
288                 mavenBundle(ODL, "config-api").versionAsInProject(), //
289                 mavenBundle(ODL, "config-manager").versionAsInProject(), //
290                 mavenBundle("commons-io", "commons-io").versionAsInProject(),
291
292                 mavenBundle("commons-fileupload", "commons-fileupload").versionAsInProject(),
293
294                 mavenBundle("equinoxSDK381", "javax.servlet").versionAsInProject(),
295                 mavenBundle("equinoxSDK381", "javax.servlet.jsp").versionAsInProject(),
296                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.ds").versionAsInProject(),
297
298                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.util").versionAsInProject(),
299                 mavenBundle("equinoxSDK381", "org.eclipse.osgi.services").versionAsInProject(),
300                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.command").versionAsInProject(),
301                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.runtime").versionAsInProject(),
302                 mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(),
303                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.cm").versionAsInProject(),
304                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.console").versionAsInProject(),
305                 mavenBundle("equinoxSDK381", "org.eclipse.equinox.launcher").versionAsInProject(),
306
307                 mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager").versionAsInProject(),
308                 mavenBundle("org.apache.felix", "org.apache.felix.dependencymanager.shell").versionAsInProject(),
309
310                 mavenBundle("com.google.code.gson", "gson").versionAsInProject(),
311                 mavenBundle("org.jboss.spec.javax.transaction", "jboss-transaction-api_1.1_spec").versionAsInProject(),
312                 mavenBundle("org.apache.felix", "org.apache.felix.fileinstall").versionAsInProject(),
313                 mavenBundle("org.apache.commons", "commons-lang3").versionAsInProject(),
314                 mavenBundle("commons-codec", "commons-codec").versionAsInProject(),
315                 mavenBundle("virgomirror", "org.eclipse.jdt.core.compiler.batch").versionAsInProject(),
316                 mavenBundle("eclipselink", "javax.persistence").versionAsInProject(),
317                 mavenBundle("eclipselink", "javax.resource").versionAsInProject(),
318
319                 mavenBundle("orbit", "javax.activation").versionAsInProject(),
320                 mavenBundle("orbit", "javax.annotation").versionAsInProject(),
321                 mavenBundle("orbit", "javax.ejb").versionAsInProject(),
322                 mavenBundle("orbit", "javax.el").versionAsInProject(),
323                 mavenBundle("orbit", "javax.mail.glassfish").versionAsInProject(),
324                 mavenBundle("orbit", "javax.xml.rpc").versionAsInProject(),
325                 mavenBundle("orbit", "org.apache.catalina").versionAsInProject(),
326
327                 mavenBundle("orbit", "org.apache.catalina.ha").versionAsInProject().noStart(),
328                 mavenBundle("orbit", "org.apache.catalina.tribes").versionAsInProject().noStart(),
329                 mavenBundle("orbit", "org.apache.coyote").versionAsInProject().noStart(),
330                 mavenBundle("orbit", "org.apache.jasper").versionAsInProject().noStart(),
331
332                 mavenBundle("orbit", "org.apache.el").versionAsInProject(),
333                 mavenBundle("orbit", "org.apache.juli.extras").versionAsInProject(),
334                 mavenBundle("orbit", "org.apache.tomcat.api").versionAsInProject(),
335                 mavenBundle("orbit", "org.apache.tomcat.util").versionAsInProject().noStart(),
336                 mavenBundle("orbit", "javax.servlet.jsp.jstl").versionAsInProject(),
337                 mavenBundle("orbit", "javax.servlet.jsp.jstl.impl").versionAsInProject(),
338
339                 // Basic bundles needed
340                 mavenBundle("org.opendaylight.controller", "containermanager").versionAsInProject(),
341                 mavenBundle("org.opendaylight.controller", "containermanager.it.implementation").versionAsInProject(),
342
343                 // Specific bundles
344                 mavenBundle(ODL, "sal-binding-api").versionAsInProject(), //
345                 mavenBundle(ODL, "sal-binding-config").versionAsInProject(),
346                 mavenBundle(ODL, "sal-binding-broker-impl").versionAsInProject(), //
347                 mavenBundle(ODL, "sal-common").versionAsInProject(), //
348                 mavenBundle(ODL, "sal-common-api").versionAsInProject(), //
349                 mavenBundle(ODL, "sal-common-impl").versionAsInProject(),
350                 mavenBundle(ODL, "sal-common-util").versionAsInProject(), //
351
352                 mavenBundle(YANG, "concepts").versionAsInProject(),
353                 mavenBundle(YANG, "yang-binding").versionAsInProject(), //
354                 mavenBundle(YANG, "yang-common").versionAsInProject(), //
355                 mavenBundle(YANG + ".model", "ietf-inet-types").versionAsInProject(),//
356                 mavenBundle(YANG + ".model", "ietf-yang-types").versionAsInProject(),//
357                 mavenBundle(YANG + ".thirdparty", "xtend-lib-osgi").versionAsInProject(),//
358                 mavenBundle(YANG, "yang-data-api").versionAsInProject(), //
359                 mavenBundle(YANG, "yang-data-impl").versionAsInProject(), //
360                 mavenBundle(YANG, "yang-model-api").versionAsInProject(), //
361                 mavenBundle(YANG, "yang-model-util").versionAsInProject(), //
362                 mavenBundle(YANG, "yang-parser-api").versionAsInProject(),
363                 mavenBundle(YANG, "yang-parser-impl").versionAsInProject(),
364                 mavenBundle(YANG, "binding-generator-spi").versionAsInProject(), //
365                 mavenBundle(YANG, "binding-model-api").versionAsInProject(), //
366                 mavenBundle(YANG, "binding-generator-util").versionAsInProject(),
367                 mavenBundle(YANG, "yang-parser-impl").versionAsInProject(),
368                 mavenBundle(YANG, "binding-type-provider").versionAsInProject(),
369                 mavenBundle(YANG, "binding-generator-api").versionAsInProject(),
370                 mavenBundle(YANG, "binding-generator-spi").versionAsInProject(),
371                 mavenBundle(YANG, "binding-generator-impl").versionAsInProject(),
372                 mavenBundle(YANG + ".thirdparty", "antlr4-runtime-osgi-nohead").versionAsInProject(), //
373
374                 mavenBundle("com.google.guava", "guava").versionAsInProject(), //
375                 mavenBundle("org.javassist", "javassist").versionAsInProject(), //
376
377                 // Northbound bundles
378                 mavenBundle("org.opendaylight.controller", "commons.northbound").versionAsInProject(), //
379                 mavenBundle(ODL + ".thirdparty", "com.sun.jersey.jersey-servlet").versionAsInProject(), //
380                 mavenBundle(ODL + ".thirdparty", "net.sf.jung2").versionAsInProject(), //
381                 mavenBundle(ODL + ".thirdparty", "org.apache.catalina.filters.CorsFilter").versionAsInProject().noStart(),
382                 mavenBundle(JERSEY, "jersey-client").versionAsInProject(),
383                 mavenBundle(JERSEY, "jersey-server").versionAsInProject().startLevel(2),
384                 mavenBundle(JERSEY, "jersey-core").versionAsInProject().startLevel(2),
385                 mavenBundle(JERSEY, "jersey-json").versionAsInProject().startLevel(2),
386                 mavenBundle("org.codehaus.jackson", "jackson-mapper-asl").versionAsInProject(),//
387                 mavenBundle("org.codehaus.jackson", "jackson-core-asl").versionAsInProject(),//
388                 mavenBundle("org.codehaus.jackson", "jackson-jaxrs").versionAsInProject(),//
389                 mavenBundle("org.codehaus.jackson", "jackson-xc").versionAsInProject(),//
390                 mavenBundle("org.codehaus.jettison", "jettison").versionAsInProject(),//
391                 mavenBundle("org.ow2.asm", "asm-all").versionAsInProject(), //
392                 mavenBundle("org.opendaylight.controller", "bundlescanner").versionAsInProject(),//
393                 mavenBundle("org.opendaylight.controller", "bundlescanner.implementation").versionAsInProject(),//
394                 mavenBundle("org.opendaylight.controller", "switchmanager").versionAsInProject(),//
395                 mavenBundle("org.opendaylight.controller", "connectionmanager").versionAsInProject(),//
396                 mavenBundle("org.opendaylight.controller", "connectionmanager.implementation").versionAsInProject(),//
397                 mavenBundle("org.opendaylight.controller", "commons.httpclient").versionAsInProject(), //
398                 mavenBundle("org.opendaylight.controller", "configuration").versionAsInProject(),//
399                 mavenBundle("org.opendaylight.controller", "configuration.implementation").versionAsInProject(),//
400                 mavenBundle("org.opendaylight.controller", "usermanager").versionAsInProject(), //
401                 mavenBundle("org.opendaylight.controller", "usermanager.implementation").versionAsInProject(), //
402                 mavenBundle("org.springframework", "org.springframework.asm").versionAsInProject(),
403                 mavenBundle("org.springframework", "org.springframework.aop").versionAsInProject(),
404                 mavenBundle("org.springframework", "org.springframework.context").versionAsInProject(),
405                 mavenBundle("org.springframework", "org.springframework.context.support").versionAsInProject(),
406                 mavenBundle("org.springframework", "org.springframework.core").versionAsInProject(),
407                 mavenBundle("org.springframework", "org.springframework.beans").versionAsInProject(),
408                 mavenBundle("org.springframework", "org.springframework.expression").versionAsInProject(),
409                 mavenBundle("org.springframework", "org.springframework.web").versionAsInProject(),
410
411                 mavenBundle("org.aopalliance", "com.springsource.org.aopalliance").versionAsInProject(),
412                 mavenBundle("org.springframework", "org.springframework.web.servlet").versionAsInProject(),
413                 mavenBundle("org.springframework.security", "spring-security-config").versionAsInProject(),
414                 mavenBundle("org.springframework.security", "spring-security-core").versionAsInProject(),
415                 mavenBundle("org.springframework.security", "spring-security-web").versionAsInProject(),
416                 mavenBundle("org.springframework.security", "spring-security-taglibs").versionAsInProject(),
417                 mavenBundle("org.springframework", "org.springframework.transaction").versionAsInProject(),
418                 mavenBundle("org.opendaylight.controller", "sal.connection").versionAsInProject(),
419                 mavenBundle("org.opendaylight.controller", "sal.connection.implementation").versionAsInProject(),
420                 mavenBundle("org.opendaylight.controller", "security").versionAsInProject().noStart(),
421
422                 // Tomcat for northbound
423                 mavenBundle("geminiweb", "org.eclipse.gemini.web.core").versionAsInProject(),
424                 mavenBundle("geminiweb", "org.eclipse.gemini.web.extender").versionAsInProject(),
425                 mavenBundle("geminiweb", "org.eclipse.gemini.web.tomcat").versionAsInProject(),
426                 mavenBundle("geminiweb", "org.eclipse.virgo.kernel.equinox.extensions").versionAsInProject().noStart(),
427                 mavenBundle("geminiweb", "org.eclipse.virgo.util.common").versionAsInProject(),
428                 mavenBundle("geminiweb", "org.eclipse.virgo.util.io").versionAsInProject(),
429                 mavenBundle("geminiweb", "org.eclipse.virgo.util.math").versionAsInProject(),
430                 mavenBundle("geminiweb", "org.eclipse.virgo.util.osgi").versionAsInProject(),
431                 mavenBundle("geminiweb", "org.eclipse.virgo.util.osgi.manifest").versionAsInProject(),
432                 mavenBundle("geminiweb", "org.eclipse.virgo.util.parser.manifest").versionAsInProject(),
433
434                 // Our bundles
435                 mavenBundle("org.opendaylight.controller", "clustering.stub").versionAsInProject(),
436                 mavenBundle("org.opendaylight.controller", "clustering.services").versionAsInProject(),
437                 mavenBundle("org.opendaylight.controller", "sal").versionAsInProject(),
438                 mavenBundle("org.opendaylight.lispflowmapping", "mappingservice.yangmodel").versionAsInProject(),
439                 mavenBundle("org.opendaylight.lispflowmapping", "mappingservice.api").versionAsInProject(),
440                 mavenBundle("org.opendaylight.lispflowmapping", "mappingservice.implementation").versionAsInProject(), //
441                 mavenBundle("org.opendaylight.lispflowmapping", "mappingservice.southbound").versionAsInProject(), //
442                 mavenBundle("org.opendaylight.lispflowmapping", "mappingservice.northbound").versionAsInProject(), //
443
444                 // Additions
445                 mavenBundle(ODL, "sal-core-api").versionAsInProject().update(), //
446                 mavenBundle(ODL, "sal-core-spi").versionAsInProject().update(), //
447                 mavenBundle(ODL, "sal-broker-impl").versionAsInProject(), //
448                 mavenBundle(ODL, "sal-connector-api").versionAsInProject(), //
449
450                 junitBundles());
451     }
452
453     @Test
454     public void mapRequestSimple() throws SocketTimeoutException {
455         sendPacket(mapRequestPacket);
456         ByteBuffer readBuf = ByteBuffer.wrap(receivePacket().getData());
457         MapReply reply = MapReplySerializer.getInstance().deserialize(readBuf);
458         assertEquals(4435248268955932168L, reply.getNonce().longValue());
459
460     }
461
462     @Test
463     public void mapRegisterWithMapNotify() throws SocketTimeoutException {
464         sendPacket(mapRegisterPacketWithNotify);
465         MapNotify reply = receiveMapNotify();
466         assertEquals(7, reply.getNonce().longValue());
467     }
468
469     @Test
470     public void northboundAddKey() throws Exception {
471
472         LispIpv4Address address = LispAFIConvertor.asIPAfiAddress("10.0.0.1");
473         int mask = 32;
474         String pass = "asdf";
475
476         URL url = createPutURL("key");
477         String authKeyJSON = createAuthKeyJSON(pass, address, mask);
478         callURL("PUT", "application/json", "text/plain", authKeyJSON, url);
479
480         String retrievedKey = lms.getAuthenticationKey(LispAFIConvertor.toContainer(address), mask);
481
482         // Check stored password matches the one sent
483         assertEquals(pass, retrievedKey);
484
485     }
486
487     @Test
488     public void northboundRetrieveSourceDestKey() throws Exception {
489
490         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 address1 = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) LispAFIConvertor
491                 .toPrimitive(LispAFIConvertor.asIPAfiAddress("10.0.0.1"));
492         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 address2 = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) LispAFIConvertor
493                 .toPrimitive(LispAFIConvertor.asIPAfiAddress("10.0.0.2"));
494         int mask1 = 32;
495         int mask2 = 32;
496         LcafSourceDest sourceDestAddress = new LcafSourceDestBuilder().setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
497                 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
498                 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(address1).build()).setSrcMaskLength((short) mask1)
499                 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(address2).build()).setDstMaskLength((short) mask2).build();
500         String pass = "asdf";
501
502         lms.addAuthenticationKey(LispAFIConvertor.toContainer(sourceDestAddress), mask1, pass);
503
504         // URL url = createGetKeyIPv4URL(address1, mask1);
505         URL url = createGetKeySourceDestURL(address1.getAfi(), ((LispIpv4Address) sourceDestAddress.getSrcAddress().getPrimitiveAddress())
506                 .getIpv4Address().getValue(), sourceDestAddress.getSrcMaskLength(), ((LispIpv4Address) sourceDestAddress.getDstAddress()
507                 .getPrimitiveAddress()).getIpv4Address().getValue(), sourceDestAddress.getDstMaskLength());
508         String reply = callURL("GET", null, "application/json", null, url);
509         JSONTokener jt = new JSONTokener(reply);
510         JSONObject json = new JSONObject(jt);
511
512         // test that the password matches what was we expected.
513         assertEquals(pass, json.get("key"));
514
515     }
516
517     @Test
518     public void northboundRetrieveKey() throws Exception {
519
520         LispIpv4Address address = LispAFIConvertor.asIPAfiAddress("10.0.0.1");
521         int mask = 32;
522         String pass = "asdf";
523
524         lms.addAuthenticationKey(LispAFIConvertor.toContainer(address), mask, pass);
525
526         URL url = createGetKeyIPv4URL(address, mask);
527         String reply = callURL("GET", null, "application/json", null, url);
528         JSONTokener jt = new JSONTokener(reply);
529         JSONObject json = new JSONObject(jt);
530
531         // test that the password matches what was we expected.
532         assertEquals(pass, json.get("key"));
533
534     }
535
536     // timePeriod - in ms
537     public void assertNoPacketReceived(int timePeriod) {
538         try {
539             receivePacket(timePeriod);
540             // If didn't timeout then fail:
541             fail();
542         } catch (SocketTimeoutException ste) {
543         }
544     }
545
546     // This registers an IP with a MapRegister, then adds a password via the
547     // northbound REST API
548     // and checks that the password works
549     @Test
550     public void testPasswordExactMatch() throws Exception {
551         String ipString = "10.0.0.1";
552         LispIpv4Address address = LispAFIConvertor.asIPAfiAddress(ipString);
553         int mask = 32;
554         String pass = "pass";
555
556         URL url = createPutURL("key");
557
558         String jsonAuthData = createAuthKeyJSON(pass, address, mask);
559
560         logger.info("Sending this JSON to LISP server: \n" + jsonAuthData);
561         logger.info("Address: " + address);
562
563         byte[] expectedSha = new byte[] { (byte) 146, (byte) 234, (byte) 52, (byte) 247, (byte) 186, (byte) 232, (byte) 31, (byte) 249, (byte) 87,
564                 (byte) 73, (byte) 234, (byte) 54, (byte) 225, (byte) 160, (byte) 129, (byte) 251, (byte) 73, (byte) 53, (byte) 196, (byte) 62 };
565
566         byte[] zeros = new byte[20];
567
568         callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
569
570         // build a MapRegister
571         MapRegisterBuilder mapRegister = new MapRegisterBuilder();
572         mapRegister.setWantMapNotify(true);
573         mapRegister.setNonce((long) 8);
574         EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
575         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(address));
576         etlr.setMaskLength((short) mask);
577         etlr.setRecordTtl(254);
578         LocatorRecordBuilder record = new LocatorRecordBuilder();
579         record.setLispAddressContainer(LispAFIConvertor.toContainer(locatorEid));
580         etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
581         etlr.getLocatorRecord().add(record.build());
582         mapRegister.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
583         mapRegister.getEidToLocatorRecord().add(etlr.build());
584
585         mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
586         mapRegister.setAuthenticationData(zeros);
587
588         sendMapRegister(mapRegister.build());
589         assertNoPacketReceived(3000);
590
591         mapRegister.setAuthenticationData(expectedSha);
592
593         sendMapRegister(mapRegister.build());
594
595         // this will fail if no MapNotify arrives for 6 seconds
596         MapNotify notify = receiveMapNotify();
597     }
598
599     @Test
600     public void testPasswordMaskMatch() throws Exception {
601         LispIpv4Address addressInRange = LispAFIConvertor.asIPAfiAddress("10.20.30.40");
602         LispIpv4Address addressOutOfRange = LispAFIConvertor.asIPAfiAddress("20.40.30.40");
603         LispIpv4Address range = LispAFIConvertor.asIPAfiAddress("10.20.30.0");
604
605         int mask = 32;
606         String pass = "pass";
607
608         URL url = createPutURL("key");
609         String jsonAuthData = createAuthKeyJSON(pass, range, 8);
610
611         callURL("PUT", "application/json", "text/plain", jsonAuthData, url);
612         // build a MapRegister
613         MapRegisterBuilder mapRegister = new MapRegisterBuilder();
614
615         mapRegister.setWantMapNotify(true);
616         mapRegister.setNonce((long) 8);
617         EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
618         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(addressInRange));
619         etlr.setMaskLength((short) mask);
620         etlr.setRecordTtl(254);
621         LocatorRecordBuilder record = new LocatorRecordBuilder();
622         record.setLispAddressContainer(LispAFIConvertor.toContainer(locatorEid));
623         record.setLispAddressContainer(LispAFIConvertor.toContainer(locatorEid));
624         etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
625         etlr.getLocatorRecord().add(record.build());
626         mapRegister.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
627         mapRegister.getEidToLocatorRecord().add(etlr.build());
628
629         mapRegister.setKeyId((short) 1); // LispKeyIDEnum.SHA1.getKeyID()
630         mapRegister
631                 .setAuthenticationData(new byte[] { -15, -52, 38, -94, 125, -111, -68, -79, 68, 6, 101, 45, -1, 47, -4, -67, -113, 104, -110, -71 });
632
633         sendMapRegister(mapRegister.build());
634
635         // this will fail if no MapNotify arrives for 6 seconds
636         MapNotify notify = receiveMapNotify();
637
638         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(addressOutOfRange));
639         mapRegister
640                 .setAuthenticationData(new byte[] { -54, 68, -58, -91, -23, 22, -88, -31, 113, 39, 115, 78, -68, -123, -71, -14, -99, 67, -23, -73 });
641
642         sendMapRegister(mapRegister.build());
643         assertNoPacketReceived(3000);
644     }
645
646     private String createAuthKeyJSON(String key, LispIpv4Address address, int mask) {
647         return "{\"key\" : \"" + key + "\",\"maskLength\" : " + mask + ",\"address\" : " + "{\"ipAddress\" : \""
648                 + address.getIpv4Address().getValue() + "\",\"afi\" : " + address.getAfi().shortValue() + "}}";
649     }
650
651     @Test
652     public void northboundAddMapping() throws Exception {
653
654         String pass = "asdf";
655         LispIpv4Address eid = LispAFIConvertor.asIPAfiAddress("10.0.0.1");
656         int mask = 32;
657         LispIpv4Address rloc = LispAFIConvertor.asIPAfiAddress("20.0.0.2");
658
659         // NB add mapping always checks the key
660         lms.addAuthenticationKey(LispAFIConvertor.toContainer(eid), mask, pass);
661
662         URL url = createPutURL("mapping");
663         String mapRegisterJSON = createMapRegisterJSON(pass, eid, mask, rloc);
664         callURL("PUT", "application/json", "text/plain", mapRegisterJSON, url);
665
666         // Retrieve the RLOC from the database
667         MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
668         mapRequestBuilder.setEidRecord(new ArrayList<EidRecord>());
669         mapRequestBuilder.getEidRecord().add(
670                 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(LispAFIConvertor.toContainer(eid)).build());
671         MapReply mapReply = lms.handleMapRequest(mapRequestBuilder.build());
672
673         LispIpv4Address retrievedRloc = (LispIpv4Address) mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getLispAddressContainer()
674                 .getAddress();
675
676         assertEquals(rloc.getIpv4Address().getValue(), retrievedRloc.getIpv4Address().getValue());
677
678     }
679
680     private String createMapRegisterJSON(String key, LispIpv4Address eid, int mask, LispIpv4Address rloc) {
681         String jsonString = "{ " + "\"key\" : \"" + key + "\"," + "\"mapregister\" : " + "{ " + "\"proxyMapReply\" : false, "
682                 + "\"eidToLocatorRecords\" : " + "[ " + "{ " + "\"authoritative\" : true," + "\"prefixGeneric\" : " + "{ " + "\"ipAddress\" : \""
683                 + eid.getIpv4Address().getValue() + "\"," + "\"afi\" : " + eid.getAfi().shortValue() + "}," + "\"mapVersion\" : 0,"
684                 + "\"maskLength\" : " + mask + ", " + "\"action\" : \"NoAction\"," + "\"locators\" : " + "[ " + "{ " + "\"multicastPriority\" : 1,"
685                 + "\"locatorGeneric\" : " + "{ " + "\"ipAddress\" : \"" + rloc.getIpv4Address().getValue() + "\"," + "\"afi\" : "
686                 + rloc.getAfi().shortValue() + "}, " + "\"routed\" : true," + "\"multicastWeight\" : 50," + "\"rlocProbed\" : false, "
687                 + "\"localLocator\" : false, " + "\"priority\" : 1, " + "\"weight\" : 50 " + "} " + "], " + "\"recordTtl\" : 100" + "} " + "], "
688                 + "\"nonce\" : 3," + "\"keyId\" : 0 " + "} " + "}";
689
690         return jsonString;
691     }
692
693     @Test
694     public void northboundRetrieveMapping() throws Exception {
695         LispIpv4Address eid = LispAFIConvertor.asIPAfiAddress("10.0.0.1");
696         int mask = 32;
697         LispIpv4Address rloc = LispAFIConvertor.asIPAfiAddress("20.0.0.2");
698
699         // Insert mapping in the database
700         MapRegisterBuilder mapRegister = new MapRegisterBuilder();
701         EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
702         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(eid));
703         etlr.setMaskLength((short) mask);
704         etlr.setRecordTtl(254);
705         etlr.setAuthoritative(false);
706         etlr.setAction(Action.NoAction);
707         LocatorRecordBuilder record = new LocatorRecordBuilder();
708         record.setLispAddressContainer(LispAFIConvertor.toContainer(rloc));
709         record.setRouted(true);
710         etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
711         etlr.getLocatorRecord().add(record.build());
712         mapRegister.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
713         mapRegister.getEidToLocatorRecord().add(etlr.build());
714         lms.handleMapRegister(mapRegister.build());
715
716         // Get mapping using NB interface. No IID used
717         URL url = createGetMappingIPv4URL(0, eid, mask);
718         String reply = callURL("GET", null, "application/json", null, url);
719         JSONTokener jt = new JSONTokener(reply);
720         JSONObject json = new JSONObject(jt);
721
722         // With just one locator, locators is not a JSONArray
723         String rlocRetrieved = json.getJSONObject("locators").getJSONObject("locatorGeneric").getString("ipAddress");
724
725         assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
726
727     }
728
729     @Test
730     public void northboundRetrieveSourceDestMapping() throws Exception {
731
732         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 address1 = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) LispAFIConvertor
733                 .toPrimitive(LispAFIConvertor.asIPAfiAddress("10.0.0.1"));
734         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 address2 = (org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4) LispAFIConvertor
735                 .toPrimitive(LispAFIConvertor.asIPAfiAddress("10.0.0.2"));
736         int mask1 = 32;
737         int mask2 = 32;
738         LcafSourceDest sourceDestAddress = new LcafSourceDestBuilder().setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode())
739                 .setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode())
740                 .setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(address1).build()).setSrcMaskLength((short) mask1)
741                 .setDstAddress(new DstAddressBuilder().setPrimitiveAddress(address2).build()).setDstMaskLength((short) mask2).build();
742         LispIpv4Address rloc = LispAFIConvertor.asIPAfiAddress("20.0.0.2");
743
744         // Insert mapping in the database
745         MapRegisterBuilder mapRegister = new MapRegisterBuilder();
746         EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
747         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(sourceDestAddress));
748         etlr.setMaskLength((short) mask1);
749         etlr.setRecordTtl(254);
750         etlr.setAuthoritative(false);
751         etlr.setAction(Action.NoAction);
752         LocatorRecordBuilder record = new LocatorRecordBuilder();
753         record.setLispAddressContainer(LispAFIConvertor.toContainer(rloc));
754         record.setRouted(true);
755         etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
756         etlr.getLocatorRecord().add(record.build());
757         mapRegister.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
758         mapRegister.getEidToLocatorRecord().add(etlr.build());
759         lms.handleMapRegister(mapRegister.build());
760
761         // Get mapping using NB interface. No IID used
762         URL url = createGetMappingSourceDestURL(address1.getAfi(), address1.getIpv4Address().getValue(), mask1, address2.getIpv4Address().getValue(),
763                 mask2);
764         String reply = callURL("GET", null, "application/json", null, url);
765         JSONTokener jt = new JSONTokener(reply);
766         JSONObject json = new JSONObject(jt);
767
768         // With just one locator, locators is not a JSONArray
769         String rlocRetrieved = json.getJSONObject("locators").getJSONObject("locatorGeneric").getString("ipAddress");
770
771         assertEquals(rloc.getIpv4Address().getValue(), rlocRetrieved);
772
773     }
774
775     private URL createGetKeyIPv4URL(LispIpv4Address address, int mask) throws MalformedURLException {
776         String restUrl = String.format("http://localhost:8080/lispflowmapping/default/%s/%d/%s/%d", "key", address.getAfi().shortValue(), address
777                 .getIpv4Address().getValue(), mask);
778         URL url = new URL(restUrl);
779         return url;
780     }
781
782     private URL createGetKeySourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask) throws MalformedURLException {
783         String restUrl = String.format("http://localhost:8080/lispflowmapping/default/%s/%d/%s/%d/%s/%d", "key", afi, srcAddress, srcMask,
784                 dstAddress, dstMask);
785         URL url = new URL(restUrl);
786         return url;
787     }
788
789     private URL createGetMappingSourceDestURL(int afi, String srcAddress, int srcMask, String dstAddress, int dstMask) throws MalformedURLException {
790         String restUrl = String.format("http://localhost:8080/lispflowmapping/default/%s/%d/%s/%d/%s/%d", "mapping", afi, srcAddress, srcMask,
791                 dstAddress, dstMask);
792         URL url = new URL(restUrl);
793         return url;
794     }
795
796     private URL createGetMappingIPv4URL(int iid, LispIpv4Address address, int mask) throws MalformedURLException {
797         String restUrl = String.format("http://localhost:8080/lispflowmapping/default/%s/%d/%d/%s/%d", "mapping", iid, address.getAfi().shortValue(),
798                 address.getIpv4Address().getValue(), mask);
799         URL url = new URL(restUrl);
800         return url;
801     }
802
803     private URL createPutURL(String resource) throws MalformedURLException {
804
805         String restUrl = String.format("http://localhost:8080/lispflowmapping/default/%s", resource);
806
807         URL url = new URL(restUrl);
808         return url;
809     }
810
811     private String createAuthenticationString() {
812         String authString = "admin:admin";
813         byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
814         String authStringEnc = new String(authEncBytes);
815         return authStringEnc;
816     }
817
818     private String callURL(String method, String content, String accept, String body, URL url) throws IOException, JSONException {
819         String authStringEnc = createAuthenticationString();
820         connection = (HttpURLConnection) url.openConnection();
821         connection.setRequestMethod(method);
822         connection.setRequestProperty("Authorization", "Basic " + authStringEnc);
823         if (content != null) {
824             connection.setRequestProperty("Content-Type", content);
825         }
826         if (accept != null) {
827             connection.setRequestProperty("Accept", accept);
828         }
829         if (body != null) {
830             // now add the request body
831             connection.setDoOutput(true);
832             OutputStreamWriter wr = new OutputStreamWriter(connection.getOutputStream());
833             wr.write(body);
834             wr.flush();
835         }
836         connection.connect();
837
838         // getting the result, first check response code
839         Integer httpResponseCode = connection.getResponseCode();
840
841         if (httpResponseCode > 299) {
842             logger.info("HTTP Address: " + url);
843             logger.info("HTTP Response Code: " + httpResponseCode);
844             fail();
845         }
846
847         InputStream is = connection.getInputStream();
848         BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
849         StringBuilder sb = new StringBuilder();
850         int cp;
851         while ((cp = rd.read()) != -1) {
852             sb.append((char) cp);
853         }
854         is.close();
855         connection.disconnect();
856         return (sb.toString());
857     }
858
859     private MapReply registerAddressAndQuery(LispAFIAddress eid) throws SocketTimeoutException {
860         return registerAddressAndQuery(eid, -1);
861     }
862
863     private IConfigLispPlugin configLispPlugin;
864
865     // takes an address, packs it in a MapRegister, sends it, returns the
866     // MapReply
867     private MapReply registerAddressAndQuery(LispAFIAddress eid, int maskLength) throws SocketTimeoutException {
868         MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
869         mapRegisterBuilder.setWantMapNotify(true);
870         mapRegisterBuilder.setKeyId((short) 0);
871         mapRegisterBuilder.setAuthenticationData(new byte[0]);
872         mapRegisterBuilder.setNonce((long) 8);
873         mapRegisterBuilder.setProxyMapReply(false);
874         EidToLocatorRecordBuilder etlrBuilder = new EidToLocatorRecordBuilder();
875         etlrBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(eid));
876         if (maskLength != -1) {
877             etlrBuilder.setMaskLength((short) maskLength);
878         } else {
879             etlrBuilder.setMaskLength((short) 0);
880         }
881         etlrBuilder.setRecordTtl(254);
882         etlrBuilder.setAction(Action.NoAction);
883         etlrBuilder.setAuthoritative(false);
884         etlrBuilder.setMapVersion((short) 0);
885         LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
886         recordBuilder.setLocalLocator(false);
887         recordBuilder.setRlocProbed(false);
888         recordBuilder.setRouted(true);
889         recordBuilder.setMulticastPriority((short) 0);
890         recordBuilder.setMulticastWeight((short) 0);
891         recordBuilder.setPriority((short) 0);
892         recordBuilder.setWeight((short) 0);
893         recordBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(locatorEid));
894         etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
895         etlrBuilder.getLocatorRecord().add(recordBuilder.build());
896         mapRegisterBuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
897         mapRegisterBuilder.getEidToLocatorRecord().add(etlrBuilder.build());
898         sendMapRegister(mapRegisterBuilder.build());
899         MapNotify mapNotify = receiveMapNotify();
900         assertEquals(8, mapNotify.getNonce().longValue());
901         MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
902         mapRequestBuilder.setNonce((long) 4);
903         mapRequestBuilder.setEidRecord(new ArrayList<EidRecord>());
904         mapRequestBuilder.getEidRecord().add(
905                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(eid)).build());
906         mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
907         mapRequestBuilder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress(ourAddress)))
908                 .build());
909         mapRequestBuilder.getItrRloc().add(
910                 new ItrRlocBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress(ourAddress))).build());
911         mapRequestBuilder.setAuthoritative(false);
912         mapRequestBuilder.setMapDataPresent(false);
913         mapRequestBuilder.setPitr(false);
914         mapRequestBuilder.setProbe(false);
915         mapRequestBuilder.setSmr(false);
916         mapRequestBuilder.setSmrInvoked(false);
917         sendMapRequest(mapRequestBuilder.build());
918         return receiveMapReply();
919     }
920
921     @Test
922     public void mapRegisterWithMapNotifyAndMapRequest() throws SocketTimeoutException {
923
924         LispAFIAddress eid = asIPAfiAddress("1.2.3.4");
925
926         MapReply mapReply = registerAddressAndQuery(eid, 32);
927
928         assertEquals(4, mapReply.getNonce().longValue());
929         assertEquals(LispAFIConvertor.toContainer(locatorEid), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0)
930                 .getLispAddressContainer());
931
932     }
933
934     @Test
935     public void registerAndQuery__MAC() throws SocketTimeoutException {
936         String macAddress = "01:02:03:04:05:06";
937
938         MapReply reply = registerAddressAndQuery(asMacAfiAddress(macAddress));
939
940         assertTrue(true);
941         LispAFIAddress addressFromNetwork = LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0).getLispAddressContainer());
942         assertTrue(addressFromNetwork instanceof LispMacAddress);
943         String macAddressFromReply = ((Mac) addressFromNetwork).getMacAddress().getValue();
944
945         assertEquals(macAddress, macAddressFromReply);
946     }
947
948     @Test
949     public void registerAndQuery__SrcDestLCAF() throws SocketTimeoutException {
950         String ipString = "10.20.30.200";
951         String macString = "01:02:03:04:05:06";
952         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 addrToSend1 = asPrimitiveIPAfiAddress(ipString);
953         org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac addrToSend2 = asPrimitiveMacAfiAddress(macString);
954         LcafSourceDestBuilder builder = new LcafSourceDestBuilder();
955         builder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode());
956         builder.setLcafType((short) LispCanonicalAddressFormatEnum.SOURCE_DEST.getLispCode());
957         builder.setSrcMaskLength((short) 0);
958         builder.setDstMaskLength((short) 0);
959         builder.setSrcAddress(new SrcAddressBuilder().setPrimitiveAddress(addrToSend1).build());
960         builder.setDstAddress(new DstAddressBuilder().setPrimitiveAddress(addrToSend2).build());
961
962         MapReply reply = registerAddressAndQuery(builder.build());
963
964         LispAddressContainer fromNetwork = reply.getEidToLocatorRecord().get(0).getLispAddressContainer();
965         assertTrue(fromNetwork.getAddress() instanceof LcafSourceDestAddress);
966         LcafSourceDestAddress sourceDestFromNetwork = (LcafSourceDestAddress) fromNetwork.getAddress();
967
968         LispAFIAddress receivedAddr1 = (LispAFIAddress) sourceDestFromNetwork.getSrcAddress().getPrimitiveAddress();
969         LispAFIAddress receivedAddr2 = (LispAFIAddress) sourceDestFromNetwork.getDstAddress().getPrimitiveAddress();
970
971         assertTrue(receivedAddr1 instanceof LispIpv4Address);
972         assertTrue(receivedAddr2 instanceof LispMacAddress);
973
974         LispIpv4Address receivedIP = (LispIpv4Address) receivedAddr1;
975         LispMacAddress receivedMAC = (LispMacAddress) receivedAddr2;
976
977         assertEquals(ipString, receivedIP.getIpv4Address().getValue());
978         assertEquals(macString, receivedMAC.getMacAddress().getValue());
979     }
980
981     @Test
982     public void registerAndQuery__ListLCAF() throws SocketTimeoutException {
983         String macString = "01:02:03:04:05:06";
984         String ipString = "10.20.255.30";
985         LcafListBuilder listbuilder = new LcafListBuilder();
986         listbuilder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode()).setLcafType((short) LispCanonicalAddressFormatEnum.LIST.getLispCode());
987         listbuilder.setAddresses(new ArrayList<Addresses>());
988         listbuilder.getAddresses().add(new AddressesBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(asIPAfiAddress(ipString))).build());
989         listbuilder.getAddresses().add(new AddressesBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(asMacAfiAddress(macString))).build());
990
991         MapReply reply = registerAddressAndQuery(listbuilder.build());
992
993         LispAFIAddress receivedAddress = LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0).getLispAddressContainer());
994
995         assertTrue(receivedAddress instanceof LcafListAddress);
996
997         LcafListAddress listAddrFromNetwork = (LcafListAddress) receivedAddress;
998         LispAFIAddress receivedAddr1 = (LispAFIAddress) listAddrFromNetwork.getAddresses().get(0).getPrimitiveAddress();
999         LispAFIAddress receivedAddr2 = (LispAFIAddress) listAddrFromNetwork.getAddresses().get(1).getPrimitiveAddress();
1000
1001         assertTrue(receivedAddr1 instanceof LispIpv4Address);
1002         assertTrue(receivedAddr2 instanceof LispMacAddress);
1003
1004         assertEquals(macString, ((LispMacAddress) receivedAddr2).getMacAddress().getValue());
1005         assertEquals(ipString, ((LispIpv4Address) receivedAddr1).getIpv4Address().getValue());
1006     }
1007
1008     @Test
1009     public void registerAndQuerySegmentLCAF() throws SocketTimeoutException {
1010         String ipString = "10.20.255.30";
1011         int instanceId = 6;
1012         LcafSegmentBuilder builder = new LcafSegmentBuilder();
1013         builder.setInstanceId((long) instanceId);
1014         builder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode()).setLcafType((short) LispCanonicalAddressFormatEnum.SEGMENT.getLispCode());
1015         builder.setAddress(new AddressBuilder().setPrimitiveAddress(LispAFIConvertor.toPrimitive(asIPAfiAddress(ipString))).build());
1016
1017         MapReply reply = registerAddressAndQuery(builder.build());
1018
1019         LispAFIAddress receivedAddress = LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0).getLispAddressContainer());
1020         assertTrue(receivedAddress instanceof LcafSegmentAddress);
1021
1022         LcafSegmentAddress segmentfromNetwork = (LcafSegmentAddress) receivedAddress;
1023         LispAFIAddress addrFromSegment = (LispAFIAddress) segmentfromNetwork.getAddress().getPrimitiveAddress();
1024         assertTrue(addrFromSegment instanceof LispIpv4Address);
1025         assertEquals(ipString, ((LispIpv4Address) addrFromSegment).getIpv4Address().getValue());
1026
1027         assertEquals(instanceId, segmentfromNetwork.getInstanceId().intValue());
1028     }
1029
1030     @Test
1031     public void registerAndQuery__TrafficEngineering() throws SocketTimeoutException {
1032         String macString = "01:02:03:04:05:06";
1033         String ipString = "10.20.255.30";
1034         HopBuilder hopBuilder = new HopBuilder();
1035         hopBuilder.setPrimitiveAddress(LispAFIConvertor.toPrimitive(asIPAfiAddress(ipString)));
1036         Hop hop1 = hopBuilder.build();
1037         hopBuilder.setPrimitiveAddress(LispAFIConvertor.toPrimitive(asMacAfiAddress(macString)));
1038         Hop hop2 = hopBuilder.build();
1039         HopsBuilder hb = new HopsBuilder();
1040         hb.setHop(hop1);
1041         hb.setLookup(true);
1042         hb.setRLOCProbe(false);
1043         hb.setStrict(true);
1044         HopsBuilder hb2 = new HopsBuilder();
1045         hb2.setHop(hop2);
1046         hb2.setLookup(false);
1047         hb2.setRLOCProbe(true);
1048         hb2.setStrict(false);
1049         Hops hops1 = hb.build();
1050         Hops hops2 = hb2.build();
1051         LcafTrafficEngineeringBuilder trafficBuilder = new LcafTrafficEngineeringBuilder();
1052         trafficBuilder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode()).setLcafType(
1053                 (short) LispCanonicalAddressFormatEnum.TRAFFIC_ENGINEERING.getLispCode());
1054         trafficBuilder.setHops(new ArrayList<Hops>());
1055         trafficBuilder.getHops().add(hb.build());
1056         trafficBuilder.getHops().add(hb2.build());
1057
1058         MapReply reply = registerAddressAndQuery(trafficBuilder.build());
1059
1060         assertTrue(LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0).getLispAddressContainer()) instanceof LcafTrafficEngineeringAddress);
1061
1062         LcafTrafficEngineeringAddress receivedAddress = (LcafTrafficEngineeringAddress) LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0)
1063                 .getLispAddressContainer());
1064
1065         ReencapHop receivedHop1 = receivedAddress.getHops().get(0);
1066         ReencapHop receivedHop2 = receivedAddress.getHops().get(1);
1067
1068         assertEquals(true, hops1.isLookup());
1069         assertEquals(false, hops1.isRLOCProbe());
1070         assertEquals(true, hops1.isStrict());
1071
1072         assertEquals(false, hops2.isLookup());
1073         assertEquals(true, hops2.isRLOCProbe());
1074         assertEquals(false, hops2.isStrict());
1075
1076         assertTrue(receivedHop1.getHop().getPrimitiveAddress() instanceof LispIpv4Address);
1077         assertTrue(receivedHop2.getHop().getPrimitiveAddress() instanceof LispMacAddress);
1078
1079         assertEquals(ipString, ((LispIpv4Address) receivedHop1.getHop().getPrimitiveAddress()).getIpv4Address().getValue());
1080         assertEquals(macString, ((LispMacAddress) receivedHop2.getHop().getPrimitiveAddress()).getMacAddress().getValue());
1081     }
1082
1083     @Test
1084     public void registerAndQuery__ApplicationData() throws SocketTimeoutException {
1085         String ipString = "1.2.3.4";
1086         short protocol = 1;
1087         int ipTOs = 2;
1088         int localPort = 3;
1089         int remotePort = 4;
1090
1091         LcafApplicationDataBuilder builder = new LcafApplicationDataBuilder();
1092         builder.setAfi(AddressFamilyNumberEnum.LCAF.getIanaCode()).setLcafType((short) LispCanonicalAddressFormatEnum.APPLICATION_DATA.getLispCode());
1093         builder.setIpTos(ipTOs);
1094         builder.setProtocol(protocol);
1095         builder.setLocalPort(new PortNumber(localPort));
1096         builder.setRemotePort(new PortNumber(remotePort));
1097         builder.setAddress(new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lcafapplicationdataaddress.AddressBuilder()
1098                 .setPrimitiveAddress(LispAFIConvertor.toPrimitive(asIPAfiAddress(ipString))).build());
1099
1100         LcafApplicationDataAddress addressToSend = builder.build();
1101
1102         MapReply reply = registerAddressAndQuery(addressToSend);
1103
1104         LispAFIAddress receivedAddress = LispAFIConvertor.toAFI(reply.getEidToLocatorRecord().get(0).getLispAddressContainer());
1105
1106         assertTrue(receivedAddress instanceof LcafApplicationDataAddress);
1107
1108         LcafApplicationDataAddress receivedApplicationDataAddress = (LcafApplicationDataAddress) receivedAddress;
1109         assertEquals(protocol, receivedApplicationDataAddress.getProtocol().intValue());
1110         assertEquals(ipTOs, receivedApplicationDataAddress.getIpTos().intValue());
1111         assertEquals(localPort, receivedApplicationDataAddress.getLocalPort().getValue().intValue());
1112         assertEquals(remotePort, receivedApplicationDataAddress.getRemotePort().getValue().intValue());
1113
1114         LispIpv4Address ipAddressReceived = (LispIpv4Address) receivedApplicationDataAddress.getAddress().getPrimitiveAddress();
1115         assertEquals(ipString, ipAddressReceived.getIpv4Address().getValue());
1116     }
1117
1118     @Test
1119     public void eidPrefixLookupIPv4() throws SocketTimeoutException {
1120         runPrefixTest(LispAFIConvertor.asIPAfiAddress("1.2.3.4"), 16, LispAFIConvertor.asIPAfiAddress("1.2.3.2"),
1121                 LispAFIConvertor.asIPAfiAddress("1.1.1.1"), (byte) 32);
1122     }
1123
1124     @Test
1125     public void eidPrefixLookupIPv6() throws SocketTimeoutException {
1126         runPrefixTest(LispAFIConvertor.asIPv6AfiAddress("1:2:3:4:5:6:7:8"), 64, LispAFIConvertor.asIPv6AfiAddress("1:2:3:4:5:1:2:3"),
1127                 LispAFIConvertor.asIPv6AfiAddress("1:2:3:1:2:3:1:2"), (byte) 128);
1128     }
1129
1130     private void runPrefixTest(LispAFIAddress registerEID, int registerdMask, LispAFIAddress matchedAddress, LispAFIAddress unMatchedAddress,
1131             byte mask) throws SocketTimeoutException {
1132
1133         MapRegisterBuilder mapRegister = new MapRegisterBuilder();
1134         mapRegister.setWantMapNotify(true);
1135         mapRegister.setNonce((long) 8);
1136         mapRegister.setWantMapNotify(true);
1137         mapRegister.setKeyId((short) 0);
1138         mapRegister.setAuthenticationData(new byte[0]);
1139         mapRegister.setNonce((long) 8);
1140         mapRegister.setProxyMapReply(false);
1141         EidToLocatorRecordBuilder etlr = new EidToLocatorRecordBuilder();
1142         etlr.setRecordTtl(254);
1143         etlr.setAction(Action.NoAction);
1144         etlr.setAuthoritative(false);
1145         etlr.setMapVersion((short) 0);
1146         etlr.setLispAddressContainer(LispAFIConvertor.toContainer(registerEID));
1147         etlr.setMaskLength((short) registerdMask);
1148         etlr.setRecordTtl(254);
1149         LocatorRecordBuilder record = new LocatorRecordBuilder();
1150         record.setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress("4.3.2.1")));
1151         record.setLocalLocator(false);
1152         record.setRlocProbed(false);
1153         record.setRouted(true);
1154         record.setMulticastPriority((short) 0);
1155         record.setMulticastWeight((short) 0);
1156         record.setPriority((short) 0);
1157         record.setWeight((short) 0);
1158         etlr.setLocatorRecord(new ArrayList<LocatorRecord>());
1159         etlr.getLocatorRecord().add(record.build());
1160         mapRegister.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
1161         mapRegister.getEidToLocatorRecord().add(etlr.build());
1162         sendMapRegister(mapRegister.build());
1163         MapNotify mapNotify = receiveMapNotify();
1164         assertEquals(8, mapNotify.getNonce().longValue());
1165         MapRequestBuilder mapRequest = new MapRequestBuilder();
1166         mapRequest.setNonce((long) 4);
1167         mapRequest.setSourceEid(new SourceEidBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress(ourAddress))).build());
1168         mapRequest.setEidRecord(new ArrayList<EidRecord>());
1169         mapRequest.setAuthoritative(false);
1170         mapRequest.setMapDataPresent(false);
1171         mapRequest.setPitr(false);
1172         mapRequest.setProbe(false);
1173         mapRequest.setSmr(false);
1174         mapRequest.setSmrInvoked(false);
1175         mapRequest.getEidRecord().add(
1176                 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(LispAFIConvertor.toContainer(matchedAddress)).build());
1177         mapRequest.setItrRloc(new ArrayList<ItrRloc>());
1178         mapRequest.getItrRloc().add(
1179                 new ItrRlocBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(LispAFIConvertor.asIPAfiAddress(ourAddress))).build());
1180         sendMapRequest(mapRequest.build());
1181         MapReply mapReply = receiveMapReply();
1182         assertEquals(4, mapReply.getNonce().longValue());
1183         assertEquals(record.getLispAddressContainer(), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getLispAddressContainer());
1184         mapRequest.setEidRecord(new ArrayList<EidRecord>());
1185         mapRequest.getEidRecord().add(
1186                 new EidRecordBuilder().setMask((short) mask).setLispAddressContainer(LispAFIConvertor.toContainer(unMatchedAddress)).build());
1187         sendMapRequest(mapRequest.build());
1188         mapReply = receiveMapReply();
1189         assertEquals(0, mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().size());
1190     }
1191
1192     @Test
1193     public void mapRequestMapRegisterAndMapRequest() throws SocketTimeoutException {
1194
1195         LispAFIAddress eid = asIPAfiAddress("1.2.3.4");
1196         MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1197         mapRequestBuilder.setNonce((long) 4);
1198         mapRequestBuilder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(
1199                 LispAFIConvertor.toContainer(new NoBuilder().setAfi((short) 0).build())).build());
1200         mapRequestBuilder.setEidRecord(new ArrayList<EidRecord>());
1201         mapRequestBuilder.getEidRecord().add(
1202                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(eid)).build());
1203         mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1204         mapRequestBuilder.getItrRloc().add(
1205                 new ItrRlocBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress(ourAddress))).build());
1206         sendMapRequest(mapRequestBuilder.build());
1207         MapReply mapReply = receiveMapReply();
1208         assertEquals(4, mapReply.getNonce().longValue());
1209         assertEquals(0, mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().size());
1210         MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
1211         mapRegisterbuilder.setWantMapNotify(true);
1212         mapRegisterbuilder.setNonce((long) 8);
1213         EidToLocatorRecordBuilder etlrBuilder = new EidToLocatorRecordBuilder();
1214         etlrBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(eid));
1215         etlrBuilder.setMaskLength((short) 32);
1216         etlrBuilder.setRecordTtl(254);
1217         LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1218         recordBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress("4.3.2.1")));
1219         etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1220         etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1221         mapRegisterbuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
1222         mapRegisterbuilder.getEidToLocatorRecord().add(etlrBuilder.build());
1223         sendMapRegister(mapRegisterbuilder.build());
1224         MapNotify mapNotify = receiveMapNotify();
1225         assertEquals(8, mapNotify.getNonce().longValue());
1226         sendMapRequest(mapRequestBuilder.build());
1227         mapReply = receiveMapReply();
1228         assertEquals(4, mapReply.getNonce().longValue());
1229         assertEquals(recordBuilder.getLispAddressContainer(), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0)
1230                 .getLispAddressContainer());
1231
1232     }
1233
1234     public void mapRequestMapRegisterAndMapRequestTestTimeout() throws SocketTimeoutException {
1235
1236         LispIpv4Address eid = LispAFIConvertor.asIPAfiAddress("1.2.3.4");
1237         MapRequestBuilder mapRequestBuilder = new MapRequestBuilder();
1238         mapRequestBuilder.setNonce((long) 4);
1239         mapRequestBuilder.setSourceEid(new SourceEidBuilder().setLispAddressContainer(
1240                 LispAFIConvertor.toContainer(new NoBuilder().setAfi((short) 0).build())).build());
1241         mapRequestBuilder.setEidRecord(new ArrayList<EidRecord>());
1242         mapRequestBuilder.getEidRecord().add(
1243                 new EidRecordBuilder().setMask((short) 32).setLispAddressContainer(LispAFIConvertor.toContainer(eid)).build());
1244         mapRequestBuilder.setItrRloc(new ArrayList<ItrRloc>());
1245         mapRequestBuilder.getItrRloc().add(
1246                 new ItrRlocBuilder().setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress(ourAddress))).build());
1247         sendMapRequest(mapRequestBuilder.build());
1248         MapReply mapReply = receiveMapReply();
1249         assertEquals(4, mapReply.getNonce().longValue());
1250         assertEquals(0, mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().size());
1251         MapRegisterBuilder mapRegisterbuilder = new MapRegisterBuilder();
1252         mapRegisterbuilder.setWantMapNotify(true);
1253         mapRegisterbuilder.setNonce((long) 8);
1254         EidToLocatorRecordBuilder etlrBuilder = new EidToLocatorRecordBuilder();
1255         etlrBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(eid));
1256         etlrBuilder.setMaskLength((short) 32);
1257         etlrBuilder.setRecordTtl(254);
1258         LocatorRecordBuilder recordBuilder = new LocatorRecordBuilder();
1259         recordBuilder.setLispAddressContainer(LispAFIConvertor.toContainer(asIPAfiAddress("4.3.2.1")));
1260         etlrBuilder.setLocatorRecord(new ArrayList<LocatorRecord>());
1261         etlrBuilder.getLocatorRecord().add(recordBuilder.build());
1262         mapRegisterbuilder.setEidToLocatorRecord(new ArrayList<EidToLocatorRecord>());
1263         mapRegisterbuilder.getEidToLocatorRecord().add(etlrBuilder.build());
1264         sendMapRegister(mapRegisterbuilder.build());
1265         MapNotify mapNotify = receiveMapNotify();
1266         assertEquals(8, mapNotify.getNonce().longValue());
1267         sendMapRequest(mapRequestBuilder.build());
1268         mapReply = receiveMapReply();
1269         assertEquals(4, mapReply.getNonce().longValue());
1270         assertEquals(recordBuilder.getLispAddressContainer(), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0)
1271                 .getLispAddressContainer());
1272         ServiceReference r = bc.getServiceReference(ILispDAO.class.getName());
1273         if (r != null) {
1274             ClusterDAOService clusterService = (ClusterDAOService) bc.getService(r);
1275             clusterService.setTimeUnit(TimeUnit.NANOSECONDS);
1276             sendMapRequest(mapRequestBuilder.build());
1277             mapReply = receiveMapReply();
1278             assertEquals(0, mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().size());
1279             clusterService.setTimeUnit(TimeUnit.MINUTES);
1280             sendMapRequest(mapRequestBuilder.build());
1281             mapReply = receiveMapReply();
1282             assertEquals(recordBuilder.getLispAddressContainer(), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0)
1283                     .getLispAddressContainer());
1284         }
1285     }
1286
1287     private MapReply receiveMapReply() throws SocketTimeoutException {
1288         return MapReplySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
1289     }
1290
1291     private MapNotify receiveMapNotify() throws SocketTimeoutException {
1292         return MapNotifySerializer.getInstance().deserialize(ByteBuffer.wrap(receivePacket().getData()));
1293     }
1294
1295     private void sendMapRequest(MapRequest mapRequest) {
1296         sendPacket(MapRequestSerializer.getInstance().serialize(mapRequest).array());
1297     }
1298
1299     private void sendMapRegister(MapRegister mapRegister) {
1300         sendPacket(MapRegisterSerializer.getInstance().serialize(mapRegister).array());
1301     }
1302
1303     @Test
1304     public void mapRegisterWithAuthenticationWithoutConfiguringAKey() throws SocketTimeoutException {
1305         sendPacket(mapRegisterPacketWithAuthenticationAndMapNotify);
1306         try {
1307             receivePacket(3000);
1308             // If didn't timeout then fail:
1309             fail();
1310         } catch (SocketTimeoutException ste) {
1311         }
1312     }
1313
1314     @Test
1315     public void mapRegisterWithoutMapNotify() {
1316         sendPacket(mapRegisterPacketWithoutNotify);
1317         try {
1318             receivePacket(3000);
1319             // If didn't timeout then fail:
1320             fail();
1321         } catch (SocketTimeoutException ste) {
1322         }
1323     }
1324
1325     private void sendPacket(byte[] bytesToSend) {
1326         try {
1327             DatagramPacket packet = new DatagramPacket(bytesToSend, bytesToSend.length);
1328             initPacketAddress(packet);
1329             logger.info("Sending MapRegister to LispPlugin on socket");
1330             socket.send(packet);
1331         } catch (Throwable t) {
1332             t.printStackTrace();
1333             fail();
1334         }
1335     }
1336
1337     private DatagramPacket receivePacket() throws SocketTimeoutException {
1338         return receivePacket(6000);
1339     }
1340
1341     private DatagramPacket receivePacket(int timeout) throws SocketTimeoutException {
1342         try {
1343             byte[] buffer = new byte[4096];
1344             DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);
1345             logger.info("Waiting for packet from socket...");
1346             socket.setSoTimeout(timeout);
1347             socket.receive(receivePacket);
1348             logger.info("Recieved packet from socket!");
1349             return receivePacket;
1350         } catch (SocketTimeoutException ste) {
1351             throw ste;
1352         } catch (Throwable t) {
1353             t.printStackTrace();
1354             fail();
1355             return null;
1356         }
1357     }
1358
1359     private void initPacketAddress(DatagramPacket packet) throws UnknownHostException {
1360         packet.setAddress(InetAddress.getByName(lispBindAddress));
1361         packet.setPort(lispPortNumber);
1362     }
1363
1364     private DatagramSocket initSocket(DatagramSocket socket) {
1365         try {
1366             socket = new DatagramSocket(new InetSocketAddress(ourAddress, LispMessage.PORT_NUM));
1367         } catch (SocketException e) {
1368             e.printStackTrace();
1369             fail();
1370         }
1371         return socket;
1372     }
1373
1374     private byte[] extractWSUdpByteArray(String wiresharkHex) {
1375         final int HEADER_LEN = 42;
1376         byte[] res = new byte[1000];
1377         String[] split = wiresharkHex.split(" ");
1378         int counter = 0;
1379         for (String cur : split) {
1380             cur = cur.trim();
1381             if (cur.length() == 2) {
1382                 ++counter;
1383                 if (counter > HEADER_LEN) {
1384                     res[counter - HEADER_LEN - 1] = (byte) Integer.parseInt(cur, 16);
1385                 }
1386
1387             }
1388         }
1389         return Arrays.copyOf(res, counter - HEADER_LEN);
1390     }
1391
1392     private String stateToString(int state) {
1393         switch (state) {
1394         case Bundle.ACTIVE:
1395             return "ACTIVE";
1396         case Bundle.INSTALLED:
1397             return "INSTALLED";
1398         case Bundle.RESOLVED:
1399             return "RESOLVED";
1400         case Bundle.UNINSTALLED:
1401             return "UNINSTALLED";
1402         default:
1403             return "Not CONVERTED";
1404         }
1405     }
1406
1407     @Before
1408     public void areWeReady() throws InvalidSyntaxException {
1409         assertNotNull(bc);
1410         boolean debugit = false;
1411         Bundle b[] = bc.getBundles();
1412         for (Bundle element : b) {
1413             int state = element.getState();
1414             if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) {
1415                 System.out.println("Bundle:" + element.getSymbolicName() + " state:" + stateToString(state));
1416
1417                 // UNCOMMENT to see why bundles didn't resolve!
1418
1419                 try {
1420                     String host = element.getHeaders().get(Constants.FRAGMENT_HOST);
1421                     if (host != null) {
1422                         logger.warn("Bundle " + element.getSymbolicName() + " is a fragment which is part of: " + host);
1423                         logger.warn("Required imports are: " + element.getHeaders().get(Constants.IMPORT_PACKAGE));
1424                     } else {
1425                         element.start();
1426                     }
1427                 } catch (BundleException e) {
1428                     logger.error("BundleException:", e);
1429                     fail();
1430                 }
1431
1432                 debugit = true;
1433
1434             }
1435         }
1436         if (debugit) {
1437             logger.warn(("Do some debugging because some bundle is unresolved"));
1438         }
1439         ServiceReference r = bc.getServiceReference(IFlowMapping.class.getName());
1440         if (r != null) {
1441             this.lms = (IFlowMapping) bc.getService(r);
1442         }
1443
1444         assertNotNull(IFlowMapping.class.getName() + " service wasn't found in bundle context ", this.lms);
1445
1446         r = bc.getServiceReference(IConfigLispPlugin.class.getName());
1447         if (r != null) {
1448             this.configLispPlugin = (IConfigLispPlugin) bc.getService(r);
1449         }
1450
1451         assertNotNull(IConfigLispPlugin.class.getName() + " service wasn't found in bundle context ", this.configLispPlugin);
1452         configLispPlugin.setLispAddress(lispBindAddress);
1453         try {
1454             Thread.sleep(1000);
1455         } catch (InterruptedException e) {
1456             e.printStackTrace();
1457         }
1458
1459         // If LispMappingServer is null, cannot work
1460         assertNotNull(this.lms);
1461
1462         // Uncomment this code to Know which services were actually loaded to
1463         // BundleContext
1464         /*
1465          * for (ServiceReference sr : bc.getAllServiceReferences(null, null)) {
1466          * logger.info(sr.getBundle().getSymbolicName());
1467          * logger.info(sr.toString()); }
1468          */
1469     }
1470
1471     private LispAddressContainer getIPContainer(String ip) {
1472         return new LispAddressContainerBuilder().setAddress(asIPAfiAddress(ip)).build();
1473     }
1474
1475     private Ipv4 asIPAfiAddress(String ip) {
1476         return new Ipv4Builder().setIpv4Address(new Ipv4Address(ip)).setAfi((short) AddressFamilyNumberEnum.IP.getIanaCode()).build();
1477     }
1478
1479     private org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4 asPrimitiveIPAfiAddress(String ip) {
1480         return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Ipv4Builder()
1481                 .setIpv4Address(new Ipv4Address(ip)).setAfi((short) AddressFamilyNumberEnum.IP.getIanaCode()).build();
1482     }
1483
1484     private Mac asMacAfiAddress(String mac) {
1485         return new MacBuilder().setMacAddress(new MacAddress(mac)).setAfi((short) AddressFamilyNumberEnum.MAC.getIanaCode()).build();
1486     }
1487
1488     private org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.Mac asPrimitiveMacAfiAddress(String mac) {
1489         return new org.opendaylight.yang.gen.v1.lispflowmapping.rev131031.lispsimpleaddress.primitiveaddress.MacBuilder()
1490                 .setMacAddress(new MacAddress(mac)).setAfi((short) AddressFamilyNumberEnum.MAC.getIanaCode()).build();
1491     }
1492
1493     private Ipv6 asIPv6AfiAddress(String ip) {
1494         return new Ipv6Builder().setIpv6Address(new Ipv6Address(ip)).setAfi((short) AddressFamilyNumberEnum.IP6.getIanaCode()).build();
1495     }
1496
1497 }