Added the new versioning validation for policy and policy type
[policy/api.git] / main / src / test / java / org / onap / policy / api / main / rest / provider / TestPolicyTypeProvider.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP Policy API
4  * ================================================================================
5  * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2019 Nordix Foundation.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * SPDX-License-Identifier: Apache-2.0
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.policy.api.main.rest.provider;
25
26 import static org.assertj.core.api.Assertions.assertThatThrownBy;
27 import static org.junit.Assert.assertFalse;
28
29 import java.util.Base64;
30 import java.util.Collections;
31
32 import org.junit.AfterClass;
33 import org.junit.BeforeClass;
34 import org.junit.Test;
35 import org.onap.policy.api.main.parameters.ApiParameterGroup;
36 import org.onap.policy.common.parameters.ParameterService;
37 import org.onap.policy.common.utils.coder.StandardYamlCoder;
38 import org.onap.policy.common.utils.resources.ResourceUtils;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
42
43 /**
44  * This class performs unit test of {@link PolicyTypeProvider}.
45  *
46  * @author Chenfei Gao (cgao@research.att.com)
47  */
48 public class TestPolicyTypeProvider {
49
50     private static PolicyTypeProvider policyTypeProvider;
51     private static PolicyProvider policyProvider;
52     private static PolicyModelsProviderParameters providerParams;
53     private static ApiParameterGroup apiParamGroup;
54     private static StandardYamlCoder standardYamlCoder;
55
56     private static final String POLICY_RESOURCE = "policies/vCPE.policy.monitoring.input.tosca.yaml";
57     private static final String POLICY_TYPE_RESOURCE = "policytypes/onap.policies.monitoring.cdap.tca.hi.lo.app.yaml";
58     private static final String POLICY_TYPE_RESOURCE_WITH_NO_VERSION =
59             "policytypes/onap.policies.optimization.Resource.no.version.yaml";
60     private static final String POLICY_TYPE_NAME = "onap.policies.monitoring.cdap.tca.hi.lo.app";
61     private static final String POLICY_TYPE_VERSION = "1.0.0";
62
63     /**
64      * Initializes parameters.
65      *
66      * @throws PfModelException the PfModel parsing exception
67      */
68     @BeforeClass
69     public static void setupParameters() throws PfModelException {
70
71         standardYamlCoder = new StandardYamlCoder();
72         providerParams = new PolicyModelsProviderParameters();
73         providerParams.setDatabaseDriver("org.h2.Driver");
74         providerParams.setDatabaseUrl("jdbc:h2:mem:testdb");
75         providerParams.setDatabaseUser("policy");
76         providerParams.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
77         providerParams.setPersistenceUnit("ToscaConceptTest");
78         apiParamGroup = new ApiParameterGroup("ApiGroup", null, providerParams, Collections.emptyList());
79         ParameterService.register(apiParamGroup, true);
80         policyTypeProvider = new PolicyTypeProvider();
81         policyProvider = new PolicyProvider();
82     }
83
84     /**
85      * Closes up DB connections and deregisters API parameter group.
86      *
87      * @throws PfModelException the PfModel parsing exception
88      */
89     @AfterClass
90     public static void tearDown() throws PfModelException {
91
92         policyTypeProvider.close();
93         policyProvider.close();
94         ParameterService.deregister(apiParamGroup);
95     }
96
97     @Test
98     public void testFetchPolicyTypes() throws Exception {
99
100         ToscaServiceTemplate serviceTemplate = policyTypeProvider.fetchPolicyTypes(null, null);
101         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
102
103         assertThatThrownBy(() -> {
104             policyTypeProvider.fetchPolicyTypes("dummy", null);
105         }).hasMessage("policy type with ID dummy:null does not exist");
106
107         assertThatThrownBy(() -> {
108             policyTypeProvider.fetchPolicyTypes("dummy", "dummy");
109         }).hasMessage("policy type with ID dummy:dummy does not exist");
110     }
111
112     @Test
113     public void testFetchLatestPolicyTypes() {
114
115         assertThatThrownBy(() -> {
116             policyTypeProvider.fetchLatestPolicyTypes("dummy");
117         }).hasMessage("policy type with ID dummy:null does not exist");
118     }
119
120     @Test
121     public void testCreatePolicyType() throws Exception {
122
123         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
124                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
125         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
126         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
127
128         String errorMessage = "policy type onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 already exists; "
129                 + "its latest version is 1.0.0";
130         assertThatThrownBy(() -> {
131             ToscaServiceTemplate duplicatePolicyType = standardYamlCoder.decode(
132                     ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
133             policyTypeProvider.createPolicyType(duplicatePolicyType);
134         }).hasMessage(errorMessage);
135
136         assertThatThrownBy(() -> {
137             ToscaServiceTemplate badPolicyType = standardYamlCoder.decode(ResourceUtils.getResourceAsString(
138                     POLICY_TYPE_RESOURCE_WITH_NO_VERSION), ToscaServiceTemplate.class);
139             policyTypeProvider.createPolicyType(badPolicyType);
140         }).hasMessage("mandatory 'version' field is missing in policy types: onap.policies.optimization.Resource");
141
142         policyTypeProvider.deletePolicyType(POLICY_TYPE_NAME, POLICY_TYPE_VERSION);
143     }
144
145     @Test
146     public void testDeletePolicyType() throws Exception {
147
148         ToscaServiceTemplate policyTypeServiceTemplate = standardYamlCoder.decode(
149                 ResourceUtils.getResourceAsString(POLICY_TYPE_RESOURCE), ToscaServiceTemplate.class);
150         ToscaServiceTemplate serviceTemplate = policyTypeProvider.createPolicyType(policyTypeServiceTemplate);
151         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
152
153         ToscaServiceTemplate policyServiceTemplate = standardYamlCoder.decode(
154                 ResourceUtils.getResourceAsString(POLICY_RESOURCE), ToscaServiceTemplate.class);
155         policyProvider.createPolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", policyServiceTemplate);
156
157         String exceptionMessage = "policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 "
158                 + "cannot be deleted as it is parameterized by policies onap.restart.tca:1.0.0";
159         assertThatThrownBy(() -> {
160             policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
161         }).hasMessage(exceptionMessage);
162
163         serviceTemplate = policyProvider
164                 .deletePolicy("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0", "onap.restart.tca", "1.0.0");
165         assertFalse(serviceTemplate.getToscaTopologyTemplate().getPolicies().get(0).isEmpty());
166
167         serviceTemplate =
168                 policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
169         assertFalse(serviceTemplate.getPolicyTypes().isEmpty());
170
171         assertThatThrownBy(() -> {
172             policyTypeProvider.deletePolicyType("onap.policies.monitoring.cdap.tca.hi.lo.app", "1.0.0");
173         }).hasMessage("policy type with ID onap.policies.monitoring.cdap.tca.hi.lo.app:1.0.0 does not exist");
174     }
175 }