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.BufferedReader;
30 import java.io.IOException;
31 import java.io.InputStreamReader;
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.onap.policy.common.utils.gson.GsonTestUtils;
43 import org.onap.policy.common.utils.network.NetworkUtil;
44 import org.slf4j.Logger;
45 import org.slf4j.LoggerFactory;
48 * HttpServletServer JUNIT tests.
50 public class HttpServerTest {
51 private static final String LOCALHOST = "localhost";
52 private static final String SWAGGER_JSON = "/swagger.json";
53 private static final String JUNIT_ECHO_HELLO = "/junit/echo/hello";
54 private static final String JUNIT_ECHO_FULL_REQUEST = "/junit/echo/full/request";
55 private static final String SOME_TEXT = "some text";
56 private static final String HELLO = "hello";
61 private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
63 private static final String LOCALHOST_PREFIX = "http://localhost:";
65 private static final Gson gson = new Gson();
68 * Server port. Incremented by 10 with each test.
70 private static int port = 5608;
72 private String portUrl;
75 * Increments the port number, clears the servers, and resets the providers.
80 portUrl = LOCALHOST_PREFIX + port;
82 HttpServletServer.factory.destroy();
84 MyJacksonProvider.resetSome();
85 MyGsonProvider.resetSome();
88 private static void incrementPort() {
93 public static void tearDownAfterClass() {
94 HttpServletServer.factory.destroy();
98 public void testDefaultPackageServer() throws Exception {
99 logger.info("-- testDefaultPackageServer() --");
101 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
102 server.addServletPackage("/*", this.getClass().getPackage().getName());
103 server.addFilterClass("/*", TestFilter.class.getName());
104 server.waitedStart(5000);
106 assertTrue(HttpServletServer.factory.get(port).isAlive());
108 RestEchoReqResp request = new RestEchoReqResp();
109 request.setRequestId(100);
110 request.setText(SOME_TEXT);
111 String reqText = gson.toJson(request);
113 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
114 assertEquals(reqText, response);
118 public void testJacksonPackageServer() throws Exception {
119 logger.info("-- testJacksonPackageServer() --");
121 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
123 server.setSerializationProvider(MyJacksonProvider.class.getName());
124 server.addServletPackage("/*", this.getClass().getPackage().getName());
125 server.addFilterClass("/*", TestFilter.class.getName());
126 server.waitedStart(5000);
128 assertTrue(HttpServletServer.factory.get(port).isAlive());
130 RestEchoReqResp request = new RestEchoReqResp();
131 request.setRequestId(100);
132 request.setText(SOME_TEXT);
133 String reqText = gson.toJson(request);
135 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
136 assertEquals(reqText, response);
138 assertTrue(MyJacksonProvider.hasReadSome());
139 assertTrue(MyJacksonProvider.hasWrittenSome());
141 assertFalse(MyGsonProvider.hasReadSome());
142 assertFalse(MyGsonProvider.hasWrittenSome());
146 public void testGsonPackageServer() throws Exception {
147 logger.info("-- testGsonPackageServer() --");
149 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
151 server.setSerializationProvider(MyGsonProvider.class.getName());
152 server.addServletPackage("/*", this.getClass().getPackage().getName());
153 server.addFilterClass("/*", TestFilter.class.getName());
154 server.waitedStart(5000);
156 assertTrue(HttpServletServer.factory.get(port).isAlive());
158 RestEchoReqResp request = new RestEchoReqResp();
159 request.setRequestId(100);
160 request.setText(SOME_TEXT);
161 String reqText = gson.toJson(request);
163 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
164 assertEquals(reqText, response);
166 assertTrue(MyGsonProvider.hasReadSome());
167 assertTrue(MyGsonProvider.hasWrittenSome());
169 assertFalse(MyJacksonProvider.hasReadSome());
170 assertFalse(MyJacksonProvider.hasWrittenSome());
174 public void testDefaultClassServer() throws Exception {
175 logger.info("-- testDefaultClassServer() --");
177 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
178 server.addServletClass("/*", RestEchoService.class.getName());
179 server.addFilterClass("/*", TestFilter.class.getName());
180 server.waitedStart(5000);
182 assertTrue(HttpServletServer.factory.get(port).isAlive());
184 RestEchoReqResp request = new RestEchoReqResp();
185 request.setRequestId(100);
186 request.setText(SOME_TEXT);
187 String reqText = gson.toJson(request);
189 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
190 assertEquals(reqText, response);
194 public void testJacksonClassServer() throws Exception {
195 logger.info("-- testJacksonClassServer() --");
197 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
198 server.setSerializationProvider(MyJacksonProvider.class.getName());
199 server.addServletClass("/*", RestEchoService.class.getName());
200 server.addFilterClass("/*", TestFilter.class.getName());
201 server.waitedStart(5000);
203 assertTrue(HttpServletServer.factory.get(port).isAlive());
205 RestEchoReqResp request = new RestEchoReqResp();
206 request.setRequestId(100);
207 request.setText(SOME_TEXT);
208 String reqText = gson.toJson(request);
210 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
211 assertEquals(reqText, response);
213 assertTrue(MyJacksonProvider.hasReadSome());
214 assertTrue(MyJacksonProvider.hasWrittenSome());
216 assertFalse(MyGsonProvider.hasReadSome());
217 assertFalse(MyGsonProvider.hasWrittenSome());
221 public void testGsonClassServer() throws Exception {
222 logger.info("-- testGsonClassServer() --");
224 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
225 server.setSerializationProvider(MyGsonProvider.class.getName());
226 server.addServletClass("/*", RestEchoService.class.getName());
227 server.addFilterClass("/*", TestFilter.class.getName());
228 server.waitedStart(5000);
230 assertTrue(HttpServletServer.factory.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, reqText);
238 assertEquals(reqText, response);
240 assertTrue(MyGsonProvider.hasReadSome());
241 assertTrue(MyGsonProvider.hasWrittenSome());
243 assertFalse(MyJacksonProvider.hasReadSome());
244 assertFalse(MyJacksonProvider.hasWrittenSome());
248 public void testSerialize() {
249 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
250 server.addServletPackage("/*", this.getClass().getPackage().getName());
251 server.addFilterClass("/*", TestFilter.class.getName());
253 // ensure we can serialize the server
254 new GsonTestUtils().compareGson(server, HttpServerTest.class);
258 public void testSingleServer() throws Exception {
259 logger.info("-- testSingleServer() --");
261 HttpServletServer server = HttpServletServer.factory.build("echo", LOCALHOST, port, "/", false, true);
262 server.addServletPackage("/*", this.getClass().getPackage().getName());
263 server.addFilterClass("/*", TestFilter.class.getName());
264 server.waitedStart(5000);
266 assertTrue(HttpServletServer.factory.get(port).isAlive());
267 assertFalse(HttpServletServer.factory.get(port).isAaf());
269 String response = http(portUrl + JUNIT_ECHO_HELLO);
270 assertEquals(HELLO, response);
272 assertThatThrownBy(() -> http(portUrl + SWAGGER_JSON)).isInstanceOf(IOException.class);
274 response = http(portUrl + "/junit/echo/hello?block=true");
275 assertEquals("FILTERED", response);
277 assertTrue(HttpServletServer.factory.get(port).isAlive());
278 assertEquals(1, HttpServletServer.factory.inventory().size());
280 server.setAafAuthentication("/*");
281 assertTrue(HttpServletServer.factory.get(port).isAaf());
283 HttpServletServer.factory.destroy(port);
284 assertEquals(0, HttpServletServer.factory.inventory().size());
288 public void testMultipleServers() throws Exception {
289 logger.info("-- testMultipleServers() --");
291 HttpServletServer server1 = HttpServletServer.factory.build("echo-1", false,LOCALHOST, port, "/", true, true);
292 server1.addServletPackage("/*", this.getClass().getPackage().getName());
293 server1.waitedStart(5000);
295 int port2 = port + 1;
297 HttpServletServer server2 = HttpServletServer.factory.build("echo-2", LOCALHOST, port2, "/", false, true);
298 server2.addServletPackage("/*", this.getClass().getPackage().getName());
299 server2.waitedStart(5000);
301 assertTrue(HttpServletServer.factory.get(port).isAlive());
302 assertTrue(HttpServletServer.factory.get(port2).isAlive());
304 String response = http(portUrl + JUNIT_ECHO_HELLO);
305 assertTrue(HELLO.equals(response));
307 response = http(portUrl + SWAGGER_JSON);
308 assertTrue(response != null);
310 response = http(LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
311 assertTrue(HELLO.equals(response));
313 assertThatThrownBy(() -> http(LOCALHOST_PREFIX + port2 + SWAGGER_JSON)).isInstanceOf(IOException.class);
315 HttpServletServer.factory.destroy();
316 assertTrue(HttpServletServer.factory.inventory().isEmpty());
320 public void testMultiServicePackage() throws Exception {
321 logger.info("-- testMultiServicePackage() --");
323 String randomName = UUID.randomUUID().toString();
325 HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
326 server.addServletPackage("/*", this.getClass().getPackage().getName());
327 server.waitedStart(5000);
329 assertTrue(HttpServletServer.factory.get(port).isAlive());
331 String response = http(portUrl + JUNIT_ECHO_HELLO);
332 assertTrue(HELLO.equals(response));
334 response = http(portUrl + "/junit/endpoints/http/servers");
335 assertTrue(response.contains(randomName));
337 HttpServletServer.factory.destroy();
338 assertTrue(HttpServletServer.factory.inventory().isEmpty());
342 public void testServiceClass() throws Exception {
343 logger.info("-- testServiceClass() --");
344 String randomName = UUID.randomUUID().toString();
346 HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
347 server.addServletClass("/*", RestEchoService.class.getName());
348 server.waitedStart(5000);
350 assertTrue(HttpServletServer.factory.get(port).isAlive());
352 String response = http(portUrl + JUNIT_ECHO_HELLO);
353 assertTrue(HELLO.equals(response));
355 HttpServletServer.factory.destroy();
356 assertTrue(HttpServletServer.factory.inventory().isEmpty());
360 public void testMultiServiceClass() throws Exception {
361 logger.info("-- testMultiServiceClass() --");
363 String randomName = UUID.randomUUID().toString();
365 HttpServletServer server = HttpServletServer.factory.build(randomName, LOCALHOST, port, "/", false, true);
366 server.addServletClass("/*", RestEchoService.class.getName());
367 server.addServletClass("/*", RestEndpoints.class.getName());
368 server.waitedStart(5000);
370 assertTrue(HttpServletServer.factory.get(port).isAlive());
372 String response = http(portUrl + JUNIT_ECHO_HELLO);
373 assertTrue(HELLO.equals(response));
375 response = http(portUrl + "/junit/endpoints/http/servers");
376 assertTrue(response.contains(randomName));
378 HttpServletServer.factory.destroy();
379 assertTrue(HttpServletServer.factory.inventory().isEmpty());
383 * performs an http request.
385 * @throws MalformedURLException make sure URL is good
386 * @throws IOException thrown is IO exception occurs
387 * @throws InterruptedException thrown if thread interrupted occurs
389 private String http(String urlString)
390 throws IOException, InterruptedException {
391 URL url = new URL(urlString);
392 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
393 throw new IllegalStateException("port never opened: " + url);
395 return response(url.openConnection());
399 * Performs an http request.
401 * @throws MalformedURLException make sure URL is good
402 * @throws IOException thrown is IO exception occurs
403 * @throws InterruptedException thrown if thread interrupted occurs
405 private String http(String urlString, String post)
406 throws IOException, InterruptedException {
407 URL url = new URL(urlString);
408 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
409 throw new IllegalStateException("port never opened: " + url);
411 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
412 conn.setRequestMethod("POST");
413 conn.setDoOutput(true);
414 conn.setRequestProperty("Content-Type", "application/json");
415 IOUtils.write(post, conn.getOutputStream());
416 return response(conn);
420 * gets http response.
422 * @param conn connection from which to read
424 * @throws IOException if an I/O error occurs
426 private String response(URLConnection conn) throws IOException {
427 StringBuilder response = new StringBuilder();
428 try (BufferedReader ioReader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
430 while ((line = ioReader.readLine()) != null) {
431 response.append(line);
434 return response.toString();