2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
21 package org.onap.policy.common.endpoints.http.server.test;
23 import static org.junit.Assert.assertEquals;
24 import static org.junit.Assert.assertFalse;
25 import static org.junit.Assert.assertTrue;
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;
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.slf4j.Logger;
43 import org.slf4j.LoggerFactory;
46 * HttpServletServer JUNIT tests.
48 public class HttpServerTest {
53 private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
55 private static final String LOCALHOST_PREFIX = "http://localhost:";
57 private static final Gson gson = new Gson();
60 * Server port. Incremented by 10 with each test.
62 private static int port = 5608;
64 private String portUrl;
67 * Increments the port number, clears the servers, and resets the providers.
72 portUrl = LOCALHOST_PREFIX + port;
74 HttpServletServer.factory.destroy();
76 MyJacksonProvider.resetSome();
77 MyGsonProvider.resetSome();
81 public static void tearDownAfterClass() {
82 HttpServletServer.factory.destroy();
86 public void testDefaultPackageServer() throws Exception {
87 logger.info("-- testDefaultPackageServer() --");
89 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
90 server.addServletPackage("/*", this.getClass().getPackage().getName());
91 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
92 server.waitedStart(5000);
94 assertTrue(HttpServletServer.factory.get(port).isAlive());
96 RestEchoReqResp request = new RestEchoReqResp();
97 request.setRequestId(100);
98 request.setText("some text");
99 String reqText = gson.toJson(request);
101 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
102 assertEquals(reqText, response);
106 public void testJacksonPackageServer() throws Exception {
107 logger.info("-- testJacksonPackageServer() --");
109 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
111 server.setSerializationProvider(MyJacksonProvider.class.getCanonicalName());
112 server.addServletPackage("/*", this.getClass().getPackage().getName());
113 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
114 server.waitedStart(5000);
116 assertTrue(HttpServletServer.factory.get(port).isAlive());
118 RestEchoReqResp request = new RestEchoReqResp();
119 request.setRequestId(100);
120 request.setText("some text");
121 String reqText = gson.toJson(request);
123 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
124 assertEquals(reqText, response);
126 assertTrue(MyJacksonProvider.hasReadSome());
127 assertTrue(MyJacksonProvider.hasWrittenSome());
129 assertFalse(MyGsonProvider.hasReadSome());
130 assertFalse(MyGsonProvider.hasWrittenSome());
134 public void testGsonPackageServer() throws Exception {
135 logger.info("-- testGsonPackageServer() --");
137 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
139 server.setSerializationProvider(MyGsonProvider.class.getCanonicalName());
140 server.addServletPackage("/*", this.getClass().getPackage().getName());
141 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
142 server.waitedStart(5000);
144 assertTrue(HttpServletServer.factory.get(port).isAlive());
146 RestEchoReqResp request = new RestEchoReqResp();
147 request.setRequestId(100);
148 request.setText("some text");
149 String reqText = gson.toJson(request);
151 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
152 assertEquals(reqText, response);
154 assertTrue(MyGsonProvider.hasReadSome());
155 assertTrue(MyGsonProvider.hasWrittenSome());
157 assertFalse(MyJacksonProvider.hasReadSome());
158 assertFalse(MyJacksonProvider.hasWrittenSome());
162 public void testDefaultClassServer() throws Exception {
163 logger.info("-- testDefaultClassServer() --");
165 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
166 server.addServletClass("/*", RestEchoService.class.getCanonicalName());
167 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
168 server.waitedStart(5000);
170 assertTrue(HttpServletServer.factory.get(port).isAlive());
172 RestEchoReqResp request = new RestEchoReqResp();
173 request.setRequestId(100);
174 request.setText("some text");
175 String reqText = gson.toJson(request);
177 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
178 assertEquals(reqText, response);
182 public void testJacksonClassServer() throws Exception {
183 logger.info("-- testJacksonClassServer() --");
185 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
186 server.setSerializationProvider(MyJacksonProvider.class.getCanonicalName());
187 server.addServletClass("/*", RestEchoService.class.getCanonicalName());
188 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
189 server.waitedStart(5000);
191 assertTrue(HttpServletServer.factory.get(port).isAlive());
193 RestEchoReqResp request = new RestEchoReqResp();
194 request.setRequestId(100);
195 request.setText("some text");
196 String reqText = gson.toJson(request);
198 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
199 assertEquals(reqText, response);
201 assertTrue(MyJacksonProvider.hasReadSome());
202 assertTrue(MyJacksonProvider.hasWrittenSome());
204 assertFalse(MyGsonProvider.hasReadSome());
205 assertFalse(MyGsonProvider.hasWrittenSome());
209 public void testGsonClassServer() throws Exception {
210 logger.info("-- testGsonClassServer() --");
212 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
213 server.setSerializationProvider(MyGsonProvider.class.getCanonicalName());
214 server.addServletClass("/*", RestEchoService.class.getCanonicalName());
215 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
216 server.waitedStart(5000);
218 assertTrue(HttpServletServer.factory.get(port).isAlive());
220 RestEchoReqResp request = new RestEchoReqResp();
221 request.setRequestId(100);
222 request.setText("some text");
223 String reqText = gson.toJson(request);
225 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/full/request", reqText);
226 assertEquals(reqText, response);
228 assertTrue(MyGsonProvider.hasReadSome());
229 assertTrue(MyGsonProvider.hasWrittenSome());
231 assertFalse(MyJacksonProvider.hasReadSome());
232 assertFalse(MyJacksonProvider.hasWrittenSome());
236 public void testSingleServer() throws Exception {
237 logger.info("-- testSingleServer() --");
239 HttpServletServer server = HttpServletServer.factory.build("echo", "localhost", port, "/", false, true);
240 server.addServletPackage("/*", this.getClass().getPackage().getName());
241 server.addFilterClass("/*", TestFilter.class.getCanonicalName());
242 server.waitedStart(5000);
244 assertTrue(HttpServletServer.factory.get(port).isAlive());
245 assertFalse(HttpServletServer.factory.get(port).isAaf());
247 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello");
248 assertTrue("hello".equals(response));
252 response = http(HttpServletServer.factory.get(port), portUrl + "/swagger.json");
253 } catch (IOException e) {
256 assertTrue(response == null);
258 response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello?block=true");
259 assertEquals("FILTERED", response);
261 assertTrue(HttpServletServer.factory.get(port).isAlive());
262 assertEquals(1, HttpServletServer.factory.inventory().size());
264 server.setAafAuthentication("/*");
265 assertTrue(HttpServletServer.factory.get(port).isAaf());
267 HttpServletServer.factory.destroy(port);
268 assertEquals(0, HttpServletServer.factory.inventory().size());
272 public void testMultipleServers() throws Exception {
273 logger.info("-- testMultipleServers() --");
275 HttpServletServer server1 = HttpServletServer.factory.build("echo-1", false,"localhost", port, "/", true, true);
276 server1.addServletPackage("/*", this.getClass().getPackage().getName());
277 server1.waitedStart(5000);
279 int port2 = port + 1;
281 HttpServletServer server2 = HttpServletServer.factory.build("echo-2", "localhost", port2, "/", false, true);
282 server2.addServletPackage("/*", this.getClass().getPackage().getName());
283 server2.waitedStart(5000);
285 assertTrue(HttpServletServer.factory.get(port).isAlive());
286 assertTrue(HttpServletServer.factory.get(port2).isAlive());
288 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello");
289 assertTrue("hello".equals(response));
291 response = http(HttpServletServer.factory.get(port), portUrl + "/swagger.json");
292 assertTrue(response != null);
294 response = http(HttpServletServer.factory.get(port2), LOCALHOST_PREFIX + port2 + "/junit/echo/hello");
295 assertTrue("hello".equals(response));
299 response = http(HttpServletServer.factory.get(port2), LOCALHOST_PREFIX + port2 + "/swagger.json");
300 } catch (IOException e) {
303 assertTrue(response == null);
305 HttpServletServer.factory.destroy();
306 assertTrue(HttpServletServer.factory.inventory().size() == 0);
310 public void testMultiServicePackage() throws Exception {
311 logger.info("-- testMultiServicePackage() --");
313 String randomName = UUID.randomUUID().toString();
315 HttpServletServer server = HttpServletServer.factory.build(randomName, "localhost", port, "/", false, true);
316 server.addServletPackage("/*", this.getClass().getPackage().getName());
317 server.waitedStart(5000);
319 assertTrue(HttpServletServer.factory.get(port).isAlive());
321 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello");
322 assertTrue("hello".equals(response));
324 response = http(HttpServletServer.factory.get(port), portUrl + "/junit/endpoints/http/servers");
325 assertTrue(response.contains(randomName));
327 HttpServletServer.factory.destroy();
328 assertTrue(HttpServletServer.factory.inventory().size() == 0);
332 public void testServiceClass() throws Exception {
333 logger.info("-- testServiceClass() --");
334 String randomName = UUID.randomUUID().toString();
336 HttpServletServer server = HttpServletServer.factory.build(randomName, "localhost", port, "/", false, true);
337 server.addServletClass("/*", RestEchoService.class.getCanonicalName());
338 server.waitedStart(5000);
340 assertTrue(HttpServletServer.factory.get(port).isAlive());
342 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello");
343 assertTrue("hello".equals(response));
345 HttpServletServer.factory.destroy();
346 assertTrue(HttpServletServer.factory.inventory().size() == 0);
350 public void testMultiServiceClass() throws Exception {
351 logger.info("-- testMultiServiceClass() --");
353 String randomName = UUID.randomUUID().toString();
355 HttpServletServer server = HttpServletServer.factory.build(randomName, "localhost", port, "/", false, true);
356 server.addServletClass("/*", RestEchoService.class.getCanonicalName());
357 server.addServletClass("/*", RestEndpoints.class.getCanonicalName());
358 server.waitedStart(5000);
360 assertTrue(HttpServletServer.factory.get(port).isAlive());
362 String response = http(HttpServletServer.factory.get(port), portUrl + "/junit/echo/hello");
363 assertTrue("hello".equals(response));
365 response = http(HttpServletServer.factory.get(port), portUrl + "/junit/endpoints/http/servers");
366 assertTrue(response.contains(randomName));
368 HttpServletServer.factory.destroy();
369 assertTrue(HttpServletServer.factory.inventory().size() == 0);
373 * performs an http request.
375 * @throws MalformedURLException make sure URL is good
376 * @throws IOException thrown is IO exception occurs
377 * @throws InterruptedException thrown if thread interrupted occurs
379 protected String http(HttpServletServer server, String urlString)
380 throws MalformedURLException, IOException, InterruptedException {
381 URL url = new URL(urlString);
382 String response = null;
384 int maxNumberRetries = 5;
385 while (numRetries <= maxNumberRetries) {
387 URLConnection conn = url.openConnection();
388 response = response(conn);
390 } catch (ConnectException e) {
391 logger.warn("http server {} @ {} ({}) - cannot connect yet ..", server, urlString, numRetries, e);
393 Thread.sleep(10000L);
394 } catch (Exception e) {
403 * Performs an http request.
405 * @throws MalformedURLException make sure URL is good
406 * @throws IOException thrown is IO exception occurs
407 * @throws InterruptedException thrown if thread interrupted occurs
409 protected String http(HttpServletServer server, String urlString, String post)
410 throws MalformedURLException, IOException, InterruptedException {
411 URL url = new URL(urlString);
412 String response = null;
414 int maxNumberRetries = 5;
415 while (numRetries <= maxNumberRetries) {
417 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
418 conn.setRequestMethod("POST");
419 conn.setDoOutput(true);
420 conn.setRequestProperty("Content-Type", "application/json");
421 IOUtils.write(post, conn.getOutputStream());
422 response = response(conn);
424 } catch (ConnectException e) {
425 logger.warn("http server {} @ {} ({}) - cannot connect yet ..", server, urlString, numRetries, e);
427 Thread.sleep(10000L);
428 } catch (Exception e) {
429 logger.error("http error", e);
438 * gets http response.
440 * @param conn connection from which to read
442 * @throws IOException if an I/O error occurs
444 protected String response(URLConnection conn) throws IOException {
445 String response = "";
446 try (BufferedReader ioReader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
448 while ((line = ioReader.readLine()) != null) {