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