3ae39ebd21cbd47fb04051438ce4f078bd1fe577
[policy/common.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.common.endpoints.http.server.test;
22
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertTrue;
26
27 import com.google.gson.Gson;
28 import java.io.BufferedReader;
29 import java.io.IOException;
30 import java.io.InputStreamReader;
31 import java.net.ConnectException;
32 import java.net.HttpURLConnection;
33 import java.net.MalformedURLException;
34 import java.net.URL;
35 import java.net.URLConnection;
36 import java.util.UUID;
37 import org.apache.commons.io.IOUtils;
38 import org.junit.AfterClass;
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
42 import org.onap.policy.common.utils.gson.GsonTestUtils;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
45
46 /**
47  * HttpServletServer JUNIT tests.
48  */
49 public class HttpServerTest {
50     private static final String LOCALHOST = "localhost";
51     private static final String SWAGGER_JSON = "/swagger.json";
52     private static final String JUNIT_ECHO_HELLO = "/junit/echo/hello";
53     private static final String JUNIT_ECHO_FULL_REQUEST = "/junit/echo/full/request";
54     private static final String SOME_TEXT = "some text";
55     private static final String HELLO = "hello";
56
57     /**
58      * Logger.
59      */
60     private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
61
62     private static final String LOCALHOST_PREFIX = "http://localhost:";
63
64     private static final Gson gson = new Gson();
65
66     /**
67      * Server port.  Incremented by 10 with each test.
68      */
69     private static int port = 5608;
70
71     private String portUrl;
72
73     /**
74      * Increments the port number, clears the servers, and resets the providers.
75      */
76     @Before
77     public void setUp() {
78         port += 10;
79         portUrl = LOCALHOST_PREFIX + port;
80
81         HttpServletServer.factory.destroy();
82
83         MyJacksonProvider.resetSome();
84         MyGsonProvider.resetSome();
85     }
86
87     @AfterClass
88     public static void tearDownAfterClass() {
89         HttpServletServer.factory.destroy();
90     }
91
92     @Test
93     public void testDefaultPackageServer() throws Exception {
94         logger.info("-- testDefaultPackageServer() --");
95
96         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
97         server.addServletPackage("/*", this.getClass().getPackage().getName());
98         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
99         server.waitedStart(5000);
100
101         assertTrue(HttpServletServer.factory.get(port).isAlive());
102
103         RestEchoReqResp request = new RestEchoReqResp();
104         request.setRequestId(100);
105         request.setText(SOME_TEXT);
106         String reqText = gson.toJson(request);
107
108         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
109         assertEquals(reqText, response);
110     }
111
112     @Test
113     public void testJacksonPackageServer() throws Exception {
114         logger.info("-- testJacksonPackageServer() --");
115
116         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
117
118         server.setSerializationProvider(MyJacksonProvider.class.getCanonicalName());
119         server.addServletPackage("/*", this.getClass().getPackage().getName());
120         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
121         server.waitedStart(5000);
122
123         assertTrue(HttpServletServer.factory.get(port).isAlive());
124
125         RestEchoReqResp request = new RestEchoReqResp();
126         request.setRequestId(100);
127         request.setText(SOME_TEXT);
128         String reqText = gson.toJson(request);
129
130         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
131         assertEquals(reqText, response);
132
133         assertTrue(MyJacksonProvider.hasReadSome());
134         assertTrue(MyJacksonProvider.hasWrittenSome());
135
136         assertFalse(MyGsonProvider.hasReadSome());
137         assertFalse(MyGsonProvider.hasWrittenSome());
138     }
139
140     @Test
141     public void testGsonPackageServer() throws Exception {
142         logger.info("-- testGsonPackageServer() --");
143
144         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
145
146         server.setSerializationProvider(MyGsonProvider.class.getCanonicalName());
147         server.addServletPackage("/*", this.getClass().getPackage().getName());
148         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
149         server.waitedStart(5000);
150
151         assertTrue(HttpServletServer.factory.get(port).isAlive());
152
153         RestEchoReqResp request = new RestEchoReqResp();
154         request.setRequestId(100);
155         request.setText(SOME_TEXT);
156         String reqText = gson.toJson(request);
157
158         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
159         assertEquals(reqText, response);
160
161         assertTrue(MyGsonProvider.hasReadSome());
162         assertTrue(MyGsonProvider.hasWrittenSome());
163
164         assertFalse(MyJacksonProvider.hasReadSome());
165         assertFalse(MyJacksonProvider.hasWrittenSome());
166     }
167
168     @Test
169     public void testDefaultClassServer() throws Exception {
170         logger.info("-- testDefaultClassServer() --");
171
172         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
173         server.addServletClass("/*", RestEchoService.class.getCanonicalName());
174         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
175         server.waitedStart(5000);
176
177         assertTrue(HttpServletServer.factory.get(port).isAlive());
178
179         RestEchoReqResp request = new RestEchoReqResp();
180         request.setRequestId(100);
181         request.setText(SOME_TEXT);
182         String reqText = gson.toJson(request);
183
184         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
185         assertEquals(reqText, response);
186     }
187
188     @Test
189     public void testJacksonClassServer() throws Exception {
190         logger.info("-- testJacksonClassServer() --");
191
192         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
193         server.setSerializationProvider(MyJacksonProvider.class.getCanonicalName());
194         server.addServletClass("/*", RestEchoService.class.getCanonicalName());
195         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
196         server.waitedStart(5000);
197
198         assertTrue(HttpServletServer.factory.get(port).isAlive());
199
200         RestEchoReqResp request = new RestEchoReqResp();
201         request.setRequestId(100);
202         request.setText(SOME_TEXT);
203         String reqText = gson.toJson(request);
204
205         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
206         assertEquals(reqText, response);
207
208         assertTrue(MyJacksonProvider.hasReadSome());
209         assertTrue(MyJacksonProvider.hasWrittenSome());
210
211         assertFalse(MyGsonProvider.hasReadSome());
212         assertFalse(MyGsonProvider.hasWrittenSome());
213     }
214
215     @Test
216     public void testGsonClassServer() throws Exception {
217         logger.info("-- testGsonClassServer() --");
218
219         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
220         server.setSerializationProvider(MyGsonProvider.class.getCanonicalName());
221         server.addServletClass("/*", RestEchoService.class.getCanonicalName());
222         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
223         server.waitedStart(5000);
224
225         assertTrue(HttpServletServer.factory.get(port).isAlive());
226
227         RestEchoReqResp request = new RestEchoReqResp();
228         request.setRequestId(100);
229         request.setText(SOME_TEXT);
230         String reqText = gson.toJson(request);
231
232         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
233         assertEquals(reqText, response);
234
235         assertTrue(MyGsonProvider.hasReadSome());
236         assertTrue(MyGsonProvider.hasWrittenSome());
237
238         assertFalse(MyJacksonProvider.hasReadSome());
239         assertFalse(MyJacksonProvider.hasWrittenSome());
240     }
241
242     @Test
243     public void testSerialize() {
244         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
245         server.addServletPackage("/*", this.getClass().getPackage().getName());
246         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
247
248         // ensure we can serialize the server
249         new GsonTestUtils().compareGson(server, HttpServerTest.class);
250     }
251
252     @Test
253     public void testSingleServer() throws Exception {
254         logger.info("-- testSingleServer() --");
255
256         HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
257         server.addServletPackage("/*", this.getClass().getPackage().getName());
258         server.addFilterClass("/*", TestFilter.class.getCanonicalName());
259         server.waitedStart(5000);
260
261         assertTrue(HttpServletServer.factory.get(port).isAlive());
262         assertFalse(HttpServletServer.factory.get(port).isAaf());
263
264         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_HELLO);
265         assertEquals(HELLO, response);
266
267         response = null;
268         try {
269             response = http(HttpServletServer.factory.get(port), portUrl + SWAGGER_JSON);
270         } catch (IOException e) {
271             // Expected
272         }
273         assertTrue(response == null);
274
275         response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello?block=true");
276         assertEquals("FILTERED", response);
277
278         assertTrue(HttpServletServer.factory.get(port).isAlive());
279         assertEquals(1, HttpServletServer.factory.inventory().size());
280
281         server.setAafAuthentication("/*");
282         assertTrue(HttpServletServer.factory.get(port).isAaf());
283
284         HttpServletServer.factory.destroy(port);
285         assertEquals(0, HttpServletServer.factory.inventory().size());
286     }
287
288     @Test
289     public void testMultipleServers() throws Exception {
290         logger.info("-- testMultipleServers() --");
291
292         HttpServletServer server1 = HttpServletServer.factory.build("echo-1", false,LOCALHOST, port, "/", true, true);
293         server1.addServletPackage("/*", this.getClass().getPackage().getName());
294         server1.waitedStart(5000);
295
296         int port2 = port + 1;
297
298         HttpServletServer server2 = HttpServletServer.factory.build("echo-2", LOCALHOST, port2, "/", false, true);
299         server2.addServletPackage("/*", this.getClass().getPackage().getName());
300         server2.waitedStart(5000);
301
302         assertTrue(HttpServletServer.factory.get(port).isAlive());
303         assertTrue(HttpServletServer.factory.get(port2).isAlive());
304
305         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_HELLO);
306         assertTrue(HELLO.equals(response));
307
308         response = http(HttpServletServer.factory.get(port), portUrl + SWAGGER_JSON);
309         assertTrue(response != null);
310
311         response = http(HttpServletServer.factory.get(port2), LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
312         assertTrue(HELLO.equals(response));
313
314         response = null;
315         try {
316             response = http(HttpServletServer.factory.get(port2), LOCALHOST_PREFIX + port2 + SWAGGER_JSON);
317         } catch (IOException e) {
318             // Expected
319         }
320         assertTrue(response == null);
321
322         HttpServletServer.factory.destroy();
323         assertTrue(HttpServletServer.factory.inventory().isEmpty());
324     }
325
326     @Test
327     public void testMultiServicePackage() throws Exception {
328         logger.info("-- testMultiServicePackage() --");
329
330         String randomName = UUID.randomUUID().toString();
331
332         HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
333         server.addServletPackage("/*", this.getClass().getPackage().getName());
334         server.waitedStart(5000);
335
336         assertTrue(HttpServletServer.factory.get(port).isAlive());
337
338         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_HELLO);
339         assertTrue(HELLO.equals(response));
340
341         response = http(HttpServletServer.factory.get(port), portUrl + "/junit/endpoints/http/servers");
342         assertTrue(response.contains(randomName));
343
344         HttpServletServer.factory.destroy();
345         assertTrue(HttpServletServer.factory.inventory().isEmpty());
346     }
347
348     @Test
349     public void testServiceClass() throws Exception {
350         logger.info("-- testServiceClass() --");
351         String randomName = UUID.randomUUID().toString();
352
353         HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
354         server.addServletClass("/*", RestEchoService.class.getCanonicalName());
355         server.waitedStart(5000);
356
357         assertTrue(HttpServletServer.factory.get(port).isAlive());
358
359         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_HELLO);
360         assertTrue(HELLO.equals(response));
361
362         HttpServletServer.factory.destroy();
363         assertTrue(HttpServletServer.factory.inventory().isEmpty());
364     }
365
366     @Test
367     public void testMultiServiceClass() throws Exception {
368         logger.info("-- testMultiServiceClass() --");
369
370         String randomName = UUID.randomUUID().toString();
371
372         HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
373         server.addServletClass("/*", RestEchoService.class.getCanonicalName());
374         server.addServletClass("/*", RestEndpoints.class.getCanonicalName());
375         server.waitedStart(5000);
376
377         assertTrue(HttpServletServer.factory.get(port).isAlive());
378
379         String response = http(HttpServletServer.factory.get(port), portUrl + JUNIT_ECHO_HELLO);
380         assertTrue(HELLO.equals(response));
381
382         response = http(HttpServletServer.factory.get(port), portUrl + "/junit/endpoints/http/servers");
383         assertTrue(response.contains(randomName));
384
385         HttpServletServer.factory.destroy();
386         assertTrue(HttpServletServer.factory.inventory().isEmpty());
387     }
388
389     /**
390      * performs an http request.
391      *
392      * @throws MalformedURLException make sure URL is good
393      * @throws IOException thrown is IO exception occurs
394      * @throws InterruptedException thrown if thread interrupted occurs
395      */
396     protected String http(HttpServletServer server, String urlString)
397             throws IOException, InterruptedException {
398         URL url = new URL(urlString);
399         String response = null;
400         int numRetries = 1;
401         int maxNumberRetries = 5;
402         while (numRetries <= maxNumberRetries) {
403             try {
404                 URLConnection conn = url.openConnection();
405                 response = response(conn);
406                 break;
407             } catch (ConnectException e) {
408                 logger.warn("http server {} @ {} ({}) - cannot connect yet ..", server, urlString, numRetries, e);
409                 numRetries++;
410                 Thread.sleep(10000L);
411             } catch (Exception e) {
412                 throw e;
413             }
414         }
415
416         return response;
417     }
418
419     /**
420      * Performs an http request.
421      *
422      * @throws MalformedURLException make sure URL is good
423      * @throws IOException thrown is IO exception occurs
424      * @throws InterruptedException thrown if thread interrupted occurs
425      */
426     protected String http(HttpServletServer server, String urlString, String post)
427             throws IOException, InterruptedException {
428         URL url = new URL(urlString);
429         String response = null;
430         int numRetries = 1;
431         int maxNumberRetries = 5;
432         while (numRetries <= maxNumberRetries) {
433             try {
434                 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
435                 conn.setRequestMethod("POST");
436                 conn.setDoOutput(true);
437                 conn.setRequestProperty("Content-Type", "application/json");
438                 IOUtils.write(post, conn.getOutputStream());
439                 response = response(conn);
440                 break;
441             } catch (ConnectException e) {
442                 logger.warn("http server {} @ {} ({}) - cannot connect yet ..", server, urlString, numRetries, e);
443                 numRetries++;
444                 Thread.sleep(10000L);
445             } catch (Exception e) {
446                 logger.error("http error", e);
447                 throw e;
448             }
449         }
450
451         return response;
452     }
453
454     /**
455      * gets http response.
456      *
457      * @param conn connection from which to read
458      *
459      * @throws IOException if an I/O error occurs
460      */
461     protected String response(URLConnection conn) throws IOException {
462         StringBuilder response = new StringBuilder();
463         try (BufferedReader ioReader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
464             String line;
465             while ((line = ioReader.readLine()) != null) {
466                 response.append(line);
467             }
468         }
469         return response.toString();
470     }
471
472 }