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.assertj.core.api.Assertions.assertThatThrownBy;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertTrue;
28 import com.google.gson.Gson;
29 import java.io.IOException;
30 import java.io.InputStream;
31 import java.net.HttpURLConnection;
32 import java.net.MalformedURLException;
34 import java.net.URLConnection;
35 import java.util.UUID;
36 import org.apache.commons.io.IOUtils;
37 import org.junit.AfterClass;
38 import org.junit.Before;
39 import org.junit.Test;
40 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
41 import org.onap.policy.common.endpoints.http.server.HttpServletServerFactoryInstance;
42 import org.onap.policy.common.utils.coder.StandardYamlCoder;
43 import org.onap.policy.common.utils.gson.GsonTestUtils;
44 import org.onap.policy.common.utils.network.NetworkUtil;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
49 * HttpServletServer JUNIT tests.
51 public class HttpServerTest {
52 private static final String LOCALHOST = "localhost";
53 private static final String JSON_MEDIA = "application/json";
54 private static final String YAML_MEDIA = "application/yaml";
55 private static final String SWAGGER_JSON = "/swagger.json";
56 private static final String JUNIT_ECHO_HELLO = "/junit/echo/hello";
57 private static final String JUNIT_ECHO_FULL_REQUEST = "/junit/echo/full/request";
58 private static final String SOME_TEXT = "some text";
59 private static final String HELLO = "hello";
64 private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
66 private static final String LOCALHOST_PREFIX = "http://localhost:";
68 private static final Gson gson = new Gson();
71 * Server port. Incremented by 10 with each test.
73 private static int port = 5608;
75 private String portUrl;
78 * Increments the port number, clears the servers, and resets the providers.
83 portUrl = LOCALHOST_PREFIX + port;
85 HttpServletServerFactoryInstance.getServerFactory().destroy();
87 MyJacksonProvider.resetSome();
88 MyGsonProvider.resetSome();
89 MyYamlProvider.resetSome();
92 private static void incrementPort() {
97 public static void tearDownAfterClass() {
98 HttpServletServerFactoryInstance.getServerFactory().destroy();
102 public void testDefaultPackageServer() throws Exception {
103 logger.info("-- testDefaultPackageServer() --");
105 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
106 .build("echo", LOCALHOST, port, "/", false, true);
107 server.addServletPackage("/*", this.getClass().getPackage().getName());
108 server.addFilterClass("/*", TestFilter.class.getName());
109 server.waitedStart(5000);
111 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
113 RestEchoReqResp request = new RestEchoReqResp();
114 request.setRequestId(100);
115 request.setText(SOME_TEXT);
116 String reqText = gson.toJson(request);
118 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
119 assertEquals(reqText, response);
123 public void testJacksonPackageServer() throws Exception {
124 logger.info("-- testJacksonPackageServer() --");
126 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
127 .build("echo", LOCALHOST, port, "/", false, true);
129 server.setSerializationProvider(MyJacksonProvider.class.getName());
130 server.addServletPackage("/*", this.getClass().getPackage().getName());
131 server.addFilterClass("/*", TestFilter.class.getName());
132 server.waitedStart(5000);
134 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
136 RestEchoReqResp request = new RestEchoReqResp();
137 request.setRequestId(100);
138 request.setText(SOME_TEXT);
139 String reqText = gson.toJson(request);
141 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
142 assertEquals(reqText, response);
144 assertTrue(MyJacksonProvider.hasReadSome());
145 assertTrue(MyJacksonProvider.hasWrittenSome());
147 assertFalse(MyGsonProvider.hasReadSome());
148 assertFalse(MyGsonProvider.hasWrittenSome());
150 assertFalse(MyYamlProvider.hasReadSome());
151 assertFalse(MyYamlProvider.hasWrittenSome());
155 public void testGsonPackageServer() throws Exception {
156 logger.info("-- testGsonPackageServer() --");
158 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
159 .build("echo", LOCALHOST, port, "/", false, true);
161 server.setSerializationProvider(MyGsonProvider.class.getName());
162 server.addServletPackage("/*", this.getClass().getPackage().getName());
163 server.addFilterClass("/*", TestFilter.class.getName());
164 server.waitedStart(5000);
166 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
168 RestEchoReqResp request = new RestEchoReqResp();
169 request.setRequestId(100);
170 request.setText(SOME_TEXT);
171 String reqText = gson.toJson(request);
173 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
174 assertEquals(reqText, response);
176 assertTrue(MyGsonProvider.hasReadSome());
177 assertTrue(MyGsonProvider.hasWrittenSome());
179 assertFalse(MyJacksonProvider.hasReadSome());
180 assertFalse(MyJacksonProvider.hasWrittenSome());
182 assertFalse(MyYamlProvider.hasReadSome());
183 assertFalse(MyYamlProvider.hasWrittenSome());
187 public void testYamlPackageServer() throws Exception {
188 logger.info("-- testYamlPackageServer() --");
190 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
191 .build("echo", LOCALHOST, port, "/", false, true);
193 server.setSerializationProvider(MyYamlProvider.class.getName());
194 server.addServletPackage("/*", this.getClass().getPackage().getName());
195 server.addFilterClass("/*", TestFilter.class.getName());
196 server.waitedStart(5000);
198 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
200 RestEchoReqResp request = new RestEchoReqResp();
201 request.setRequestId(100);
202 request.setText(SOME_TEXT);
203 String reqText = new StandardYamlCoder().encode(request);
205 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, YAML_MEDIA, reqText);
207 // response reader strips newlines, so we should, too, before comparing
208 assertEquals(reqText.replace("\n", ""), response);
210 assertTrue(MyYamlProvider.hasReadSome());
211 assertTrue(MyYamlProvider.hasWrittenSome());
213 assertFalse(MyGsonProvider.hasReadSome());
214 assertFalse(MyGsonProvider.hasWrittenSome());
216 assertFalse(MyJacksonProvider.hasReadSome());
217 assertFalse(MyJacksonProvider.hasWrittenSome());
221 public void testDefaultClassServer() throws Exception {
222 logger.info("-- testDefaultClassServer() --");
224 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
225 .build("echo", LOCALHOST, port, "/", false, true);
226 server.addServletClass("/*", RestEchoService.class.getName());
227 server.addFilterClass("/*", TestFilter.class.getName());
228 server.waitedStart(5000);
230 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
232 RestEchoReqResp request = new RestEchoReqResp();
233 request.setRequestId(100);
234 request.setText(SOME_TEXT);
235 String reqText = gson.toJson(request);
237 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
238 assertEquals(reqText, response);
242 public void testJacksonClassServer() throws Exception {
243 logger.info("-- testJacksonClassServer() --");
245 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
246 .build("echo", LOCALHOST, port, "/", false, true);
247 server.setSerializationProvider(MyJacksonProvider.class.getName());
248 server.addServletClass("/*", RestEchoService.class.getName());
249 server.addFilterClass("/*", TestFilter.class.getName());
250 server.waitedStart(5000);
252 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
254 RestEchoReqResp request = new RestEchoReqResp();
255 request.setRequestId(100);
256 request.setText(SOME_TEXT);
257 String reqText = gson.toJson(request);
259 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
260 assertEquals(reqText, response);
262 assertTrue(MyJacksonProvider.hasReadSome());
263 assertTrue(MyJacksonProvider.hasWrittenSome());
265 assertFalse(MyGsonProvider.hasReadSome());
266 assertFalse(MyGsonProvider.hasWrittenSome());
268 assertFalse(MyYamlProvider.hasReadSome());
269 assertFalse(MyYamlProvider.hasWrittenSome());
273 public void testGsonClassServer() throws Exception {
274 logger.info("-- testGsonClassServer() --");
276 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
277 .build("echo", LOCALHOST, port, "/", false, true);
278 server.setSerializationProvider(MyGsonProvider.class.getName());
279 server.addServletClass("/*", RestEchoService.class.getName());
280 server.addFilterClass("/*", TestFilter.class.getName());
281 server.waitedStart(5000);
283 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
285 RestEchoReqResp request = new RestEchoReqResp();
286 request.setRequestId(100);
287 request.setText(SOME_TEXT);
288 String reqText = gson.toJson(request);
290 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
291 assertEquals(reqText, response);
293 assertTrue(MyGsonProvider.hasReadSome());
294 assertTrue(MyGsonProvider.hasWrittenSome());
296 assertFalse(MyJacksonProvider.hasReadSome());
297 assertFalse(MyJacksonProvider.hasWrittenSome());
299 assertFalse(MyYamlProvider.hasReadSome());
300 assertFalse(MyYamlProvider.hasWrittenSome());
304 public void testYamlClassServer() throws Exception {
305 logger.info("-- testYamlClassServer() --");
307 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
308 .build("echo", LOCALHOST, port, "/", false, true);
309 server.setSerializationProvider(MyYamlProvider.class.getName());
310 server.addServletClass("/*", RestEchoService.class.getName());
311 server.addFilterClass("/*", TestFilter.class.getName());
312 server.waitedStart(5000);
314 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
316 RestEchoReqResp request = new RestEchoReqResp();
317 request.setRequestId(100);
318 request.setText(SOME_TEXT);
319 String reqText = new StandardYamlCoder().encode(request);
321 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, YAML_MEDIA, reqText);
323 // response reader strips newlines, so we should, too, before comparing
324 assertEquals(reqText.replace("\n", ""), response);
326 assertTrue(MyYamlProvider.hasReadSome());
327 assertTrue(MyYamlProvider.hasWrittenSome());
329 assertFalse(MyGsonProvider.hasReadSome());
330 assertFalse(MyGsonProvider.hasWrittenSome());
332 assertFalse(MyJacksonProvider.hasReadSome());
333 assertFalse(MyJacksonProvider.hasWrittenSome());
337 public void testSerialize() {
338 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
339 .build("echo", LOCALHOST, port, "/", false, true);
340 server.addServletPackage("/*", this.getClass().getPackage().getName());
341 server.addFilterClass("/*", TestFilter.class.getName());
343 // ensure we can serialize the server
344 new GsonTestUtils().compareGson(server, HttpServerTest.class);
348 public void testSingleServer() throws Exception {
349 logger.info("-- testSingleServer() --");
351 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
352 .build("echo", LOCALHOST, port, "/", false, true);
353 server.addServletPackage("/*", this.getClass().getPackage().getName());
354 server.addFilterClass("/*", TestFilter.class.getName());
355 server.waitedStart(5000);
357 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
358 assertFalse(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
360 String response = http(portUrl + JUNIT_ECHO_HELLO);
361 assertEquals(HELLO, response);
363 assertThatThrownBy(() -> http(portUrl + SWAGGER_JSON)).isInstanceOf(IOException.class);
365 response = http(portUrl + "/junit/echo/hello?block=true");
366 assertEquals("FILTERED", response);
368 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
369 assertEquals(1, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
371 server.setAafAuthentication("/*");
372 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
374 HttpServletServerFactoryInstance.getServerFactory().destroy(port);
375 assertEquals(0, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
379 public void testMultipleServers() throws Exception {
380 logger.info("-- testMultipleServers() --");
382 HttpServletServer server1 = HttpServletServerFactoryInstance.getServerFactory()
383 .build("echo-1", false,LOCALHOST, port, "/", true, true);
384 server1.addServletPackage("/*", this.getClass().getPackage().getName());
385 server1.waitedStart(5000);
387 int port2 = port + 1;
389 HttpServletServer server2 = HttpServletServerFactoryInstance.getServerFactory()
390 .build("echo-2", LOCALHOST, port2, "/", false, true);
391 server2.addServletPackage("/*", this.getClass().getPackage().getName());
392 server2.waitedStart(5000);
394 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
395 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port2).isAlive());
397 String response = http(portUrl + JUNIT_ECHO_HELLO);
398 assertTrue(HELLO.equals(response));
400 response = http(portUrl + SWAGGER_JSON);
401 assertTrue(response != null);
403 response = http(LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
404 assertTrue(HELLO.equals(response));
406 assertThatThrownBy(() -> http(LOCALHOST_PREFIX + port2 + SWAGGER_JSON)).isInstanceOf(IOException.class);
408 HttpServletServerFactoryInstance.getServerFactory().destroy();
409 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
413 public void testMultiServicePackage() throws Exception {
414 logger.info("-- testMultiServicePackage() --");
416 String randomName = UUID.randomUUID().toString();
418 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
419 .build(randomName, LOCALHOST, port, "/", false, true);
420 server.addServletPackage("/*", this.getClass().getPackage().getName());
421 server.waitedStart(5000);
423 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
425 String response = http(portUrl + JUNIT_ECHO_HELLO);
426 assertTrue(HELLO.equals(response));
428 response = http(portUrl + "/junit/endpoints/http/servers");
429 assertTrue(response.contains(randomName));
431 HttpServletServerFactoryInstance.getServerFactory().destroy();
432 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
436 public void testServiceClass() throws Exception {
437 logger.info("-- testServiceClass() --");
438 String randomName = UUID.randomUUID().toString();
440 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
441 .build(randomName, LOCALHOST, port, "/", false, true);
442 server.addServletClass("/*", RestEchoService.class.getName());
443 server.waitedStart(5000);
445 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
447 String response = http(portUrl + JUNIT_ECHO_HELLO);
448 assertTrue(HELLO.equals(response));
450 HttpServletServerFactoryInstance.getServerFactory().destroy();
451 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
455 public void testMultiServiceClass() throws Exception {
456 logger.info("-- testMultiServiceClass() --");
458 String randomName = UUID.randomUUID().toString();
460 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
461 .build(randomName, LOCALHOST, port, "/", false, true);
462 server.addServletClass("/*", RestEchoService.class.getName());
463 server.addServletClass("/*", RestEndpoints.class.getName());
464 server.waitedStart(5000);
466 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
468 String response = http(portUrl + JUNIT_ECHO_HELLO);
469 assertTrue(HELLO.equals(response));
471 response = http(portUrl + "/junit/endpoints/http/servers");
472 assertTrue(response.contains(randomName));
474 HttpServletServerFactoryInstance.getServerFactory().destroy();
475 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
479 * performs an http request.
481 * @throws MalformedURLException make sure URL is good
482 * @throws IOException thrown is IO exception occurs
483 * @throws InterruptedException thrown if thread interrupted occurs
485 private String http(String urlString)
486 throws IOException, InterruptedException {
487 URL url = new URL(urlString);
488 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
489 throw new IllegalStateException("port never opened: " + url);
491 return response(url.openConnection());
495 * Performs an http request.
497 * @throws MalformedURLException make sure URL is good
498 * @throws IOException thrown is IO exception occurs
499 * @throws InterruptedException thrown if thread interrupted occurs
501 private String http(String urlString, String mediaType, String post)
502 throws IOException, InterruptedException {
503 URL url = new URL(urlString);
504 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
505 throw new IllegalStateException("port never opened: " + url);
507 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
508 conn.setRequestMethod("POST");
509 conn.setDoOutput(true);
510 conn.setRequestProperty("Content-Type", mediaType);
511 IOUtils.write(post, conn.getOutputStream());
512 return response(conn);
516 * gets http response.
518 * @param conn connection from which to read
520 * @throws IOException if an I/O error occurs
522 private String response(URLConnection conn) throws IOException {
523 try (InputStream inpstr = conn.getInputStream()) {
524 return String.join("", IOUtils.readLines(inpstr));