2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2020 Nordix Foundation.
4 * Modifications 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
10 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.models.provider.impl;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertTrue;
28 import static org.junit.Assert.fail;
30 import java.util.ArrayList;
31 import java.util.Base64;
32 import java.util.Date;
33 import java.util.List;
35 import org.junit.Before;
36 import org.junit.Test;
37 import org.onap.policy.models.pdp.concepts.Pdp;
38 import org.onap.policy.models.pdp.concepts.PdpGroup;
39 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
40 import org.onap.policy.models.pdp.concepts.PdpStatistics;
41 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
42 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
43 import org.onap.policy.models.pdp.enums.PdpState;
44 import org.onap.policy.models.provider.PolicyModelsProvider;
45 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
46 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
51 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
52 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
57 * Test the database models provider implementation.
59 * @author Liam Fallon (liam.fallon@est.tech)
61 public class DatabasePolicyModelsProviderTest {
62 private static final String NAME = "name";
64 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
66 private static final String POLICY_ID_IS_NULL = "^policyId is marked .*on.*ull but is null$";
68 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
70 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
72 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
74 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
76 private static final String POLICY_ID = "policy_id";
78 private static final String GROUP = "group";
80 private static final String VERSION_100 = "1.0.0";
82 private static final Date TIMESTAMP = new Date();
84 private static final Logger LOGGER = LoggerFactory.getLogger(DatabasePolicyModelsProviderTest.class);
86 PolicyModelsProviderParameters parameters;
89 * Initialize parameters.
92 public void setupParameters() {
93 parameters = new PolicyModelsProviderParameters();
94 parameters.setDatabaseDriver("org.h2.Driver");
95 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
96 parameters.setDatabaseUser("policy");
97 parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
98 parameters.setPersistenceUnit("ToscaConceptTest");
102 public void testInitAndClose() throws Exception {
103 assertThatThrownBy(() -> {
104 new DatabasePolicyModelsProviderImpl(null);
105 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
107 PolicyModelsProvider databaseProvider =
108 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
110 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
112 databaseProvider.close();
113 databaseProvider.init();
115 databaseProvider.close();
117 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
119 parameters.setPersistenceUnit("WileECoyote");
121 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
123 parameters.setPersistenceUnit("ToscaConceptTest");
125 databaseProvider.init();
126 databaseProvider.close();
128 assertThatThrownBy(() -> {
129 databaseProvider.init();
130 databaseProvider.init();
131 }).hasMessage("provider is already initialized");
133 databaseProvider.close();
135 databaseProvider.close();
139 public void testProviderMethodsNull() throws Exception {
141 try (PolicyModelsProvider databaseProvider =
142 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
144 assertThatThrownBy(() -> {
145 databaseProvider.getFilteredPolicyTypes(null);
146 }).hasMessageMatching(FILTER_IS_NULL);
148 assertThatThrownBy(() -> {
149 databaseProvider.getFilteredPolicyTypeList(null);
150 }).hasMessageMatching(FILTER_IS_NULL);
152 assertThatThrownBy(() -> {
153 databaseProvider.createPolicyTypes(null);
154 }).hasMessageMatching(TEMPLATE_IS_NULL);
156 assertThatThrownBy(() -> {
157 databaseProvider.updatePolicyTypes(null);
158 }).hasMessageMatching(TEMPLATE_IS_NULL);
160 assertThatThrownBy(() -> {
161 databaseProvider.deletePolicyType(null, null);
162 }).hasMessageMatching(NAME_IS_NULL);
164 assertThatThrownBy(() -> {
165 databaseProvider.deletePolicyType("aaa", null);
166 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
168 assertThatThrownBy(() -> {
169 databaseProvider.deletePolicyType(null, "aaa");
170 }).hasMessageMatching(NAME_IS_NULL);
172 assertThatThrownBy(() -> {
173 databaseProvider.getFilteredPolicies(null);
174 }).hasMessageMatching(FILTER_IS_NULL);
176 assertThatThrownBy(() -> {
177 databaseProvider.getFilteredPolicyList(null);
178 }).hasMessageMatching(FILTER_IS_NULL);
180 assertThatThrownBy(() -> {
181 databaseProvider.createPolicies(null);
182 }).hasMessageMatching(TEMPLATE_IS_NULL);
184 assertThatThrownBy(() -> {
185 databaseProvider.updatePolicies(null);
186 }).hasMessageMatching(TEMPLATE_IS_NULL);
188 assertThatThrownBy(() -> {
189 databaseProvider.deletePolicy(null, null);
190 }).hasMessageMatching(NAME_IS_NULL);
192 assertThatThrownBy(() -> {
193 databaseProvider.deletePolicy(null, "aaa");
194 }).hasMessageMatching(NAME_IS_NULL);
196 assertThatThrownBy(() -> {
197 databaseProvider.deletePolicy("aaa", null);
198 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
200 assertThatThrownBy(() -> {
201 databaseProvider.getOperationalPolicy(null, null);
202 }).hasMessageMatching(POLICY_ID_IS_NULL);
204 assertThatThrownBy(() -> {
205 databaseProvider.getOperationalPolicy(null, "");
206 }).hasMessageMatching(POLICY_ID_IS_NULL);
208 assertThatThrownBy(() -> {
209 databaseProvider.getOperationalPolicy("", null);
210 }).hasMessage("no policy found for policy: :null");
212 assertThatThrownBy(() -> {
213 databaseProvider.createOperationalPolicy(null);
214 }).hasMessageMatching("^legacyOperationalPolicy is marked .*on.*ull but is null$");
216 assertThatThrownBy(() -> {
217 databaseProvider.updateOperationalPolicy(null);
218 }).hasMessageMatching("^legacyOperationalPolicy is marked .*on.*ull but is null$");
220 assertThatThrownBy(() -> {
221 databaseProvider.deleteOperationalPolicy(null, null);
222 }).hasMessageMatching(POLICY_ID_IS_NULL);
224 assertThatThrownBy(() -> {
225 databaseProvider.deleteOperationalPolicy(null, "");
226 }).hasMessageMatching(POLICY_ID_IS_NULL);
228 assertThatThrownBy(() -> {
229 databaseProvider.deleteOperationalPolicy("", null);
230 }).hasMessageMatching("^policyVersion is marked .*on.*ull but is null$");
232 assertThatThrownBy(() -> {
233 databaseProvider.getGuardPolicy(null, null);
234 }).hasMessageMatching(POLICY_ID_IS_NULL);
236 assertThatThrownBy(() -> {
237 databaseProvider.getGuardPolicy(null, "");
238 }).hasMessageMatching(POLICY_ID_IS_NULL);
240 assertThatThrownBy(() -> {
241 databaseProvider.getGuardPolicy("", null);
242 }).hasMessage("no policy found for policy: :null");
244 assertThatThrownBy(() -> {
245 databaseProvider.createGuardPolicy(null);
246 }).hasMessageMatching("^legacyGuardPolicy is marked .*on.*ull but is null$");
248 assertThatThrownBy(() -> {
249 databaseProvider.updateGuardPolicy(null);
250 }).hasMessageMatching("^legacyGuardPolicy is marked .*on.*ull but is null$");
252 assertThatThrownBy(() -> {
253 databaseProvider.deleteGuardPolicy(null, null);
254 }).hasMessageMatching(POLICY_ID_IS_NULL);
256 assertThatThrownBy(() -> {
257 databaseProvider.deleteGuardPolicy(null, "");
258 }).hasMessageMatching(POLICY_ID_IS_NULL);
260 assertThatThrownBy(() -> {
261 databaseProvider.deleteGuardPolicy("", null);
262 }).hasMessageMatching("^policyVersion is marked .*on.*ull but is null$");
264 assertThatThrownBy(() -> {
265 databaseProvider.getFilteredPdpGroups(null);
266 }).hasMessageMatching(FILTER_IS_NULL);
268 assertThatThrownBy(() -> {
269 databaseProvider.createPdpGroups(null);
270 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
272 assertThatThrownBy(() -> {
273 databaseProvider.updatePdpGroups(null);
274 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
276 assertThatThrownBy(() -> {
277 databaseProvider.updatePdpSubGroup(null, null);
278 }).hasMessageMatching(GROUP_IS_NULL);
280 assertThatThrownBy(() -> {
281 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
282 }).hasMessageMatching(GROUP_IS_NULL);
284 assertThatThrownBy(() -> {
285 databaseProvider.updatePdpSubGroup(NAME, null);
286 }).hasMessageMatching(SUBGROUP_IS_NULL);
288 assertThatThrownBy(() -> {
289 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
290 }).hasMessage("parameter \"localName\" is null");
292 assertThatThrownBy(() -> {
293 databaseProvider.updatePdp(null, null, null);
294 }).hasMessageMatching(GROUP_IS_NULL);
296 assertThatThrownBy(() -> {
297 databaseProvider.updatePdp(null, null, new Pdp());
298 }).hasMessageMatching(GROUP_IS_NULL);
300 assertThatThrownBy(() -> {
301 databaseProvider.updatePdp(null, "sub", null);
302 }).hasMessageMatching(GROUP_IS_NULL);
304 assertThatThrownBy(() -> {
305 databaseProvider.updatePdp(null, "sub", new Pdp());
306 }).hasMessageMatching(GROUP_IS_NULL);
308 assertThatThrownBy(() -> {
309 databaseProvider.updatePdp(NAME, null, null);
310 }).hasMessageMatching(SUBGROUP_IS_NULL);
312 assertThatThrownBy(() -> {
313 databaseProvider.updatePdp(NAME, null, new Pdp());
314 }).hasMessageMatching(SUBGROUP_IS_NULL);
316 assertThatThrownBy(() -> {
317 databaseProvider.updatePdp(NAME, "sub", null);
318 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
320 assertThatThrownBy(() -> {
321 databaseProvider.updatePdp(NAME, "sub", new Pdp());
322 }).hasMessage("parameter \"localName\" is null");
324 assertThatThrownBy(() -> {
325 databaseProvider.deletePdpGroup(null);
326 }).hasMessageMatching(NAME_IS_NULL);
328 assertThatThrownBy(() -> {
329 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP);
330 }).hasMessageMatching(GROUP_IS_NULL);
332 assertThatThrownBy(() -> {
333 databaseProvider.createPdpStatistics(null);
334 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
336 assertThatThrownBy(() -> {
337 databaseProvider.updatePdpStatistics(null);
338 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
340 assertThatThrownBy(() -> {
341 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
342 }).hasMessageMatching(NAME_IS_NULL);
348 public void testProviderMethodsNotInit() throws Exception {
349 PolicyModelsProvider databaseProvider =
350 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
352 databaseProvider.close();
354 assertThatThrownBy(() -> {
355 databaseProvider.getPolicyTypes(NAME, "version");
356 }).hasMessage("policy models provider is not initilaized");
360 public void testProviderMethods() {
361 try (PolicyModelsProvider databaseProvider =
362 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
364 assertTrue(databaseProvider.getPolicyTypes(NAME, VERSION_100).getPolicyTypes().isEmpty());
365 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
366 assertEquals(0, databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build())
367 .getPolicyTypes().size());
368 assertEquals(0, databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).size());
370 assertThatThrownBy(() -> {
371 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
372 }).hasMessage("no policy types specified on service template");
374 assertThatThrownBy(() -> {
375 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
376 }).hasMessage("no policy types specified on service template");
378 assertTrue(databaseProvider.deletePolicyType(NAME, VERSION_100).getPolicyTypes().isEmpty());
380 assertTrue(databaseProvider.deletePolicyType(NAME, VERSION_100).getPolicyTypes().isEmpty());
383 databaseProvider.getPolicies(NAME, VERSION_100).getToscaTopologyTemplate().getPolicies().isEmpty());
384 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
385 assertEquals(0, databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build())
386 .getToscaTopologyTemplate().getPolicies().size());
387 assertEquals(0, databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).size());
389 assertThatThrownBy(() -> {
390 databaseProvider.createPolicies(new ToscaServiceTemplate());
391 }).hasMessage("topology template not specified on service template");
393 assertThatThrownBy(() -> {
394 databaseProvider.updatePolicies(new ToscaServiceTemplate());
395 }).hasMessage("topology template not specified on service template");
397 assertTrue(databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate().getPolicies()
400 assertThatThrownBy(() -> {
401 databaseProvider.getOperationalPolicy(POLICY_ID, null);
402 }).hasMessage("no policy found for policy: policy_id:null");
404 assertThatThrownBy(() -> {
405 databaseProvider.getOperationalPolicy(POLICY_ID, "10");
406 }).hasMessage("no policy found for policy: policy_id:10");
408 assertThatThrownBy(() -> {
409 databaseProvider.createOperationalPolicy(new LegacyOperationalPolicy());
410 }).hasMessageMatching(NAME_IS_NULL);
412 assertThatThrownBy(() -> {
413 databaseProvider.updateOperationalPolicy(new LegacyOperationalPolicy());
414 }).hasMessageMatching(NAME_IS_NULL);
416 assertThatThrownBy(() -> {
417 databaseProvider.deleteOperationalPolicy(POLICY_ID, "55");
418 }).hasMessage("no policy found for policy: policy_id:55");
420 assertThatThrownBy(() -> {
421 databaseProvider.getGuardPolicy(POLICY_ID, null);
422 }).hasMessage("no policy found for policy: policy_id:null");
424 assertThatThrownBy(() -> {
425 databaseProvider.getGuardPolicy(POLICY_ID, "6");
426 }).hasMessage("no policy found for policy: policy_id:6");
428 assertThatThrownBy(() -> {
429 databaseProvider.createGuardPolicy(new LegacyGuardPolicyInput());
430 }).hasMessage("policy type for guard policy \"null\" unknown");
432 assertThatThrownBy(() -> {
433 databaseProvider.updateGuardPolicy(new LegacyGuardPolicyInput());
434 }).hasMessage("policy type for guard policy \"null\" unknown");
436 assertThatThrownBy(() -> {
437 databaseProvider.deleteGuardPolicy(POLICY_ID, "33");
438 }).hasMessage("no policy found for policy: policy_id:33");
440 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
441 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
443 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
444 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
446 PdpGroup pdpGroup = new PdpGroup();
447 pdpGroup.setName(GROUP);
448 pdpGroup.setVersion("1.2.3");
449 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
450 pdpGroup.setPdpSubgroups(new ArrayList<>());
451 List<PdpGroup> groupList = new ArrayList<>();
452 groupList.add(pdpGroup);
454 PdpSubGroup pdpSubGroup = new PdpSubGroup();
455 pdpSubGroup.setPdpType("type");
456 pdpSubGroup.setDesiredInstanceCount(123);
457 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
458 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("type", "7.8.9"));
459 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
462 pdp.setInstanceId("type-0");
463 pdp.setMessage("Hello");
464 pdp.setPdpState(PdpState.ACTIVE);
465 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
466 pdpSubGroup.setPdpInstances(new ArrayList<>());
467 pdpSubGroup.getPdpInstances().add(pdp);
469 PdpStatistics pdpStatistics = new PdpStatistics();
470 pdpStatistics.setPdpInstanceId("Pdp1");
471 pdpStatistics.setTimeStamp(new Date());
472 pdpStatistics.setPdpGroupName("DefaultGroup");
473 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
474 statisticsArrayList.add(pdpStatistics);
476 assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
477 .getDesiredInstanceCount());
478 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
480 pdpSubGroup.setDesiredInstanceCount(234);
481 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
483 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
485 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
486 .get(0).getMessage());
487 pdp.setMessage("Howdy");
488 databaseProvider.updatePdp(GROUP, "type", pdp);
489 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
490 .get(0).getMessage());
492 assertThatThrownBy(() -> {
493 databaseProvider.deletePdpGroup(NAME);
494 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
496 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
498 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
500 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, null);
501 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), null);
502 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, new Date());
503 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date());
505 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null);
506 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date());
508 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null);
509 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date());
511 databaseProvider.createPdpStatistics(statisticsArrayList);
512 databaseProvider.updatePdpStatistics(statisticsArrayList);
514 databaseProvider.deletePdpStatistics("pdp1", null);
515 } catch (Exception exc) {
516 LOGGER.warn("test should not throw an exception", exc);
517 fail("test should not throw an exception");