Fix the bug of cannot return multiple versions of tosca entity
[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 String KEYSTORE = System.getProperty("user.dir") + "/src/test/resources/ssl/policy-keystore";
140     private Main main;
141     private ApiRestServer restServer;
142     private StandardCoder standardCoder = new StandardCoder();
143
144     // @formatter:off
145     private String[] toscaPolicyResourceNames = {
146         "policies/vCPE.policy.monitoring.input.tosca.json",
147         "policies/vDNS.policy.monitoring.input.tosca.json",
148         "policies/vFirewall.policy.monitoring.input.tosca.json",
149     };
150
151     private String[] toscaPolicyTypeResourceNames = {
152         "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.json",
153         "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.json"
154     };
155
156     private String[] legacyGuardPolicyResourceNames = {
157         "policies/vDNS.policy.guard.frequency.input.json",
158         "policies/vDNS.policy.guard.minmax.input.json",
159     };
160
161     private String[] legacyOperationalPolicyResourceNames = {
162         "policies/vCPE.policy.operational.input.json",
163         "policies/vDNS.policy.operational.input.json",
164         "policies/vFirewall.policy.operational.input.json"
165     };
166     // @formatter:on
167
168     /**
169      * Method for cleanup after each test.
170      */
171     @After
172     public void teardown() throws Exception {
173         if (NetworkUtil.isTcpPortOpen("localhost", 6969, 1, 1000L)) {
174             if (main != null) {
175                 stopApiService(main);
176             } else if (restServer != null) {
177                 restServer.stop();
178             }
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         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
200         restServerParams.setName(CommonTestData.API_GROUP_NAME);
201         restServer = new ApiRestServer(restServerParams);
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("ApiRestServer [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() {
250
251         final RestServerParameters restServerParams = new CommonTestData().getRestServerParameters(false);
252         restServerParams.setName(CommonTestData.API_GROUP_NAME);
253         restServer = new ApiRestServer(restServerParams);
254         try {
255             restServer.start();
256             final Invocation.Builder invocationBuilder = sendHttpRequest(STATISTICS_ENDPOINT);
257             final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
258             validateStatisticsReport(report, 500);
259             ApiStatisticsManager.resetAllStatistics();
260         } catch (final Exception exp) {
261             LOGGER.error("testApiStatistics_500 failed", exp);
262             fail("Test should not throw an exception");
263         }
264     }
265
266     @Test
267     public void testHttpsApiStatistics() {
268
269         try {
270             main = startApiService(false);
271             final Invocation.Builder invocationBuilder = sendHttpsRequest(STATISTICS_ENDPOINT);
272             final StatisticsReport report = invocationBuilder.get(StatisticsReport.class);
273             validateStatisticsReport(report, 200);
274         } catch (final Exception exp) {
275             LOGGER.error("testHttpsApiStatistics failed", exp);
276             fail("Test should not throw an exception");
277         }
278     }
279
280     @Test
281     public void testApiStatisticsConstructorIsPrivate() {
282
283         try {
284             final Constructor<ApiStatisticsManager> constructor = ApiStatisticsManager.class.getDeclaredConstructor();
285             assertTrue(Modifier.isPrivate(constructor.getModifiers()));
286             constructor.setAccessible(true);
287             constructor.newInstance();
288         } catch (final Exception exp) {
289             assertTrue(exp.getCause().toString().contains("Instantiation of the class is not allowed"));
290         }
291     }
292
293     @Test
294     public void testCreatePolicyTypes() {
295
296         assertThatCode(() -> {
297             main = startApiService(true);
298             for (String resrcName : toscaPolicyTypeResourceNames) {
299                 Response rawResponse = createResource(POLICYTYPES, resrcName, true);
300                 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
301                 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
302                 assertNotNull(response);
303                 assertFalse(response.getPolicyTypes().get(0).isEmpty());
304             }
305         }).doesNotThrowAnyException();
306     }
307
308     @Test
309     public void testReadPolicyTypes() {
310
311         assertThatCode(() -> {
312             main = startApiService(true);
313             Response rawResponse = readResource(POLICYTYPES, true);
314             assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
315             ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
316             assertTrue(response.getPolicyTypes().isEmpty());
317
318             rawResponse = readResource(POLICYTYPES_TCA, true);
319             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
320             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
321             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
322                     error.getErrorMessage());
323
324             rawResponse = readResource(POLICYTYPES_TCA_VERSION, true);
325             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
326             error = rawResponse.readEntity(ErrorResponse.class);
327             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
328                     error.getErrorMessage());
329
330             rawResponse = readResource(POLICYTYPES_TCA_LATEST, true);
331             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
332             error = rawResponse.readEntity(ErrorResponse.class);
333             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:null does not exist",
334                     error.getErrorMessage());
335
336             rawResponse = readResource(POLICYTYPES_COLLECTOR, true);
337             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
338             error = rawResponse.readEntity(ErrorResponse.class);
339             assertEquals("policy type with ID "
340                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
341                     error.getErrorMessage());
342
343             rawResponse = readResource(POLICYTYPES_COLLECTOR_VERSION, true);
344             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
345             error = rawResponse.readEntity(ErrorResponse.class);
346             assertEquals("policy type with ID "
347                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
348                     error.getErrorMessage());
349
350             rawResponse = readResource(POLICYTYPES_COLLECTOR_LATEST, true);
351             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
352             error = rawResponse.readEntity(ErrorResponse.class);
353             assertEquals("policy type with ID "
354                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:null does not exist",
355                     error.getErrorMessage());
356         }).doesNotThrowAnyException();
357     }
358
359     @Test
360     public void testDeletePolicyType() {
361
362         assertThatCode(() -> {
363             main = startApiService(true);
364             Response rawResponse = deleteResource(POLICYTYPES_TCA_VERSION, true);
365             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
366             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
367             assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
368                     error.getErrorMessage());
369
370             rawResponse = deleteResource(POLICYTYPES_COLLECTOR_VERSION, true);
371             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
372             error = rawResponse.readEntity(ErrorResponse.class);
373             assertEquals("policy type with ID "
374                 + "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:1.0.0 does not exist",
375                     error.getErrorMessage());
376         }).doesNotThrowAnyException();
377     }
378
379     @Test
380     public void testCreatePolicies() {
381
382         assertThatCode(() -> {
383             main = startApiService(true);
384             for (String resrcName : toscaPolicyResourceNames) {
385                 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, true);
386                 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
387                 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
388                 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
389                         error.getErrorMessage());
390             }
391         }).doesNotThrowAnyException();
392     }
393
394     @Test
395     public void testReadPolicies() {
396
397         assertThatCode(() -> {
398             main = startApiService(true);
399             Response rawResponse = readResource(POLICYTYPES_TCA_POLICIES, true);
400             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
401             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
402             assertEquals("policy with ID null:null and "
403                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
404                     error.getErrorMessage());
405
406             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE, true);
407             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
408             error = rawResponse.readEntity(ErrorResponse.class);
409             assertEquals("policy with ID onap.restart.tca:null and "
410                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
411                     error.getErrorMessage());
412
413             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
414             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
415             error = rawResponse.readEntity(ErrorResponse.class);
416             assertEquals("policy with ID onap.restart.tca:1.0.0 and "
417                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
418                     error.getErrorMessage());
419
420             rawResponse = readResource(POLICYTYPES_TCA_POLICIES_VCPE_LATEST, true);
421             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
422             error = rawResponse.readEntity(ErrorResponse.class);
423             assertEquals("policy with ID onap.restart.tca:null and "
424                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
425                     error.getErrorMessage());
426         }).doesNotThrowAnyException();
427     }
428
429     @Test
430     public void testDeletePolicies() {
431
432         assertThatCode(() -> {
433             main = startApiService(true);
434             Response rawResponse = deleteResource(POLICYTYPES_TCA_POLICIES_VCPE_VERSION, true);
435             assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
436             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
437             assertEquals("policy with ID onap.restart.tca:1.0.0 and "
438                 + "type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
439                     error.getErrorMessage());
440         }).doesNotThrowAnyException();
441     }
442
443     @Test
444     public void testCreateGuardPolicies() {
445
446         assertThatCode(() -> {
447             main = startApiService(true);
448             for (String resrcName : legacyGuardPolicyResourceNames) {
449                 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, true);
450                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
451             }
452         }).doesNotThrowAnyException();
453     }
454
455     @Test
456     public void testCreateOperationalPolicies() {
457
458         assertThatCode(() -> {
459             main = startApiService(true);
460             for (String resrcName : legacyOperationalPolicyResourceNames) {
461                 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, true);
462                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
463             }
464         }).doesNotThrowAnyException();
465     }
466
467     @Test
468     public void testReadGuardPolicies() {
469
470         assertThatCode(() -> {
471             main = startApiService(true);
472             Response rawResponse = readResource(GUARD_POLICIES_VDNS_FL_LATEST, true);
473             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
474             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
475             assertEquals("no policy found for policy: guard.frequency.scaleout:null",
476                     error.getErrorMessage());
477
478             rawResponse = readResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
479             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
480             error = rawResponse.readEntity(ErrorResponse.class);
481             assertEquals("no policy found for policy: guard.frequency.scaleout:1",
482                     error.getErrorMessage());
483
484             rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_LATEST, true);
485             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
486             error = rawResponse.readEntity(ErrorResponse.class);
487             assertEquals("no policy found for policy: guard.minmax.scaleout:null",
488                     error.getErrorMessage());
489
490             rawResponse = readResource(GUARD_POLICIES_VDNS_MINMAX_VERSION, true);
491             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
492             error = rawResponse.readEntity(ErrorResponse.class);
493             assertEquals("no policy found for policy: guard.minmax.scaleout:1",
494                     error.getErrorMessage());
495         }).doesNotThrowAnyException();
496     }
497
498     @Test
499     public void testReadOperationalPolicies() {
500
501         assertThatCode(() -> {
502             main = startApiService(true);
503             Response rawResponse = readResource(OPS_POLICIES_VCPE_LATEST, true);
504             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
505             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
506             assertEquals("no policy found for policy: operational.restart:null",
507                     error.getErrorMessage());
508
509             rawResponse = readResource(OPS_POLICIES_VCPE_VERSION, true);
510             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
511             error = rawResponse.readEntity(ErrorResponse.class);
512             assertEquals("no policy found for policy: operational.restart:1",
513                     error.getErrorMessage());
514
515             rawResponse = readResource(OPS_POLICIES_VDNS_LATEST, true);
516             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
517             error = rawResponse.readEntity(ErrorResponse.class);
518             assertEquals("no policy found for policy: operational.scaleout:null",
519                     error.getErrorMessage());
520
521             rawResponse = readResource(OPS_POLICIES_VDNS_VERSION, true);
522             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
523             error = rawResponse.readEntity(ErrorResponse.class);
524             assertEquals("no policy found for policy: operational.scaleout:1",
525                     error.getErrorMessage());
526
527             rawResponse = readResource(OPS_POLICIES_VFIREWALL_LATEST, true);
528             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
529             error = rawResponse.readEntity(ErrorResponse.class);
530             assertEquals("no policy found for policy: operational.modifyconfig:null",
531                     error.getErrorMessage());
532
533             rawResponse = readResource(OPS_POLICIES_VFIREWALL_VERSION, true);
534             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
535             error = rawResponse.readEntity(ErrorResponse.class);
536             assertEquals("no policy found for policy: operational.modifyconfig:1",
537                     error.getErrorMessage());
538         }).doesNotThrowAnyException();
539     }
540
541     @Test
542     public void testDeleteGuardPolicy() {
543
544         assertThatCode(() -> {
545             main = startApiService(true);
546             Response rawResponse = deleteResource(GUARD_POLICIES_VDNS_FL_VERSION, true);
547             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
548             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
549             assertEquals("no policy found for policy: guard.frequency.scaleout:1",
550                     error.getErrorMessage());
551         }).doesNotThrowAnyException();
552     }
553
554     @Test
555     public void testDeleteOperationalPolicy() {
556
557         assertThatCode(() -> {
558             main = startApiService(true);
559             Response rawResponse = deleteResource(OPS_POLICIES_VCPE_VERSION, true);
560             assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
561             ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
562             assertEquals("no policy found for policy: operational.restart:1",
563                     error.getErrorMessage());
564         }).doesNotThrowAnyException();
565     }
566
567     @Test
568     public void testHttpsCreatePolicyTypes() {
569
570         assertThatCode(() -> {
571             main = startApiService(false);
572             for (String resrcName : toscaPolicyTypeResourceNames) {
573                 Response rawResponse = createResource(POLICYTYPES, resrcName, false);
574                 assertEquals(Response.Status.OK.getStatusCode(), rawResponse.getStatus());
575                 ToscaServiceTemplate response = rawResponse.readEntity(ToscaServiceTemplate.class);
576                 assertNotNull(response);
577                 assertFalse(response.getPolicyTypes().get(0).isEmpty());
578             }
579         }).doesNotThrowAnyException();
580     }
581
582     @Test
583     public void testHttpsCreatePolicies() {
584
585         assertThatCode(() -> {
586             main = startApiService(false);
587             for (String resrcName : toscaPolicyResourceNames) {
588                 Response rawResponse = createResource(POLICYTYPES_TCA_POLICIES, resrcName, false);
589                 assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawResponse.getStatus());
590                 ErrorResponse error = rawResponse.readEntity(ErrorResponse.class);
591                 assertEquals("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist",
592                         error.getErrorMessage());
593             }
594         }).doesNotThrowAnyException();
595     }
596
597     @Test
598     public void testHttpsCreateGuardPolicies() {
599
600         assertThatCode(() -> {
601             main = startApiService(false);
602             for (String resrcName : legacyGuardPolicyResourceNames) {
603                 Response rawResponse = createGuardPolicy(GUARD_POLICIES, resrcName, false);
604                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
605             }
606         }).doesNotThrowAnyException();
607     }
608
609     @Test
610     public void testHttpsCreateOperationalPolicies() {
611
612         assertThatCode(() -> {
613             main = startApiService(false);
614             for (String resrcName : legacyOperationalPolicyResourceNames) {
615                 Response rawResponse = createOperationalPolicy(OPS_POLICIES, resrcName, false);
616                 assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawResponse.getStatus());
617             }
618         }).doesNotThrowAnyException();
619     }
620
621     private Response createResource(String endpoint, String resourceName, boolean http) throws Exception {
622
623         ToscaServiceTemplate rawServiceTemplate = standardCoder.decode(
624                 ResourceUtils.getResourceAsString(resourceName), ToscaServiceTemplate.class);
625         final Invocation.Builder invocationBuilder;
626
627         if (http) {
628             invocationBuilder = sendHttpRequest(endpoint);
629         } else {
630             invocationBuilder = sendHttpsRequest(endpoint);
631         }
632
633         Entity<ToscaServiceTemplate> entity = Entity.entity(rawServiceTemplate, MediaType.APPLICATION_JSON);
634         return invocationBuilder.post(entity);
635     }
636
637     private Response createGuardPolicy(String endpoint, String resourceName, boolean http) throws Exception {
638
639         LegacyGuardPolicyInput rawGuardPolicy = standardCoder.decode(
640                 ResourceUtils.getResourceAsString(resourceName), LegacyGuardPolicyInput.class);
641         final Invocation.Builder invocationBuilder;
642
643         if (http) {
644             invocationBuilder = sendHttpRequest(endpoint);
645         } else {
646             invocationBuilder = sendHttpsRequest(endpoint);
647         }
648
649         Entity<LegacyGuardPolicyInput> entity = Entity.entity(rawGuardPolicy, MediaType.APPLICATION_JSON);
650         return invocationBuilder.post(entity);
651     }
652
653     private Response createOperationalPolicy(String endpoint, String resourceName, boolean http) throws Exception {
654
655         LegacyOperationalPolicy rawOpsPolicy = standardCoder.decode(
656                 ResourceUtils.getResourceAsString(resourceName), LegacyOperationalPolicy.class);
657         final Invocation.Builder invocationBuilder;
658
659         if (http) {
660             invocationBuilder = sendHttpRequest(endpoint);
661         } else {
662             invocationBuilder = sendHttpsRequest(endpoint);
663         }
664
665         Entity<LegacyOperationalPolicy> entity = Entity.entity(rawOpsPolicy, MediaType.APPLICATION_JSON);
666         return invocationBuilder.post(entity);
667     }
668
669     private Response readResource(String endpoint, boolean http) throws Exception {
670
671         final Invocation.Builder invocationBuilder;
672
673         if (http) {
674             invocationBuilder = sendHttpRequest(endpoint);
675         } else {
676             invocationBuilder = sendHttpsRequest(endpoint);
677         }
678
679         return invocationBuilder.get();
680
681     }
682
683     private Response deleteResource(String endpoint, boolean http) throws Exception {
684
685         final Invocation.Builder invocationBuilder;
686
687         if (http) {
688             invocationBuilder = sendHttpRequest(endpoint);
689         } else {
690             invocationBuilder = sendHttpsRequest(endpoint);
691         }
692
693         return invocationBuilder.delete();
694     }
695
696     private Main startApiService(final boolean http) {
697
698         final String[] apiConfigParameters = new String[2];
699         if (http) {
700             apiConfigParameters[0] = "-c";
701             apiConfigParameters[1] = "parameters/ApiConfigParameters.json";
702         } else {
703             final Properties systemProps = System.getProperties();
704             systemProps.put("javax.net.ssl.keyStore", KEYSTORE);
705             systemProps.put("javax.net.ssl.keyStorePassword", "Pol1cy_0nap");
706             System.setProperties(systemProps);
707             apiConfigParameters[0] = "-c";
708             apiConfigParameters[1] = "parameters/ApiConfigParameters_Https.json";
709         }
710         return new Main(apiConfigParameters);
711     }
712
713     private void stopApiService(final Main main) throws PolicyApiException {
714
715         main.shutdown();
716     }
717
718     private Invocation.Builder sendHttpRequest(final String endpoint) throws Exception {
719
720         final ClientConfig clientConfig = new ClientConfig();
721
722         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
723         clientConfig.register(feature);
724
725         final Client client = ClientBuilder.newClient(clientConfig);
726
727         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
728         client.register(GsonMessageBodyHandler.class);
729
730         final WebTarget webTarget = client.target("http://localhost:6969/policy/api/v1/" + endpoint);
731
732         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
733
734         if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
735             throw new IllegalStateException("cannot connect to port 6969");
736         }
737         return invocationBuilder;
738     }
739
740     private Invocation.Builder sendHttpsRequest(final String endpoint) throws Exception {
741
742         final TrustManager[] noopTrustManager = new TrustManager[] { new X509TrustManager() {
743
744             @Override
745             public X509Certificate[] getAcceptedIssuers() {
746                 return new X509Certificate[0];
747             }
748
749             @Override
750             public void checkClientTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
751
752             @Override
753             public void checkServerTrusted(final java.security.cert.X509Certificate[] certs, final String authType) {}
754         } };
755
756         final SSLContext sc = SSLContext.getInstance("TLSv1.2");
757         sc.init(null, noopTrustManager, new SecureRandom());
758         final ClientBuilder clientBuilder = ClientBuilder.newBuilder().sslContext(sc).hostnameVerifier((host,
759                 session) -> true);
760         final Client client = clientBuilder.build();
761         final HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic("healthcheck", "zb!XztG34");
762         client.register(feature);
763
764         client.property(ClientProperties.METAINF_SERVICES_LOOKUP_DISABLE, "true");
765         client.register(GsonMessageBodyHandler.class);
766
767         final WebTarget webTarget = client.target("https://localhost:6969/policy/api/v1/" + endpoint);
768
769         final Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
770
771         if (!NetworkUtil.isTcpPortOpen("localhost", 6969, 6, 10000L)) {
772             throw new IllegalStateException("cannot connect to port 6969");
773         }
774         return invocationBuilder;
775     }
776
777     private void updateApiStatistics() {
778
779         ApiStatisticsManager.updateTotalApiCallCount();
780         ApiStatisticsManager.updateApiCallSuccessCount();
781         ApiStatisticsManager.updateApiCallFailureCount();
782         ApiStatisticsManager.updateTotalPolicyGetCount();
783         ApiStatisticsManager.updateTotalPolicyPostCount();
784         ApiStatisticsManager.updateTotalPolicyTypeGetCount();
785         ApiStatisticsManager.updateTotalPolicyTypePostCount();
786         ApiStatisticsManager.updatePolicyGetSuccessCount();
787         ApiStatisticsManager.updatePolicyGetFailureCount();
788         ApiStatisticsManager.updatePolicyPostSuccessCount();
789         ApiStatisticsManager.updatePolicyPostFailureCount();
790         ApiStatisticsManager.updatePolicyTypeGetSuccessCount();
791         ApiStatisticsManager.updatePolicyTypeGetFailureCount();
792         ApiStatisticsManager.updatePolicyTypePostSuccessCount();
793         ApiStatisticsManager.updatePolicyTypePostFailureCount();
794     }
795
796     private void validateStatisticsReport(final StatisticsReport report, final int code) {
797
798         assertEquals(code, report.getCode());
799     }
800
801     private void validateHealthCheckReport(final String name, final String url, final boolean healthy, final int code,
802             final String message, final HealthCheckReport report) {
803
804         assertEquals(name, report.getName());
805         assertEquals(url, report.getUrl());
806         assertEquals(healthy, report.isHealthy());
807         assertEquals(code, report.getCode());
808         assertEquals(message, report.getMessage());
809     }
810 }