Modify policy/api to use RestServer from common
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / TestApiRestServer.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4  *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5  * ================================================================================
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  *
18  * SPDX-License-Identifier: Apache-2.0
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.api.main.rest;
23
24 import static org.assertj.core.api.Assertions.assertThatCode;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
29 import static org.junit.Assert.fail;
30
31 import java.io.IOException;
32 import java.lang.reflect.Constructor;
33 import java.lang.reflect.Modifier;
34 import java.security.SecureRandom;
35 import java.security.cert.X509Certificate;
36 import java.util.Properties;
37 import javax.net.ssl.SSLContext;
38 import javax.net.ssl.TrustManager;
39 import javax.net.ssl.X509TrustManager;
40 import javax.ws.rs.client.Client;
41 import javax.ws.rs.client.ClientBuilder;
42 import javax.ws.rs.client.Entity;
43 import javax.ws.rs.client.Invocation;
44 import javax.ws.rs.client.WebTarget;
45 import javax.ws.rs.core.MediaType;
46 import javax.ws.rs.core.Response;
47 import org.glassfish.jersey.client.ClientConfig;
48 import org.glassfish.jersey.client.ClientProperties;
49 import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
50 import org.junit.After;
51 import org.junit.Test;
52 import org.onap.policy.api.main.exception.PolicyApiException;
53 import org.onap.policy.api.main.parameters.CommonTestData;
54 import org.onap.policy.api.main.startstop.Main;
55 import org.onap.policy.common.endpoints.http.server.RestServer;
56 import org.onap.policy.common.endpoints.parameters.RestServerParameters;
57 import org.onap.policy.common.endpoints.report.HealthCheckReport;
58 import org.onap.policy.common.gson.GsonMessageBodyHandler;
59 import org.onap.policy.common.utils.coder.StandardCoder;
60 import org.onap.policy.common.utils.network.NetworkUtil;
61 import org.onap.policy.common.utils.resources.ResourceUtils;
62 import org.onap.policy.models.errors.concepts.ErrorResponse;
63 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
64 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
65 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
66 import org.slf4j.Logger;
67 import org.slf4j.LoggerFactory;
68
69 /**
70  * Class to perform unit test of {@link ApiRestServer}.
71  *
72  * @author Chenfei Gao (cgao@research.att.com)
73  */
74 public class TestApiRestServer {
75
76     private static final Logger LOGGER = LoggerFactory.getLogger(TestApiRestServer.class);
77     private static final String NOT_ALIVE = "not alive";
78     private static final String ALIVE = "alive";
79     private static final String SELF = "self";
80     private static final String NAME = "Policy API";
81
82     private static final String HEALTHCHECK_ENDPOINT = "healthcheck";
83     private static final String STATISTICS_ENDPOINT = "statistics";
84
85     private static final String POLICYTYPES = "policytypes";
86     private static final String POLICYTYPES_TCA = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app";
87     private static final String POLICYTYPES_COLLECTOR =
88             "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server";
89     private static final String POLICYTYPES_TCA_VERSION =
90             "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0";
91     private static final String POLICYTYPES_TCA_LATEST =
92             "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/latest";
93     private static final String POLICYTYPES_COLLECTOR_VERSION =
94             "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/1.0.0";
95     private static final String POLICYTYPES_COLLECTOR_LATEST =
96             "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server/versions/latest";
97
98     private static final String POLICYTYPES_TCA_POLICIES =
99             "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies";
100     private static final String POLICYTYPES_TCA_POLICIES_VCPE =
101             "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca";
102     private static final String POLICYTYPES_TCA_POLICIES_VCPE_VERSION = "policytypes/"
103         + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/1.0.0";
104     private static final String POLICYTYPES_TCA_POLICIES_VCPE_LATEST = "policytypes/"
105         + "onap.policies.monitoring.cdap.tca.hi.lo.app/versions/1.0.0/policies/onap.restart.tca/versions/latest";
106
107     private static final String GUARD_POLICIES =
108             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies";
109     private static final String GUARD_POLICIES_VDNS_FL_LATEST =
110             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout"
111             + "/versions/latest";
112     private static final String GUARD_POLICIES_VDNS_MINMAX_LATEST =
113             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout"
114             + "/versions/latest";
115     private static final String GUARD_POLICIES_VDNS_FL_VERSION = "policytypes/"
116         + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.frequency.scaleout/versions/1";
117     private static final String GUARD_POLICIES_VDNS_MINMAX_VERSION = "policytypes/"
118         + "onap.policies.controlloop.Guard/versions/1.0.0/policies/guard.minmax.scaleout/versions/1";
119
120     private static final String OPS_POLICIES =
121             "policytypes/onap.policies.controlloop.Operational/versions/1.0.0/policies";
122     private static final String OPS_POLICIES_VCPE_LATEST =
123             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart"
124             + "/versions/latest";
125     private static final String OPS_POLICIES_VDNS_LATEST =
126             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout"
127             + "/versions/latest";
128     private static final String OPS_POLICIES_VFIREWALL_LATEST =
129             "policytypes/onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig"
130             + "/versions/latest";
131     private static final String OPS_POLICIES_VCPE_VERSION = "policytypes/"
132         + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.restart/versions/1";
133     private static final String OPS_POLICIES_VDNS_VERSION = "policytypes/"
134         + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.scaleout/versions/1";
135     private static final String OPS_POLICIES_VFIREWALL_VERSION = "policytypes/"
136         + "onap.policies.controlloop.Guard/versions/1.0.0/policies/operational.modifyconfig/versions/1";
137
138     private static final String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
139     private static final CommonTestData COMMON_TEST_DATA = new CommonTestData();
140     private Main main;
141     private RestServer restServer;
142     private StandardCoder standardCoder = new StandardCoder();
143     private int port;
144
145     // @formatter:off
146     private String[] toscaPolicyResourceNames = {
147         "policies/vCPE.policy.monitoring.input.tosca.json",
148         "policies/vDNS.policy.monitoring.input.tosca.json",
149         "policies/vFirewall.policy.monitoring.input.tosca.json",
150     };
151
152     private String[] toscaPolicyTypeResourceNames = {
153         "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
154         "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
155     };
156
157     private String[] legacyGuardPolicyResourceNames = {
158         "policies/vDNS.policy.guard.frequency.input.json",
159         "policies/vDNS.policy.guard.minmax.input.json",
160     };
161
162     private String[] legacyOperationalPolicyResourceNames = {
163         "policies/vCPE.policy.operational.input.json",
164         "policies/vDNS.policy.operational.input.json",
165         "policies/vFirewall.policy.operational.input.json"
166     };
167     // @formatter:on
168
169     /**
170      * Method for cleanup after each test.
171      */
172     @After
173     public void teardown() throws Exception {
174         if (main != null) {
175             stopApiService(main);
176         } else if (restServer != null) {
177             restServer.stop();
178         }
179     }
180
181     @Test
182     public void testHealthCheckSuccess() {
183
184         try {
185             main = startApiService(true);
186             final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
187             final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
188             validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
189         } catch (final Exception exp) {
190             LOGGER.error("testHealthCheckSuccess failed", exp);
191             fail("Test should not throw an exception");
192         }
193     }
194
195     @Test
196     public void testHealthCheckFailure() throws InterruptedException, IOException {
197
198         port = NetworkUtil.allocPort();
199         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
200         restServerParams.setName(CommonTestData.API_GROUP_NAME);
201         restServer = new RestServer(restServerParams, null, ApiRestController.class);
202         try {
203             restServer.start();
204             final Invocation.Builder invocationBuilder = sendHttpRequest(HEALTHCHECK_ENDPOINT);
205             final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
206             validateHealthCheckReport(NAME, SELF, false, 500, NOT_ALIVE, report);
207             assertTrue(restServer.isAlive());
208             assertTrue(restServer.toString().startsWith("RestServer [servers="));
209         } catch (final Exception exp) {
210             LOGGER.error("testHealthCheckFailure failed", exp);
211             fail("Test should not throw an exception");
212         }
213     }
214
215     @Test
216     public void testHttpsHealthCheckSuccess() {
217
218         try {
219             main = startApiService(false);
220             final Invocation.Builder invocationBuilder = sendHttpsRequest(HEALTHCHECK_ENDPOINT);
221             final HealthCheckReport report = invocationBuilder.get(HealthCheckReport.class);
222             validateHealthCheckReport(NAME, SELF, true, 200, ALIVE, report);
223         } catch (final Exception exp) {
224             LOGGER.error("testHttpsHealthCheckSuccess failed", exp);
225             fail("Test should not throw an exception");
226         }
227     }
228
229     @Test
230     public void testApiStatistics_200() {
231
232         try {
233             main = startApiService(true);
234             Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
235             StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
236             validateStatisticsReport(report, 200);
237             updateApiStatistics();
238             invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
239             report = invocationBuilder.get(StatisticsReport.class);
240             validateStatisticsReport(report, 200);
241             ApiStatisticsManager.resetAllStatistics();
242         } catch (final Exception exp) {
243             LOGGER.error("testApiStatistics_200 failed", exp);
244             fail("Test should not throw an exception");
245         }
246     }
247
248     @Test
249     public void testApiStatistics_500() throws Exception {
250
251         port = NetworkUtil.allocPort();
252         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false, port);
253         restServerParams.setName(CommonTestData.API_GROUP_NAME);
254         restServer = new RestServer(restServerParams, null, ApiRestController.class);
255         try {
256             restServer.start();
257             final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
258             final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
259             validateStatisticsReport(report, 500);
260             ApiStatisticsManager.resetAllStatistics();
261         } catch (final Exception exp) {
262             LOGGER.error("testApiStatistics_500 failed", exp);
263             fail("Test should not throw an exception");
264         }
265     }
266
267     @Test
268     public void testHttpsApiStatistics() {
269
270         try {
271             main = startApiService(false);
272             final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
273             final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
274             validateStatisticsReport(report, 200);
275         } catch (final Exception exp) {
276             LOGGER.error("testHttpsApiStatistics failed", exp);
277             fail("Test should not throw an exception");
278         }
279     }
280
281     @Test
282     public void testApiStatisticsConstructorIsPrivate() {
283
284         try {
285             final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
286             assertTrue(Modifier.isPrivate(constructor.getModifiers()));
287             constructor.setAccessible(true);
288             constructor.newInstance();
289         } catch (final Exception exp) {
290             assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
291         }
292     }
293
294     @Test
295     public void testCreatePolicyTypes() {
296
297         assertThatCode(() -> {
298             main = startApiService(true);
299             for (String resrcName : toscaPolicyTypeResourceNames) {
300                 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
301                 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
302                 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
303                 assertNotNull(response);
304                 assertFalse(response.getPolicyTypes().get(0).isEmpty());
305             }
306         }).doesNotThrowAnyException();
307     }
308
309     @Test
310     public void testReadPolicyTypes() {
311
312         assertThatCode(() -> {
313             main = startApiService(true);
314             Response rawResponse = readResource(POLICYTYPES, true);
315             assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
316             ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
317             assertTrue(response.getPolicyTypes().isEmpty());
318
319             rawResponse = readResource(POLICYTYPES_TCA, true);
320             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
321             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
322             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
323                     error.getErrorMessage());
324
325             rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
326             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
327             error = rawResponse.readEntity(ErrorResponse.class);
328             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
329                     error.getErrorMessage());
330
331             rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
332             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
333             error = rawResponse.readEntity(ErrorResponse.class);
334             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
335                     error.getErrorMessage());
336
337             rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
338             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
339             error = rawResponse.readEntity(ErrorResponse.class);
340             assertEquals("policy type with ID "
341                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
342                     error.getErrorMessage());
343
344             rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
345             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
346             error = rawResponse.readEntity(ErrorResponse.class);
347             assertEquals("policy type with ID "
348                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
349                     error.getErrorMessage());
350
351             rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
352             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
353             error = rawResponse.readEntity(ErrorResponse.class);
354             assertEquals("policy type with ID "
355                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
356                     error.getErrorMessage());
357         }).doesNotThrowAnyException();
358     }
359
360     @Test
361     public void testDeletePolicyType() {
362
363         assertThatCode(() -> {
364             main = startApiService(true);
365             Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
366             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
367             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
368             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
369                     error.getErrorMessage());
370
371             rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
372             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
373             error = rawResponse.readEntity(ErrorResponse.class);
374             assertEquals("policy type with ID "
375                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
376                     error.getErrorMessage());
377         }).doesNotThrowAnyException();
378     }
379
380     @Test
381     public void testCreatePolicies() {
382
383         assertThatCode(() -> {
384             main = startApiService(true);
385             for (String resrcName : toscaPolicyResourceNames) {
386                 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
387                 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
388                 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
389                 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
390                         error.getErrorMessage());
391             }
392         }).doesNotThrowAnyException();
393     }
394
395     @Test
396     public void testReadPolicies() {
397
398         assertThatCode(() -> {
399             main = startApiService(true);
400             Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
401             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
402             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
403             assertEquals("policy with ID null:null and "
404                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
405                     error.getErrorMessage());
406
407             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
408             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
409             error = rawResponse.readEntity(ErrorResponse.class);
410             assertEquals("policy with ID onap.restart.tca:null and "
411                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
412                     error.getErrorMessage());
413
414             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
415             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
416             error = rawResponse.readEntity(ErrorResponse.class);
417             assertEquals("policy with ID onap.restart.tca:1.0.0 and "
418                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
419                     error.getErrorMessage());
420
421             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
422             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
423             error = rawResponse.readEntity(ErrorResponse.class);
424             assertEquals("policy with ID onap.restart.tca:null and "
425                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
426                     error.getErrorMessage());
427         }).doesNotThrowAnyException();
428     }
429
430     @Test
431     public void testDeletePolicies() {
432
433         assertThatCode(() -> {
434             main = startApiService(true);
435             Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
436             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
437             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
438             assertEquals("policy with ID onap.restart.tca:1.0.0 and "
439                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
440                     error.getErrorMessage());
441         }).doesNotThrowAnyException();
442     }
443
444     @Test
445     public void testCreateGuardPolicies() {
446
447         assertThatCode(() -> {
448             main = startApiService(true);
449             for (String resrcName : legacyGuardPolicyResourceNames) {
450                 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
451                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
452             }
453         }).doesNotThrowAnyException();
454     }
455
456     @Test
457     public void testCreateOperationalPolicies() {
458
459         assertThatCode(() -> {
460             main = startApiService(true);
461             for (String resrcName : legacyOperationalPolicyResourceNames) {
462                 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
463                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
464             }
465         }).doesNotThrowAnyException();
466     }
467
468     @Test
469     public void testReadGuardPolicies() {
470
471         assertThatCode(() -> {
472             main = startApiService(true);
473             Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
474             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
475             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
476             assertEquals("no policy found for policy: guard.frequency.scaleout:null",
477                     error.getErrorMessage());
478
479             rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
480             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
481             error = rawResponse.readEntity(ErrorResponse.class);
482             assertEquals("no policy found for policy: guard.frequency.scaleout:1",
483                     error.getErrorMessage());
484
485             rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
486             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
487             error = rawResponse.readEntity(ErrorResponse.class);
488             assertEquals("no policy found for policy: guard.minmax.scaleout:null",
489                     error.getErrorMessage());
490
491             rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
492             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
493             error = rawResponse.readEntity(ErrorResponse.class);
494             assertEquals("no policy found for policy: guard.minmax.scaleout:1",
495                     error.getErrorMessage());
496         }).doesNotThrowAnyException();
497     }
498
499     @Test
500     public void testReadOperationalPolicies() {
501
502         assertThatCode(() -> {
503             main = startApiService(true);
504             Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
505             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
506             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
507             assertEquals("no policy found for policy: operational.restart:null",
508                     error.getErrorMessage());
509
510             rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
511             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
512             error = rawResponse.readEntity(ErrorResponse.class);
513             assertEquals("no policy found for policy: operational.restart:1",
514                     error.getErrorMessage());
515
516             rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
517             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
518             error = rawResponse.readEntity(ErrorResponse.class);
519             assertEquals("no policy found for policy: operational.scaleout:null",
520                     error.getErrorMessage());
521
522             rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
523             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
524             error = rawResponse.readEntity(ErrorResponse.class);
525             assertEquals("no policy found for policy: operational.scaleout:1",
526                     error.getErrorMessage());
527
528             rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
529             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
530             error = rawResponse.readEntity(ErrorResponse.class);
531             assertEquals("no policy found for policy: operational.modifyconfig:null",
532                     error.getErrorMessage());
533
534             rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
535             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
536             error = rawResponse.readEntity(ErrorResponse.class);
537             assertEquals("no policy found for policy: operational.modifyconfig:1",
538                     error.getErrorMessage());
539         }).doesNotThrowAnyException();
540     }
541
542     @Test
543     public void testDeleteGuardPolicy() {
544
545         assertThatCode(() -> {
546             main = startApiService(true);
547             Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
548             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
549             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
550             assertEquals("no policy found for policy: guard.frequency.scaleout:1",
551                     error.getErrorMessage());
552         }).doesNotThrowAnyException();
553     }
554
555     @Test
556     public void testDeleteOperationalPolicy() {
557
558         assertThatCode(() -> {
559             main = startApiService(true);
560             Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
561             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
562             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
563             assertEquals("no policy found for policy: operational.restart:1",
564                     error.getErrorMessage());
565         }).doesNotThrowAnyException();
566     }
567
568     @Test
569     public void testHttpsCreatePolicyTypes() {
570
571         assertThatCode(() -> {
572             main = startApiService(false);
573             for (String resrcName : toscaPolicyTypeResourceNames) {
574                 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
575                 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
576                 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
577                 assertNotNull(response);
578                 assertFalse(response.getPolicyTypes().get(0).isEmpty());
579             }
580         }).doesNotThrowAnyException();
581     }
582
583     @Test
584     public void testHttpsCreatePolicies() {
585
586         assertThatCode(() -> {
587             main = startApiService(false);
588             for (String resrcName : toscaPolicyResourceNames) {
589                 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
590                 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
591                 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
592                 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
593                         error.getErrorMessage());
594             }
595         }).doesNotThrowAnyException();
596     }
597
598     @Test
599     public void testHttpsCreateGuardPolicies() {
600
601         assertThatCode(() -> {
602             main = startApiService(false);
603             for (String resrcName : legacyGuardPolicyResourceNames) {
604                 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
605                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
606             }
607         }).doesNotThrowAnyException();
608     }
609
610     @Test
611     public void testHttpsCreateOperationalPolicies() {
612
613         assertThatCode(() -> {
614             main = startApiService(false);
615             for (String resrcName : legacyOperationalPolicyResourceNames) {
616                 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
617                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
618             }
619         }).doesNotThrowAnyException();
620     }
621
622     private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
623
624         ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
625                 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
626         final Invocation.Builder invocationBuilder;
627
628         if (http) {
629             invocationBuilder = sendHttpRequest(endpoint);
630         } else {
631             invocationBuilder = sendHttpsRequest(endpoint);
632         }
633
634         Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
635         return invocationBuilder.post(entity);
636     }
637
638     private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
639
640         LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
641                 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
642         final Invocation.Builder invocationBuilder;
643
644         if (http) {
645             invocationBuilder = sendHttpRequest(endpoint);
646         } else {
647             invocationBuilder = sendHttpsRequest(endpoint);
648         }
649
650         Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
651         return invocationBuilder.post(entity);
652     }
653
654     private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
655
656         LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
657                 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
658         final Invocation.Builder invocationBuilder;
659
660         if (http) {
661             invocationBuilder = sendHttpRequest(endpoint);
662         } else {
663             invocationBuilder = sendHttpsRequest(endpoint);
664         }
665
666         Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
667         return invocationBuilder.post(entity);
668     }
669
670     private Response readResource(String endpoint, boolean http) throws Exception {
671
672         final Invocation.Builder invocationBuilder;
673
674         if (http) {
675             invocationBuilder = sendHttpRequest(endpoint);
676         } else {
677             invocationBuilder = sendHttpsRequest(endpoint);
678         }
679
680         return invocationBuilder.get();
681
682     }
683
684     private Response deleteResource(String endpoint, boolean http) throws Exception {
685
686         final Invocation.Builder invocationBuilder;
687
688         if (http) {
689             invocationBuilder = sendHttpRequest(endpoint);
690         } else {
691             invocationBuilder = sendHttpsRequest(endpoint);
692         }
693
694         return invocationBuilder.delete();
695     }
696
697     private Main startApiService(final boolean http) throws Exception {
698         port = NetworkUtil.allocPort();
699
700         final String[] apiConfigParameters = new String[2];
701         if (http) {
702             COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters.json",
703                             "src/test/resources/parameters/ApiConfigParametersXXX.json", port);
704             apiConfigParameters[0] = "-c";
705             apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParametersXXX.json";
706         } else {
707             final Properties systemProps = System.getProperties();
708             systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
709             systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
710             System.setProperties(systemProps);
711             COMMON_TEST_DATA.makeParameters("src/test/resources/parameters/ApiConfigParameters_Https.json",
712                             "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json", port);
713             apiConfigParameters[0] = "-c";
714             apiConfigParameters[1] = "src/test/resources/parameters/ApiConfigParameters_HttpsXXX.json";
715         }
716         return new Main(apiConfigParameters);
717     }
718
719     private void stopApiService(final Main main) throws PolicyApiException {
720
721         main.shutdown();
722     }
723
724     private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
725
726         final ClientConfig clientConfig = new ClientConfig();
727
728         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
729         clientConfig.register(feature);
730
731         final Client client = ClientBuilder.newClient(clientConfig);
732
733         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
734         client.register(GsonMessageBodyHandler.class);
735
736         final WebTarget webTarget = client.target("http://localhost:" + port + "/policy/api/v1/" + endpoint);
737
738         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
739
740         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
741             throw new IllegalStateException("cannot connect to port " + port);
742         }
743         return invocationBuilder;
744     }
745
746     private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
747
748         final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
749
750             @Override
751             public X509Certificate[] getAcceptedIssuers() {
752                 return new X509Certificate[0];
753             }
754
755             @Override
756             public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
757
758             @Override
759             public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
760         } };
761
762         final SSLContext sc = SSLContext.getInstance("TLSv1.2");
763         sc.init(null, noopTrustManager, new SecureRandom());
764         final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
765                 session) -> true);
766         final Client client = clientBuilder.build();
767         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
768         client.register(feature);
769
770         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
771         client.register(GsonMessageBodyHandler.class);
772
773         final WebTarget webTarget = client.target("https://localhost:" + port + "/policy/api/v1/" + endpoint);
774
775         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
776
777         if (!NetworkUtil.isTcpPortOpen("localhost", port, 60, 1000L)) {
778             throw new IllegalStateException("cannot connect to port " + port);
779         }
780         return invocationBuilder;
781     }
782
783     private void updateApiStatistics() {
784
785         ApiStatisticsManager.updateTotalApiCallCount();
786         ApiStatisticsManager.updateApiCallSuccessCount();
787         ApiStatisticsManager.updateApiCallFailureCount();
788         ApiStatisticsManager.updateTotalPolicyGetCount();
789         ApiStatisticsManager.updateTotalPolicyPostCount();
790         ApiStatisticsManager.updateTotalPolicyTypeGetCount();
791         ApiStatisticsManager.updateTotalPolicyTypePostCount();
792         ApiStatisticsManager.updatePolicyGetSuccessCount();
793         ApiStatisticsManager.updatePolicyGetFailureCount();
794         ApiStatisticsManager.updatePolicyPostSuccessCount();
795         ApiStatisticsManager.updatePolicyPostFailureCount();
796         ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
797         ApiStatisticsManager.updatePolicyTypeGetFailureCount();
798         ApiStatisticsManager.updatePolicyTypePostSuccessCount();
799         ApiStatisticsManager.updatePolicyTypePostFailureCount();
800     }
801
802     private void validateStatisticsReport(final StatisticsReport report, final int code) {
803
804         assertEquals(code, report.getCode());
805     }
806
807     private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
808             final String message, final HealthCheckReport report) {
809
810         assertEquals(name, report.getName());
811         assertEquals(url, report.getUrl());
812         assertEquals(healthy, report.isHealthy());
813         assertEquals(code, report.getCode());
814         assertEquals(message, report.getMessage());
815     }
816 }