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.endpoints.http.server.HttpServletServerFactoryInstance;
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 SWAGGER_JSON = "/swagger.json";
54 private static final String JUNIT_ECHO_HELLO = "/junit/echo/hello";
55 private static final String JUNIT_ECHO_FULL_REQUEST = "/junit/echo/full/request";
56 private static final String SOME_TEXT = "some text";
57 private static final String HELLO = "hello";
62 private static Logger logger = LoggerFactory.getLogger(HttpServerTest.class);
64 private static final String LOCALHOST_PREFIX = "http://localhost:";
66 private static final Gson gson = new Gson();
69 * Server port. Incremented by 10 with each test.
71 private static int port = 5608;
73 private String portUrl;
76 * Increments the port number, clears the servers, and resets the providers.
81 portUrl = LOCALHOST_PREFIX + port;
83 HttpServletServerFactoryInstance.getServerFactory().destroy();
85 MyJacksonProvider.resetSome();
86 MyGsonProvider.resetSome();
89 private static void incrementPort() {
94 public static void tearDownAfterClass() {
95 HttpServletServerFactoryInstance.getServerFactory().destroy();
99 public void testDefaultPackageServer() throws Exception {
100 logger.info("-- testDefaultPackageServer() --");
102 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
103 .build("echo", LOCALHOST, port, "/", false, true);
104 server.addServletPackage("/*", this.getClass().getPackage().getName());
105 server.addFilterClass("/*", TestFilter.class.getName());
106 server.waitedStart(5000);
108 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
110 RestEchoReqResp request = new RestEchoReqResp();
111 request.setRequestId(100);
112 request.setText(SOME_TEXT);
113 String reqText = gson.toJson(request);
115 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
116 assertEquals(reqText, response);
120 public void testJacksonPackageServer() throws Exception {
121 logger.info("-- testJacksonPackageServer() --");
123 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
124 .build("echo", LOCALHOST, port, "/", false, true);
126 server.setSerializationProvider(MyJacksonProvider.class.getName());
127 server.addServletPackage("/*", this.getClass().getPackage().getName());
128 server.addFilterClass("/*", TestFilter.class.getName());
129 server.waitedStart(5000);
131 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
133 RestEchoReqResp request = new RestEchoReqResp();
134 request.setRequestId(100);
135 request.setText(SOME_TEXT);
136 String reqText = gson.toJson(request);
138 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
139 assertEquals(reqText, response);
141 assertTrue(MyJacksonProvider.hasReadSome());
142 assertTrue(MyJacksonProvider.hasWrittenSome());
144 assertFalse(MyGsonProvider.hasReadSome());
145 assertFalse(MyGsonProvider.hasWrittenSome());
149 public void testGsonPackageServer() throws Exception {
150 logger.info("-- testGsonPackageServer() --");
152 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
153 .build("echo", LOCALHOST, port, "/", false, true);
155 server.setSerializationProvider(MyGsonProvider.class.getName());
156 server.addServletPackage("/*", this.getClass().getPackage().getName());
157 server.addFilterClass("/*", TestFilter.class.getName());
158 server.waitedStart(5000);
160 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
162 RestEchoReqResp request = new RestEchoReqResp();
163 request.setRequestId(100);
164 request.setText(SOME_TEXT);
165 String reqText = gson.toJson(request);
167 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
168 assertEquals(reqText, response);
170 assertTrue(MyGsonProvider.hasReadSome());
171 assertTrue(MyGsonProvider.hasWrittenSome());
173 assertFalse(MyJacksonProvider.hasReadSome());
174 assertFalse(MyJacksonProvider.hasWrittenSome());
178 public void testDefaultClassServer() throws Exception {
179 logger.info("-- testDefaultClassServer() --");
181 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
182 .build("echo", LOCALHOST, port, "/", false, true);
183 server.addServletClass("/*", RestEchoService.class.getName());
184 server.addFilterClass("/*", TestFilter.class.getName());
185 server.waitedStart(5000);
187 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
189 RestEchoReqResp request = new RestEchoReqResp();
190 request.setRequestId(100);
191 request.setText(SOME_TEXT);
192 String reqText = gson.toJson(request);
194 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
195 assertEquals(reqText, response);
199 public void testJacksonClassServer() throws Exception {
200 logger.info("-- testJacksonClassServer() --");
202 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
203 .build("echo", LOCALHOST, port, "/", false, true);
204 server.setSerializationProvider(MyJacksonProvider.class.getName());
205 server.addServletClass("/*", RestEchoService.class.getName());
206 server.addFilterClass("/*", TestFilter.class.getName());
207 server.waitedStart(5000);
209 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
211 RestEchoReqResp request = new RestEchoReqResp();
212 request.setRequestId(100);
213 request.setText(SOME_TEXT);
214 String reqText = gson.toJson(request);
216 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
217 assertEquals(reqText, response);
219 assertTrue(MyJacksonProvider.hasReadSome());
220 assertTrue(MyJacksonProvider.hasWrittenSome());
222 assertFalse(MyGsonProvider.hasReadSome());
223 assertFalse(MyGsonProvider.hasWrittenSome());
227 public void testGsonClassServer() throws Exception {
228 logger.info("-- testGsonClassServer() --");
230 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
231 .build("echo", LOCALHOST, port, "/", false, true);
232 server.setSerializationProvider(MyGsonProvider.class.getName());
233 server.addServletClass("/*", RestEchoService.class.getName());
234 server.addFilterClass("/*", TestFilter.class.getName());
235 server.waitedStart(5000);
237 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
239 RestEchoReqResp request = new RestEchoReqResp();
240 request.setRequestId(100);
241 request.setText(SOME_TEXT);
242 String reqText = gson.toJson(request);
244 String response = http(portUrl + JUNIT_ECHO_FULL_REQUEST, reqText);
245 assertEquals(reqText, response);
247 assertTrue(MyGsonProvider.hasReadSome());
248 assertTrue(MyGsonProvider.hasWrittenSome());
250 assertFalse(MyJacksonProvider.hasReadSome());
251 assertFalse(MyJacksonProvider.hasWrittenSome());
255 public void testSerialize() {
256 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
257 .build("echo", LOCALHOST, port, "/", false, true);
258 server.addServletPackage("/*", this.getClass().getPackage().getName());
259 server.addFilterClass("/*", TestFilter.class.getName());
261 // ensure we can serialize the server
262 new GsonTestUtils().compareGson(server, HttpServerTest.class);
266 public void testSingleServer() throws Exception {
267 logger.info("-- testSingleServer() --");
269 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
270 .build("echo", LOCALHOST, port, "/", false, true);
271 server.addServletPackage("/*", this.getClass().getPackage().getName());
272 server.addFilterClass("/*", TestFilter.class.getName());
273 server.waitedStart(5000);
275 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
276 assertFalse(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
278 String response = http(portUrl + JUNIT_ECHO_HELLO);
279 assertEquals(HELLO, response);
281 assertThatThrownBy(() -> http(portUrl + SWAGGER_JSON)).isInstanceOf(IOException.class);
283 response = http(portUrl + "/junit/echo/hello?block=true");
284 assertEquals("FILTERED", response);
286 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
287 assertEquals(1, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
289 server.setAafAuthentication("/*");
290 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAaf());
292 HttpServletServerFactoryInstance.getServerFactory().destroy(port);
293 assertEquals(0, HttpServletServerFactoryInstance.getServerFactory().inventory().size());
297 public void testMultipleServers() throws Exception {
298 logger.info("-- testMultipleServers() --");
300 HttpServletServer server1 = HttpServletServerFactoryInstance.getServerFactory()
301 .build("echo-1", false,LOCALHOST, port, "/", true, true);
302 server1.addServletPackage("/*", this.getClass().getPackage().getName());
303 server1.waitedStart(5000);
305 int port2 = port + 1;
307 HttpServletServer server2 = HttpServletServerFactoryInstance.getServerFactory()
308 .build("echo-2", LOCALHOST, port2, "/", false, true);
309 server2.addServletPackage("/*", this.getClass().getPackage().getName());
310 server2.waitedStart(5000);
312 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
313 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port2).isAlive());
315 String response = http(portUrl + JUNIT_ECHO_HELLO);
316 assertTrue(HELLO.equals(response));
318 response = http(portUrl + SWAGGER_JSON);
319 assertTrue(response != null);
321 response = http(LOCALHOST_PREFIX + port2 + JUNIT_ECHO_HELLO);
322 assertTrue(HELLO.equals(response));
324 assertThatThrownBy(() -> http(LOCALHOST_PREFIX + port2 + SWAGGER_JSON)).isInstanceOf(IOException.class);
326 HttpServletServerFactoryInstance.getServerFactory().destroy();
327 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
331 public void testMultiServicePackage() throws Exception {
332 logger.info("-- testMultiServicePackage() --");
334 String randomName = UUID.randomUUID().toString();
336 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
337 .build(randomName, LOCALHOST, port, "/", false, true);
338 server.addServletPackage("/*", this.getClass().getPackage().getName());
339 server.waitedStart(5000);
341 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
343 String response = http(portUrl + JUNIT_ECHO_HELLO);
344 assertTrue(HELLO.equals(response));
346 response = http(portUrl + "/junit/endpoints/http/servers");
347 assertTrue(response.contains(randomName));
349 HttpServletServerFactoryInstance.getServerFactory().destroy();
350 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
354 public void testServiceClass() throws Exception {
355 logger.info("-- testServiceClass() --");
356 String randomName = UUID.randomUUID().toString();
358 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
359 .build(randomName, LOCALHOST, port, "/", false, true);
360 server.addServletClass("/*", RestEchoService.class.getName());
361 server.waitedStart(5000);
363 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
365 String response = http(portUrl + JUNIT_ECHO_HELLO);
366 assertTrue(HELLO.equals(response));
368 HttpServletServerFactoryInstance.getServerFactory().destroy();
369 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
373 public void testMultiServiceClass() throws Exception {
374 logger.info("-- testMultiServiceClass() --");
376 String randomName = UUID.randomUUID().toString();
378 HttpServletServer server = HttpServletServerFactoryInstance.getServerFactory()
379 .build(randomName, LOCALHOST, port, "/", false, true);
380 server.addServletClass("/*", RestEchoService.class.getName());
381 server.addServletClass("/*", RestEndpoints.class.getName());
382 server.waitedStart(5000);
384 assertTrue(HttpServletServerFactoryInstance.getServerFactory().get(port).isAlive());
386 String response = http(portUrl + JUNIT_ECHO_HELLO);
387 assertTrue(HELLO.equals(response));
389 response = http(portUrl + "/junit/endpoints/http/servers");
390 assertTrue(response.contains(randomName));
392 HttpServletServerFactoryInstance.getServerFactory().destroy();
393 assertTrue(HttpServletServerFactoryInstance.getServerFactory().inventory().isEmpty());
397 * performs an http request.
399 * @throws MalformedURLException make sure URL is good
400 * @throws IOException thrown is IO exception occurs
401 * @throws InterruptedException thrown if thread interrupted occurs
403 private String http(String urlString)
404 throws IOException, InterruptedException {
405 URL url = new URL(urlString);
406 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
407 throw new IllegalStateException("port never opened: " + url);
409 return response(url.openConnection());
413 * Performs an http request.
415 * @throws MalformedURLException make sure URL is good
416 * @throws IOException thrown is IO exception occurs
417 * @throws InterruptedException thrown if thread interrupted occurs
419 private String http(String urlString, String post)
420 throws IOException, InterruptedException {
421 URL url = new URL(urlString);
422 if (!NetworkUtil.isTcpPortOpen(url.getHost(), url.getPort(), 25, 2)) {
423 throw new IllegalStateException("port never opened: " + url);
425 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
426 conn.setRequestMethod("POST");
427 conn.setDoOutput(true);
428 conn.setRequestProperty("Content-Type", "application/json");
429 IOUtils.write(post, conn.getOutputStream());
430 return response(conn);
434 * gets http response.
436 * @param conn connection from which to read
438 * @throws IOException if an I/O error occurs
440 private String response(URLConnection conn) throws IOException {
441 StringBuilder response = new StringBuilder();
442 try (BufferedReader ioReader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
444 while ((line = ioReader.readLine()) != null) {
445 response.append(line);
448 return response.toString();