f15d68e918b4a9bccf64cc669593d7517aecbcd4
[policy/common.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
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
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
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=========================================================
20  */
21
22 package org.onap.policy.common.endpoints.http.server.test;
23
24 import static org.junit.Assert.assertEquals;
25
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;
45
46 public class HttpClientTest {
47     private static final HashMap<String, String> savedValuesMap = new HashMap<>();
48
49     /**
50      * Setup before class method.
51      *
52      * @throws InterruptedException can be interrupted
53      * @throws IOException can have an IO exception
54      */
55     @BeforeClass
56     public static void setUp() throws InterruptedException, IOException {
57         /* echo server - http + no auth */
58
59         final HttpServletServer echoServerNoAuth =
60                 HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
61         echoServerNoAuth.addServletPackage("/*", HttpClientTest.class.getPackage().getName());
62         echoServerNoAuth.waitedStart(5000);
63
64         if (!NetworkUtil.isTcpPortOpen("localhost", echoServerNoAuth.getPort(), 5, 10000L)) {
65             throw new IllegalStateException("cannot connect to port " + echoServerNoAuth.getPort());
66         }
67
68         String keyStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
69         if (keyStoreSystemProperty != null) {
70             savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, keyStoreSystemProperty);
71         }
72
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);
78         }
79
80         String trustStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
81         if (trustStoreSystemProperty != null) {
82             savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, trustStoreSystemProperty);
83         }
84
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);
90         }
91
92         System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
93         System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, "kstest");
94
95         System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
96         System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, "kstest");
97
98         /* echo server - https + basic auth */
99
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);
109
110         if (!NetworkUtil.isTcpPortOpen("localhost", echoServerAuth.getPort(), 5, 10000L)) {
111             throw new IllegalStateException("cannot connect to port " + echoServerAuth.getPort());
112         }
113     }
114
115     /**
116      * After the class is created method.
117      */
118     @AfterClass
119     public static void tearDown() {
120         HttpServletServer.factory.destroy();
121         HttpClient.factory.destroy();
122
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);
127         } else {
128             System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
129         }
130
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);
135         } else {
136             System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
137         }
138
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);
143         } else {
144             System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
145         }
146
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);
151         } else {
152             System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
153         }
154
155
156     }
157
158     @Test
159     public void testHttpGetNoAuthClient() throws Exception {
160         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
161             6666);
162         final Response response = client.get("hello");
163         final String body = HttpClient.getBody(response, String.class);
164
165         assertEquals(200, response.getStatus());
166         assertEquals("hello", body);
167     }
168
169     @Test
170     public void testHttpPutNoAuthClient() throws Exception {
171         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false, 6666);
172
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);
176
177         assertEquals(200, response.getStatus());
178         assertEquals("PUT:hello:{myParameter=myValue}", body);
179     }
180
181     @Test
182     public void testHttpPostNoAuthClient() throws Exception {
183         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
184             6666);
185
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);
189
190         assertEquals(200, response.getStatus());
191         assertEquals("POST:hello:{myParameter=myValue}", body);
192     }
193
194     @Test
195     public void testHttpDeletetNoAuthClient() throws Exception {
196         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
197             6666);
198
199         final Response response = client.delete("hello", Collections.emptyMap());
200         final String body = HttpClient.getBody(response, String.class);
201
202         assertEquals(200, response.getStatus());
203         assertEquals("DELETE:hello", body);
204     }
205
206     @Test
207     public void testHttpGetAuthClient() throws Exception {
208         final HttpClient client = getAuthHttpClient();
209
210         final Response response = client.get("hello");
211         final String body = HttpClient.getBody(response, String.class);
212
213         assertEquals(200, response.getStatus());
214         assertEquals("hello", body);
215     }
216
217     @Test
218     public void testHttpPutAuthClient() throws Exception {
219         final HttpClient client = getAuthHttpClient();
220
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);
224
225         assertEquals(200, response.getStatus());
226         assertEquals("PUT:hello:{myParameter=myValue}", body);
227     }
228
229     @Test
230     public void testHttpAuthClient401() throws Exception {
231         final HttpClient client = getNoAuthHttpClient("testHttpAuthClient401", true,
232             6667);
233         final Response response = client.get("hello");
234         assertEquals(401, response.getStatus());
235     }
236
237     @Test
238     public void testHttpAuthClientProps() throws Exception {
239         final Properties httpProperties = new Properties();
240
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");
260
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");
275
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");
291
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");
306
307         final List<HttpServletServer> servers = HttpServletServer.factory.build(httpProperties);
308         assertEquals(2, servers.size());
309
310         final List<HttpClient> clients = HttpClient.factory.build(httpProperties);
311         assertEquals(2, clients.size());
312
313         for (final HttpServletServer server : servers) {
314             server.waitedStart(10000);
315         }
316
317         final HttpClient clientPap = HttpClient.factory.get("PAP");
318         final Response response = clientPap.get();
319         assertEquals(200, response.getStatus());
320
321         final HttpClient clientPdp = HttpClient.factory.get("PDP");
322         final Response response2 = clientPdp.get("test");
323         assertEquals(500, response2.getStatus());
324     }
325
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());
330     }
331
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());
337     }
338
339
340     class MyEntity {
341
342         private String myParameter;
343
344         public MyEntity(final String myParameter) {
345             this.myParameter = myParameter;
346         }
347
348         public void setMyParameter(final String myParameter) {
349             this.myParameter = myParameter;
350         }
351
352         public String getMyParameter() {
353             return myParameter;
354         }
355
356     }
357
358 }