1f1f117e45140d66a9c84977c7a1219ebc8ee837
[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 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertTrue;
27
28 import java.io.IOException;
29 import java.security.KeyManagementException;
30 import java.security.NoSuchAlgorithmException;
31 import java.util.Collections;
32 import java.util.HashMap;
33 import java.util.List;
34 import java.util.Properties;
35 import javax.ws.rs.client.Entity;
36 import javax.ws.rs.core.MediaType;
37 import javax.ws.rs.core.Response;
38 import org.junit.AfterClass;
39 import org.junit.Before;
40 import org.junit.BeforeClass;
41 import org.junit.Test;
42 import org.onap.policy.common.endpoints.event.comm.bus.internal.BusTopicParams;
43 import org.onap.policy.common.endpoints.http.client.HttpClient;
44 import org.onap.policy.common.endpoints.http.server.HttpServletServer;
45 import org.onap.policy.common.endpoints.http.server.internal.JettyJerseyServer;
46 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
47 import org.onap.policy.common.utils.network.NetworkUtil;
48
49 public class HttpClientTest {
50     private static final HashMap<String, String> savedValuesMap = new HashMap<>();
51
52     /**
53      * Setup before class method.
54      *
55      * @throws InterruptedException can be interrupted
56      * @throws IOException can have an IO exception
57      */
58     @BeforeClass
59     public static void setUpBeforeClass() throws InterruptedException, IOException {
60         /* echo server - http + no auth */
61
62         final HttpServletServer echoServerNoAuth =
63                 HttpServletServer.factory.build("echo", "localhost", 6666, "/", false, true);
64         echoServerNoAuth.addServletPackage("/*", HttpClientTest.class.getPackage().getName());
65         echoServerNoAuth.waitedStart(5000);
66
67         if (!NetworkUtil.isTcpPortOpen("localhost", echoServerNoAuth.getPort(), 5, 10000L)) {
68             throw new IllegalStateException("cannot connect to port " + echoServerNoAuth.getPort());
69         }
70
71         String keyStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
72         if (keyStoreSystemProperty != null) {
73             savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, keyStoreSystemProperty);
74         }
75
76         String keyStorePasswordSystemProperty =
77                 System.getProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
78         if (keyStorePasswordSystemProperty != null) {
79             savedValuesMap.put(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME,
80                     keyStorePasswordSystemProperty);
81         }
82
83         String trustStoreSystemProperty = System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
84         if (trustStoreSystemProperty != null) {
85             savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, trustStoreSystemProperty);
86         }
87
88         String trustStorePasswordSystemProperty =
89                 System.getProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
90         if (trustStorePasswordSystemProperty != null) {
91             savedValuesMap.put(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME,
92                     trustStorePasswordSystemProperty);
93         }
94
95         System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
96         System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME, "kstest");
97
98         System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME, "src/test/resources/keystore-test");
99         System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME, "kstest");
100
101         /* echo server - https + basic auth */
102
103         final HttpServletServer echoServerAuth =
104                 HttpServletServer.factory.build("echo", true, "localhost", 6667, "/", false, true);
105         echoServerAuth.setBasicAuthentication("x", "y", null);
106         echoServerAuth.addServletPackage("/*", HttpClientTest.class.getPackage().getName());
107         echoServerAuth.addFilterClass("/*", TestFilter.class.getCanonicalName());
108         echoServerAuth.addFilterClass("/*", TestAuthorizationFilter.class.getCanonicalName());
109         echoServerAuth.addFilterClass("/*", TestAafAuthFilter.class.getCanonicalName());
110         echoServerAuth.addFilterClass("/*", TestAafGranularAuthFilter.class.getCanonicalName());
111         echoServerAuth.waitedStart(5000);
112
113         if (!NetworkUtil.isTcpPortOpen("localhost", echoServerAuth.getPort(), 5, 10000L)) {
114             throw new IllegalStateException("cannot connect to port " + echoServerAuth.getPort());
115         }
116     }
117
118     /**
119      * Clear https clients and reset providers.
120      */
121     @Before
122     public void setUp() {
123         HttpClient.factory.destroy();
124
125         MyGsonProvider.resetSome();
126         MyJacksonProvider.resetSome();
127     }
128
129     /**
130      * After the class is created method.
131      */
132     @AfterClass
133     public static void tearDownAfterClass() {
134         HttpServletServer.factory.destroy();
135         HttpClient.factory.destroy();
136
137         if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME)) {
138             System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME,
139                     savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME));
140             savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
141         } else {
142             System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PROPERTY_NAME);
143         }
144
145         if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME)) {
146             System.setProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME,
147                     savedValuesMap.get(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME));
148             savedValuesMap.remove(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
149         } else {
150             System.clearProperty(JettyJerseyServer.SYSTEM_KEYSTORE_PASSWORD_PROPERTY_NAME);
151         }
152
153         if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME)) {
154             System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME,
155                     savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME));
156             savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
157         } else {
158             System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PROPERTY_NAME);
159         }
160
161         if (savedValuesMap.containsKey(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME)) {
162             System.setProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME,
163                     savedValuesMap.get(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME));
164             savedValuesMap.remove(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
165         } else {
166             System.clearProperty(JettyJerseyServer.SYSTEM_TRUSTSTORE_PASSWORD_PROPERTY_NAME);
167         }
168
169
170     }
171
172     @Test
173     public void testHttpGetNoAuthClient() throws Exception {
174         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
175             6666);
176         final Response response = client.get("hello");
177         final String body = HttpClient.getBody(response, String.class);
178
179         assertEquals(200, response.getStatus());
180         assertEquals("hello", body);
181     }
182
183     @Test
184     public void testHttpPutNoAuthClient() throws Exception {
185         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false, 6666);
186
187         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
188         final Response response = client.put("hello", entity, Collections.emptyMap());
189         final String body = HttpClient.getBody(response, String.class);
190
191         assertEquals(200, response.getStatus());
192         assertEquals("PUT:hello:{myParameter=myValue}", body);
193     }
194
195     @Test
196     public void testHttpPostNoAuthClient() throws Exception {
197         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
198             6666);
199
200         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
201         final Response response = client.post("hello", entity, Collections.emptyMap());
202         final String body = HttpClient.getBody(response, String.class);
203
204         assertEquals(200, response.getStatus());
205         assertEquals("POST:hello:{myParameter=myValue}", body);
206     }
207
208     @Test
209     public void testHttpDeletetNoAuthClient() throws Exception {
210         final HttpClient client = getNoAuthHttpClient("testHttpNoAuthClient", false,
211             6666);
212
213         final Response response = client.delete("hello", Collections.emptyMap());
214         final String body = HttpClient.getBody(response, String.class);
215
216         assertEquals(200, response.getStatus());
217         assertEquals("DELETE:hello", body);
218     }
219
220     @Test
221     public void testHttpGetAuthClient() throws Exception {
222         final HttpClient client = getAuthHttpClient();
223
224         final Response response = client.get("hello");
225         final String body = HttpClient.getBody(response, String.class);
226
227         assertEquals(200, response.getStatus());
228         assertEquals("hello", body);
229     }
230
231     @Test
232     public void testHttpPutAuthClient() throws Exception {
233         final HttpClient client = getAuthHttpClient();
234
235         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
236         final Response response = client.put("hello", entity, Collections.emptyMap());
237         final String body = HttpClient.getBody(response, String.class);
238
239         assertEquals(200, response.getStatus());
240         assertEquals("PUT:hello:{myParameter=myValue}", body);
241     }
242
243     @Test
244     public void testHttpPutAuthClient_JacksonProvider() throws Exception {
245         final HttpClient client = HttpClient.factory.build(BusTopicParams.builder().clientName("testHttpAuthClient")
246                         .useHttps(true).allowSelfSignedCerts(true).hostname("localhost").port(6667)
247                         .basePath("junit/echo").userName("x").password("y").managed(true)
248                         .serializationProvider(MyJacksonProvider.class.getCanonicalName()).build());
249
250         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
251         final Response response = client.put("hello", entity, Collections.emptyMap());
252         final String body = HttpClient.getBody(response, String.class);
253
254         assertEquals(200, response.getStatus());
255         assertEquals("PUT:hello:{myParameter=myValue}", body);
256
257         assertTrue(MyJacksonProvider.hasWrittenSome());
258
259         assertFalse(MyGsonProvider.hasWrittenSome());
260     }
261
262     @Test
263     public void testHttpPutAuthClient_GsonProvider() throws Exception {
264         final HttpClient client = HttpClient.factory.build(BusTopicParams.builder().clientName("testHttpAuthClient")
265                         .useHttps(true).allowSelfSignedCerts(true).hostname("localhost").port(6667)
266                         .basePath("junit/echo").userName("x").password("y").managed(true)
267                         .serializationProvider(MyGsonProvider.class.getCanonicalName()).build());
268
269         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
270         final Response response = client.put("hello", entity, Collections.emptyMap());
271         final String body = HttpClient.getBody(response, String.class);
272
273         assertEquals(200, response.getStatus());
274         assertEquals("PUT:hello:{myParameter=myValue}", body);
275
276         assertTrue(MyGsonProvider.hasWrittenSome());
277
278         assertFalse(MyJacksonProvider.hasWrittenSome());
279     }
280
281     @Test
282     public void testHttpAuthClient401() throws Exception {
283         final HttpClient client = getNoAuthHttpClient("testHttpAuthClient401", true,
284             6667);
285         final Response response = client.get("hello");
286         assertEquals(401, response.getStatus());
287     }
288
289     @Test
290     public void testHttpAuthClientProps() throws Exception {
291         final Properties httpProperties = new Properties();
292
293         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES, "PAP,PDP");
294         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
295                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
296         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
297                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7777");
298         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
299                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpap");
300         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
301                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
302         httpProperties.setProperty(
303                 PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
304                         + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX,
305                 RestMockHealthCheck.class.getName());
306         httpProperties.setProperty(
307             PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PAP"
308                 + PolicyEndPointProperties.PROPERTY_HTTP_FILTER_CLASSES_SUFFIX,
309             TestFilter.class.getName());
310         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
311                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
312
313         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
314                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
315         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
316                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7778");
317         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
318                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpdp");
319         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
320                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
321         httpProperties.setProperty(
322                 PolicyEndPointProperties.PROPERTY_HTTP_SERVER_SERVICES + "." + "PDP"
323                         + PolicyEndPointProperties.PROPERTY_HTTP_REST_CLASSES_SUFFIX,
324                 RestMockHealthCheck.class.getName());
325         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
326                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
327
328         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES, "PAP,PDP");
329         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
330                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
331         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
332                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7777");
333         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
334                 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "pap/test");
335         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
336                 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
337         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
338                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpap");
339         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
340                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
341         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PAP"
342                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
343
344         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
345                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
346         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
347                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "7778");
348         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
349                 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "pdp");
350         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
351                 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
352         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
353                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_USERNAME_SUFFIX, "testpdp");
354         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
355                 + PolicyEndPointProperties.PROPERTY_HTTP_AUTH_PASSWORD_SUFFIX, "alpha123");
356         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "PDP"
357                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
358
359         final List<HttpServletServer> servers = HttpServletServer.factory.build(httpProperties);
360         assertEquals(2, servers.size());
361
362         final List<HttpClient> clients = HttpClient.factory.build(httpProperties);
363         assertEquals(2, clients.size());
364
365         for (final HttpServletServer server : servers) {
366             server.waitedStart(10000);
367         }
368
369         final HttpClient clientPap = HttpClient.factory.get("PAP");
370         final Response response = clientPap.get();
371         assertEquals(200, response.getStatus());
372
373         final HttpClient clientPdp = HttpClient.factory.get("PDP");
374         final Response response2 = clientPdp.get("test");
375         assertEquals(500, response2.getStatus());
376
377         assertFalse(MyJacksonProvider.hasWrittenSome());
378         assertFalse(MyGsonProvider.hasWrittenSome());
379     }
380
381     @Test
382     public void testHttpAuthClientProps_MixedProviders() throws Exception {
383         final Properties httpProperties = new Properties();
384
385         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES, "GSON,JACKSON");
386         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
387                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
388         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
389                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "6666");
390         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
391                 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "junit/echo");
392         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
393                 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
394         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
395                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
396         httpProperties.setProperty(
397                         PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "GSON"
398                                         + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER,
399                         MyGsonProvider.class.getCanonicalName());
400
401         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
402                 + PolicyEndPointProperties.PROPERTY_HTTP_HOST_SUFFIX, "localhost");
403         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
404                 + PolicyEndPointProperties.PROPERTY_HTTP_PORT_SUFFIX, "6666");
405         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
406                 + PolicyEndPointProperties.PROPERTY_HTTP_URL_SUFFIX, "junit/echo");
407         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
408                 + PolicyEndPointProperties.PROPERTY_HTTP_HTTPS_SUFFIX, "false");
409         httpProperties.setProperty(PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
410                 + PolicyEndPointProperties.PROPERTY_MANAGED_SUFFIX, "true");
411         httpProperties.setProperty(
412                         PolicyEndPointProperties.PROPERTY_HTTP_CLIENT_SERVICES + "." + "JACKSON"
413                                         + PolicyEndPointProperties.PROPERTY_HTTP_SERIALIZATION_PROVIDER,
414                         MyJacksonProvider.class.getCanonicalName());
415
416         final List<HttpClient> clients = HttpClient.factory.build(httpProperties);
417         assertEquals(2, clients.size());
418
419         Entity<MyEntity> entity = Entity.entity(new MyEntity("myValue"), MediaType.APPLICATION_JSON);
420
421         // use gson client
422         MyGsonProvider.resetSome();
423         MyJacksonProvider.resetSome();
424         HttpClient client = HttpClient.factory.get("GSON");
425
426         Response response = client.put("hello", entity, Collections.emptyMap());
427         String body = HttpClient.getBody(response, String.class);
428
429         assertEquals(200, response.getStatus());
430         assertEquals("PUT:hello:{myParameter=myValue}", body);
431
432         assertTrue(MyGsonProvider.hasWrittenSome());
433         assertFalse(MyJacksonProvider.hasWrittenSome());
434
435         // use jackson client
436         MyGsonProvider.resetSome();
437         MyJacksonProvider.resetSome();
438         client = HttpClient.factory.get("JACKSON");
439
440         response = client.put("hello", entity, Collections.emptyMap());
441         body = HttpClient.getBody(response, String.class);
442
443         assertEquals(200, response.getStatus());
444         assertEquals("PUT:hello:{myParameter=myValue}", body);
445
446         assertTrue(MyJacksonProvider.hasWrittenSome());
447         assertFalse(MyGsonProvider.hasWrittenSome());
448     }
449
450     private HttpClient getAuthHttpClient()
451                     throws KeyManagementException, NoSuchAlgorithmException, ClassNotFoundException {
452         return HttpClient.factory.build(BusTopicParams.builder().clientName("testHttpAuthClient")
453             .useHttps(true).allowSelfSignedCerts(true).hostname("localhost").port(6667).basePath("junit/echo")
454             .userName("x").password("y").managed(true).build());
455     }
456
457     private HttpClient getNoAuthHttpClient(String clientName, boolean https, int port)
458         throws KeyManagementException, NoSuchAlgorithmException, ClassNotFoundException {
459         return HttpClient.factory.build(BusTopicParams.builder().clientName(clientName)
460             .useHttps(https).allowSelfSignedCerts(https).hostname("localhost").port(port).basePath("junit/echo")
461             .userName(null).password(null).managed(true).build());
462     }
463
464
465     class MyEntity {
466
467         private String myParameter;
468
469         public MyEntity(final String myParameter) {
470             this.myParameter = myParameter;
471         }
472
473         public void setMyParameter(final String myParameter) {
474             this.myParameter = myParameter;
475         }
476
477         public String getMyParameter() {
478             return myParameter;
479         }
480
481     }
482
483 }