2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
6 * Modifications Copyright (C) 2018 Samsung Electronics Co., Ltd.
7 * ================================================================================
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.common.endpoints.http.server.test;
24 import static org.junit.Assert.assertEquals;
26 import java.io.IOException;
27 import java.security.KeyManagementException;
28 import java.security.NoSuchAlgorithmException;
29 import java.util.Collections;
30 import java.util.HashMap;
31 import java.util.List;
32 import java.util.Properties;
33 import javax.ws.rs.client.Entity;
34 import javax.ws.rs.core.MediaType;
35 import javax.ws.rs.core.Response;
36 import org.junit.AfterClass;
37 import org.junit.BeforeClass;
38 import org.junit.Test;
39 import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
40 import org.onap.policy.common.endpoints.http.client.HttpClient;
41 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
42 import org.onap.policy.common.endpoints.http.server.internal.JettyJerseyServer;
43 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
44 import org.onap.policy.common.utils.network.NetworkUtil;
46 public class HttpClientTest {
47 private static final HashMap<String, String> savedValuesMap = new HashMap<>();
50 * Setup before class method.
52 * @throws InterruptedException can be interrupted
53 * @throws IOException can have an IO exception
56 public static void setUp() throws InterruptedException, IOException {
57 /* echo server - http + no auth */
59 final HttpServletServer echoServerNoAuth =
60 HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
61 echoServerNoAuth.addServletPackage("/*", HttpClientTest.class.getPackage().getName());
62 echoServerNoAuth.waitedStart(5000);
64 if (!NetworkUtil.isTcpPortOpen("localhost", echoServerNoAuth.getPort(), 5, 10000L)) {
65 throw new IllegalStateException("cannot connect to port " + echoServerNoAuth.getPort());
68 String keyStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
69 if (keyStoreSystemProperty != null) {
70 savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, keyStoreSystemProperty);
73 String keyStorePasswordSystemProperty =
74 System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
75 if (keyStorePasswordSystemProperty != null) {
76 savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME,
77 keyStorePasswordSystemProperty);
80 String trustStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
81 if (trustStoreSystemProperty != null) {
82 savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, trustStoreSystemProperty);
85 String trustStorePasswordSystemProperty =
86 System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
87 if (trustStorePasswordSystemProperty != null) {
88 savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME,
89 trustStorePasswordSystemProperty);
92 System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
93 System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, "kstest");
95 System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
96 System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, "kstest");
98 /* echo server - https + basic auth */
100 final HttpServletServer echoServerAuth =
101 HttpServletServer.factory.build("echo", true, "localhost", 6667, "/", false, true);
102 echoServerAuth.setBasicAuthentication("x", "y", null);
103 echoServerAuth.addServletPackage("/*", HttpClientTest.class.getPackage().getName());
104 echoServerAuth.addFilterClass("/*", TestFilter.class.getCanonicalName());
105 echoServerAuth.addFilterClass("/*", TestAuthorizationFilter.class.getCanonicalName());
106 echoServerAuth.addFilterClass("/*", TestAafAuthFilter.class.getCanonicalName());
107 echoServerAuth.addFilterClass("/*", TestAafGranularAuthFilter.class.getCanonicalName());
108 echoServerAuth.waitedStart(5000);
110 if (!NetworkUtil.isTcpPortOpen("localhost", echoServerAuth.getPort(), 5, 10000L)) {
111 throw new IllegalStateException("cannot connect to port " + echoServerAuth.getPort());
116 * After the class is created method.
119 public static void tearDown() {
120 HttpServletServer.factory.destroy();
121 HttpClient.factory.destroy();
123 if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME)) {
124 System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME,
125 savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME));
126 savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
128 System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
131 if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME)) {
132 System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME,
133 savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME));
134 savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
136 System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
139 if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME)) {
140 System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME,
141 savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME));
142 savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
144 System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
147 if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME)) {
148 System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME,
149 savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME));
150 savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
152 System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
159 public void testHttpGetNoAuthClient() throws Exception {
160 final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
162 final Response response = client.get("hello");
163 final String body = HttpClient.getBody(response, String.class);
165 assertEquals(200, response.getStatus());
166 assertEquals("hello", body);
170 public void testHttpPutNoAuthClient() throws Exception {
171 final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false, 6666);
173 Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
174 final Response response = client.put("hello", entity, Collections.emptyMap());
175 final String body = HttpClient.getBody(response, String.class);
177 assertEquals(200, response.getStatus());
178 assertEquals("PUT:hello:{myParameter=myValue}", body);
182 public void testHttpPostNoAuthClient() throws Exception {
183 final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
186 Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
187 final Response response = client.post("hello", entity, Collections.emptyMap());
188 final String body = HttpClient.getBody(response, String.class);
190 assertEquals(200, response.getStatus());
191 assertEquals("POST:hello:{myParameter=myValue}", body);
195 public void testHttpDeletetNoAuthClient() throws Exception {
196 final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
199 final Response response = client.delete("hello", Collections.emptyMap());
200 final String body = HttpClient.getBody(response, String.class);
202 assertEquals(200, response.getStatus());
203 assertEquals("DELETE:hello", body);
207 public void testHttpGetAuthClient() throws Exception {
208 final HttpClient client = getAuthHttpClient();
210 final Response response = client.get("hello");
211 final String body = HttpClient.getBody(response, String.class);
213 assertEquals(200, response.getStatus());
214 assertEquals("hello", body);
218 public void testHttpPutAuthClient() throws Exception {
219 final HttpClient client = getAuthHttpClient();
221 Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
222 final Response response = client.put("hello", entity, Collections.emptyMap());
223 final String body = HttpClient.getBody(response, String.class);
225 assertEquals(200, response.getStatus());
226 assertEquals("PUT:hello:{myParameter=myValue}", body);
230 public void testHttpAuthClient401() throws Exception {
231 final HttpClient client = getNoAuthHttpClient("testHttpAuthClient401", true,
233 final Response response = client.get("hello");
234 assertEquals(401, response.getStatus());
238 public void testHttpAuthClientProps() throws Exception {
239 final Properties httpProperties = new Properties();
241 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES, "PAP,PDP");
242 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
243 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
244 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
245 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7777");
246 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
247 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpap");
248 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
249 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
250 httpProperties.setProperty(
251 PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
252 + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX,
253 RestMockHealthCheck.class.getName());
254 httpProperties.setProperty(
255 PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
256 + PolicyEndPointProperties.PROPERTY_HTTP_FILTER_CLASSES_SUFFIX,
257 TestFilter.class.getName());
258 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
259 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
261 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
262 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
263 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
264 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7778");
265 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
266 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpdp");
267 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
268 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
269 httpProperties.setProperty(
270 PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
271 + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX,
272 RestMockHealthCheck.class.getName());
273 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
274 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
276 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES, "PAP,PDP");
277 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
278 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
279 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
280 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7777");
281 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
282 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "pap/test");
283 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
284 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
285 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
286 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpap");
287 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
288 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
289 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
290 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
292 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
293 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
294 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
295 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7778");
296 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
297 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "pdp");
298 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
299 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
300 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
301 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpdp");
302 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
303 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
304 httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
305 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
307 final List<HttpServletServer> servers = HttpServletServer.factory.build(httpProperties);
308 assertEquals(2, servers.size());
310 final List<HttpClient> clients = HttpClient.factory.build(httpProperties);
311 assertEquals(2, clients.size());
313 for (final HttpServletServer server : servers) {
314 server.waitedStart(10000);
317 final HttpClient clientPap = HttpClient.factory.get("PAP");
318 final Response response = clientPap.get();
319 assertEquals(200, response.getStatus());
321 final HttpClient clientPdp = HttpClient.factory.get("PDP");
322 final Response response2 = clientPdp.get("test");
323 assertEquals(500, response2.getStatus());
326 private HttpClient getAuthHttpClient() throws KeyManagementException, NoSuchAlgorithmException {
327 return HttpClient.factory.build(BusTopicParams.builder().clientName("testHttpAuthClient")
328 .useHttps(true).allowSelfSignedCerts(true).hostname("localhost").port(6667).basePath("junit/echo")
329 .userName("x").password("y").managed(true).build());
332 private HttpClient getNoAuthHttpClient(String clientName, boolean https, int port)
333 throws KeyManagementException, NoSuchAlgorithmException {
334 return HttpClient.factory.build(BusTopicParams.builder().clientName(clientName)
335 .useHttps(https).allowSelfSignedCerts(https).hostname("localhost").port(port).basePath("junit/echo")
336 .userName(null).password(null).managed(true).build());
342 private String myParameter;
344 public MyEntity(final String myParameter) {
345 this.myParameter = myParameter;
348 public void setMyParameter(final String myParameter) {
349 this.myParameter = myParameter;
352 public String getMyParameter() {