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