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.endpoints.http.server.YamlMessageBodyHandler;
43 import org.onap.policy.common.utils.coder.StandardYamlCoder;
44 import org.onap.policy.common.utils.gson.GsonTestUtils;
45 import org.onap.policy.common.utils.network.NetworkUtil;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
50 * HttpServletServer JUNIT tests.
52 public class HttpServerTest {
53 private static final String LOCALHOST = "localhost";
54 private static final String JSON_MEDIA = "application/json";
55 private static final String YAML_MEDIA = YamlMessageBodyHandler.APPLICATION_YAML;
56 private static final String SWAGGER_JSON = "/swagger.json";
57 private static final String JUNIT_ECHO_HELLO = "/junit/echo/hello";
58 private static final String JUNIT_ECHO_FULL_REQUEST = "/junit/echo/full/request";
59 private static final String SOME_TEXT = "some text";
60 private static final String HELLO = "hello";
65 private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
67 private static final String LOCALHOST_PREFIX = "http://localhost:";
69 private static final Gson gson = new Gson();
72 * Server port. Incremented by 10 with each test.
74 private static int port = 5608;
76 private String portUrl;
79 * Increments the port number, clears the servers, and resets the providers.
84 portUrl = LOCALHOST_PREFIX + port;
86 HttpServletServerFactoryInstance.getServerFactory().destroy();
88 MyJacksonProvider.resetSome();
89 MyGsonProvider.resetSome();
90 MyYamlProvider.resetSome();
93 private static void incrementPort() {
98 public static void tearDownAfterClass() {
99 HttpServletServerFactoryInstance.getServerFactory().destroy();
103 public void testDefaultPackageServer() throws Exception {
104 logger.info("-- testDefaultPackageServer() --");
106 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
107 .build("echo", LOCALHOST, port, "/", false, true);
108 server.addServletPackage("/*", this.getClass().getPackage().getName());
109 server.addFilterClass("/*", TestFilter.class.getName());
110 server.waitedStart(5000);
112 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
114 RestEchoReqResp request = new RestEchoReqResp();
115 request.setRequestId(100);
116 request.setText(SOME_TEXT);
117 String reqText = gson.toJson(request);
119 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
120 assertEquals(reqText, response);
124 public void testJacksonPackageServer() throws Exception {
125 logger.info("-- testJacksonPackageServer() --");
127 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
128 .build("echo", LOCALHOST, port, "/", false, true);
130 server.setSerializationProvider(MyJacksonProvider.class.getName());
131 server.addServletPackage("/*", this.getClass().getPackage().getName());
132 server.addFilterClass("/*", TestFilter.class.getName());
133 server.waitedStart(5000);
135 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
137 RestEchoReqResp request = new RestEchoReqResp();
138 request.setRequestId(100);
139 request.setText(SOME_TEXT);
140 String reqText = gson.toJson(request);
142 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
143 assertEquals(reqText, response);
145 assertTrue(MyJacksonProvider.hasReadSome());
146 assertTrue(MyJacksonProvider.hasWrittenSome());
148 assertFalse(MyGsonProvider.hasReadSome());
149 assertFalse(MyGsonProvider.hasWrittenSome());
151 assertFalse(MyYamlProvider.hasReadSome());
152 assertFalse(MyYamlProvider.hasWrittenSome());
156 public void testGsonPackageServer() throws Exception {
157 logger.info("-- testGsonPackageServer() --");
159 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
160 .build("echo", LOCALHOST, port, "/", false, true);
162 server.setSerializationProvider(MyGsonProvider.class.getName());
163 server.addServletPackage("/*", this.getClass().getPackage().getName());
164 server.addFilterClass("/*", TestFilter.class.getName());
165 server.waitedStart(5000);
167 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
169 RestEchoReqResp request = new RestEchoReqResp();
170 request.setRequestId(100);
171 request.setText(SOME_TEXT);
172 String reqText = gson.toJson(request);
174 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
175 assertEquals(reqText, response);
177 assertTrue(MyGsonProvider.hasReadSome());
178 assertTrue(MyGsonProvider.hasWrittenSome());
180 assertFalse(MyJacksonProvider.hasReadSome());
181 assertFalse(MyJacksonProvider.hasWrittenSome());
183 assertFalse(MyYamlProvider.hasReadSome());
184 assertFalse(MyYamlProvider.hasWrittenSome());
188 public void testYamlPackageServer() throws Exception {
189 logger.info("-- testYamlPackageServer() --");
191 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
192 .build("echo", LOCALHOST, port, "/", false, true);
194 server.setSerializationProvider(MyYamlProvider.class.getName());
195 server.addServletPackage("/*", this.getClass().getPackage().getName());
196 server.addFilterClass("/*", TestFilter.class.getName());
197 server.waitedStart(5000);
199 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
201 RestEchoReqResp request = new RestEchoReqResp();
202 request.setRequestId(100);
203 request.setText(SOME_TEXT);
204 String reqText = new StandardYamlCoder().encode(request);
206 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, YAML_MEDIA, reqText);
208 // response reader strips newlines, so we should, too, before comparing
209 assertEquals(reqText.replace("\n", ""), response);
211 assertTrue(MyYamlProvider.hasReadSome());
212 assertTrue(MyYamlProvider.hasWrittenSome());
214 assertFalse(MyGsonProvider.hasReadSome());
215 assertFalse(MyGsonProvider.hasWrittenSome());
217 assertFalse(MyJacksonProvider.hasReadSome());
218 assertFalse(MyJacksonProvider.hasWrittenSome());
222 public void testDefaultClassServer() throws Exception {
223 logger.info("-- testDefaultClassServer() --");
225 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
226 .build("echo", LOCALHOST, port, "/", false, true);
227 server.addServletClass("/*", RestEchoService.class.getName());
228 server.addFilterClass("/*", TestFilter.class.getName());
229 server.waitedStart(5000);
231 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
233 RestEchoReqResp request = new RestEchoReqResp();
234 request.setRequestId(100);
235 request.setText(SOME_TEXT);
236 String reqText = gson.toJson(request);
238 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
239 assertEquals(reqText, response);
243 public void testJacksonClassServer() throws Exception {
244 logger.info("-- testJacksonClassServer() --");
246 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
247 .build("echo", LOCALHOST, port, "/", false, true);
248 server.setSerializationProvider(MyJacksonProvider.class.getName());
249 server.addServletClass("/*", RestEchoService.class.getName());
250 server.addFilterClass("/*", TestFilter.class.getName());
251 server.waitedStart(5000);
253 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
255 RestEchoReqResp request = new RestEchoReqResp();
256 request.setRequestId(100);
257 request.setText(SOME_TEXT);
258 String reqText = gson.toJson(request);
260 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
261 assertEquals(reqText, response);
263 assertTrue(MyJacksonProvider.hasReadSome());
264 assertTrue(MyJacksonProvider.hasWrittenSome());
266 assertFalse(MyGsonProvider.hasReadSome());
267 assertFalse(MyGsonProvider.hasWrittenSome());
269 assertFalse(MyYamlProvider.hasReadSome());
270 assertFalse(MyYamlProvider.hasWrittenSome());
274 public void testGsonClassServer() throws Exception {
275 logger.info("-- testGsonClassServer() --");
277 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
278 .build("echo", LOCALHOST, port, "/", false, true);
279 server.setSerializationProvider(MyGsonProvider.class.getName());
280 server.addServletClass("/*", RestEchoService.class.getName());
281 server.addFilterClass("/*", TestFilter.class.getName());
282 server.waitedStart(5000);
284 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
286 RestEchoReqResp request = new RestEchoReqResp();
287 request.setRequestId(100);
288 request.setText(SOME_TEXT);
289 String reqText = gson.toJson(request);
291 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, JSON_MEDIA, reqText);
292 assertEquals(reqText, response);
294 assertTrue(MyGsonProvider.hasReadSome());
295 assertTrue(MyGsonProvider.hasWrittenSome());
297 assertFalse(MyJacksonProvider.hasReadSome());
298 assertFalse(MyJacksonProvider.hasWrittenSome());
300 assertFalse(MyYamlProvider.hasReadSome());
301 assertFalse(MyYamlProvider.hasWrittenSome());
305 public void testYamlClassServer() throws Exception {
306 logger.info("-- testYamlClassServer() --");
308 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
309 .build("echo", LOCALHOST, port, "/", false, true);
310 server.setSerializationProvider(MyYamlProvider.class.getName());
311 server.addServletClass("/*", RestEchoService.class.getName());
312 server.addFilterClass("/*", TestFilter.class.getName());
313 server.waitedStart(5000);
315 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
317 RestEchoReqResp request = new RestEchoReqResp();
318 request.setRequestId(100);
319 request.setText(SOME_TEXT);
320 String reqText = new StandardYamlCoder().encode(request);
322 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, YAML_MEDIA, reqText);
324 // response reader strips newlines, so we should, too, before comparing
325 assertEquals(reqText.replace("\n", ""), response);
327 assertTrue(MyYamlProvider.hasReadSome());
328 assertTrue(MyYamlProvider.hasWrittenSome());
330 assertFalse(MyGsonProvider.hasReadSome());
331 assertFalse(MyGsonProvider.hasWrittenSome());
333 assertFalse(MyJacksonProvider.hasReadSome());
334 assertFalse(MyJacksonProvider.hasWrittenSome());
338 public void testSerialize() {
339 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
340 .build("echo", LOCALHOST, port, "/", false, true);
341 server.addServletPackage("/*", this.getClass().getPackage().getName());
342 server.addFilterClass("/*", TestFilter.class.getName());
344 // ensure we can serialize the server
345 new GsonTestUtils().compareGson(server, HttpServerTest.class);
349 public void testSingleServer() throws Exception {
350 logger.info("-- testSingleServer() --");
352 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
353 .build("echo", LOCALHOST, port, "/", false, true);
354 server.addServletPackage("/*", this.getClass().getPackage().getName());
355 server.addFilterClass("/*", TestFilter.class.getName());
356 server.waitedStart(5000);
358 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
359 assertFalse(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
361 String response = http(portUrl + JUNIT_ECHO_HELLO);
362 assertEquals(HELLO, response);
364 assertThatThrownBy(() -> http(portUrl + SWAGGER_JSON)).isInstanceOf(IOException.class);
366 response = http(portUrl + "/junit/echo/hello?block=true");
367 assertEquals("FILTERED", response);
369 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
370 assertEquals(1, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
372 server.setAafAuthentication("/*");
373 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
375 HttpServletServerFactoryInstance.getServerFactory().destroy(port);
376 assertEquals(0, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
380 public void testMultipleServers() throws Exception {
381 logger.info("-- testMultipleServers() --");
383 HttpServletServer server1 = HttpServletServerFactoryInstance.getServerFactory()
384 .build("echo-1", false,LOCALHOST, port, "/", true, true);
385 server1.addServletPackage("/*", this.getClass().getPackage().getName());
386 server1.waitedStart(5000);
388 int port2 = port + 1;
390 HttpServletServer server2 = HttpServletServerFactoryInstance.getServerFactory()
391 .build("echo-2", LOCALHOST, port2, "/", false, true);
392 server2.addServletPackage("/*", this.getClass().getPackage().getName());
393 server2.waitedStart(5000);
395 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
396 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port2).isAlive());
398 String response = http(portUrl + JUNIT_ECHO_HELLO);
399 assertTrue(HELLO.equals(response));
401 response = http(portUrl + SWAGGER_JSON);
402 assertTrue(response != null);
404 response = http(LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
405 assertTrue(HELLO.equals(response));
407 assertThatThrownBy(() -> http(LOCALHOST_PREFIX + port2 + SWAGGER_JSON)).isInstanceOf(IOException.class);
409 HttpServletServerFactoryInstance.getServerFactory().destroy();
410 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
414 public void testMultiServicePackage() throws Exception {
415 logger.info("-- testMultiServicePackage() --");
417 String randomName = UUID.randomUUID().toString();
419 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
420 .build(randomName, LOCALHOST, port, "/", false, true);
421 server.addServletPackage("/*", this.getClass().getPackage().getName());
422 server.waitedStart(5000);
424 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
426 String response = http(portUrl + JUNIT_ECHO_HELLO);
427 assertTrue(HELLO.equals(response));
429 response = http(portUrl + "/junit/endpoints/http/servers");
430 assertTrue(response.contains(randomName));
432 HttpServletServerFactoryInstance.getServerFactory().destroy();
433 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
437 public void testServiceClass() throws Exception {
438 logger.info("-- testServiceClass() --");
439 String randomName = UUID.randomUUID().toString();
441 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
442 .build(randomName, LOCALHOST, port, "/", false, true);
443 server.addServletClass("/*", RestEchoService.class.getName());
444 server.waitedStart(5000);
446 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
448 String response = http(portUrl + JUNIT_ECHO_HELLO);
449 assertTrue(HELLO.equals(response));
451 HttpServletServerFactoryInstance.getServerFactory().destroy();
452 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
456 public void testMultiServiceClass() throws Exception {
457 logger.info("-- testMultiServiceClass() --");
459 String randomName = UUID.randomUUID().toString();
461 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
462 .build(randomName, LOCALHOST, port, "/", false, true);
463 server.addServletClass("/*", RestEchoService.class.getName());
464 server.addServletClass("/*", RestEndpoints.class.getName());
465 server.waitedStart(5000);
467 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
469 String response = http(portUrl + JUNIT_ECHO_HELLO);
470 assertTrue(HELLO.equals(response));
472 response = http(portUrl + "/junit/endpoints/http/servers");
473 assertTrue(response.contains(randomName));
475 HttpServletServerFactoryInstance.getServerFactory().destroy();
476 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
480 * performs an http request.
482 * @throws MalformedURLException make sure URL is good
483 * @throws IOException thrown is IO exception occurs
484 * @throws InterruptedException thrown if thread interrupted occurs
486 private String http(String urlString)
487 throws IOException, InterruptedException {
488 URL url = new URL(urlString);
489 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 100)) {
490 throw new IllegalStateException("port never opened: " + url);
492 return response(url.openConnection());
496 * Performs an http request.
498 * @throws MalformedURLException make sure URL is good
499 * @throws IOException thrown is IO exception occurs
500 * @throws InterruptedException thrown if thread interrupted occurs
502 private String http(String urlString, String mediaType, String post)
503 throws IOException, InterruptedException {
504 URL url = new URL(urlString);
505 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 100)) {
506 throw new IllegalStateException("port never opened: " + url);
508 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
509 conn.setRequestMethod("POST");
510 conn.setDoOutput(true);
511 conn.setRequestProperty("Content-Type", mediaType);
512 conn.setRequestProperty("Accept", mediaType);
513 IOUtils.write(post, conn.getOutputStream());
514 return response(conn);
518 * gets http response.
520 * @param conn connection from which to read
522 * @throws IOException if an I/O error occurs
524 private String response(URLConnection conn) throws IOException {
525 try (InputStream inpstr = conn.getInputStream()) {
526 return String.join("", IOUtils.readLines(inpstr));