2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2019-2021 Nordix Foundation.
4 * Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
5 * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * SPDX-License-Identifier: Apache-2.0
20 * ============LICENSE_END=========================================================
23 package org.onap.policy.models.provider.impl;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertTrue;
30 import java.util.ArrayList;
31 import java.util.Date;
32 import java.util.List;
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.onap.policy.models.base.PfModelException;
36 import org.onap.policy.models.pdp.concepts.Pdp;
37 import org.onap.policy.models.pdp.concepts.PdpGroup;
38 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
39 import org.onap.policy.models.pdp.concepts.PdpStatistics;
40 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
41 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
42 import org.onap.policy.models.pdp.enums.PdpState;
43 import org.onap.policy.models.provider.PolicyModelsProvider;
44 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
45 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
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.ToscaServiceTemplate;
52 * Test the database models provider implementation.
54 * @author Liam Fallon (liam.fallon@est.tech)
56 public class DatabasePolicyModelsProviderTest {
57 private static final String NAME = "name";
59 private static final String TEMPLATE_IS_NULL = "^serviceTemplate is marked .*on.*ull but is null$";
61 private static final String SUBGROUP_IS_NULL = "^pdpSubGroup is marked .*on.*ull but is null$";
63 private static final String GROUP_IS_NULL = "^pdpGroupName is marked .*on.*ull but is null$";
65 private static final String NAME_IS_NULL = "^name is marked .*on.*ull but is null$";
67 private static final String FILTER_IS_NULL = "^filter is marked .*on.*ull but is null$";
69 private static final String GROUP = "group";
71 private static final String VERSION_100 = "1.0.0";
73 private static final Date TIMESTAMP = new Date();
75 private static final String ORDER = "DESC";
77 PolicyModelsProviderParameters parameters;
80 * Initialize parameters.
83 public void setupParameters() {
84 parameters = new PolicyModelsProviderParameters();
85 parameters.setDatabaseDriver("org.h2.Driver");
86 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
87 parameters.setDatabaseUser("policy");
88 parameters.setDatabasePassword("P01icY");
89 parameters.setPersistenceUnit("ToscaConceptTest");
93 public void testInitAndClose() throws Exception {
94 assertThatThrownBy(() -> {
95 new DatabasePolicyModelsProviderImpl(null);
96 }).hasMessageMatching("^parameters is marked .*on.*ull but is null$");
98 PolicyModelsProvider databaseProvider =
99 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
101 parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
103 databaseProvider.close();
104 databaseProvider.init();
106 databaseProvider.close();
108 parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
110 parameters.setPersistenceUnit("WileECoyote");
112 assertThatThrownBy(databaseProvider::init).hasMessageContaining("could not create Data Access Object (DAO)");
114 parameters.setPersistenceUnit("ToscaConceptTest");
116 databaseProvider.init();
117 databaseProvider.close();
119 assertThatThrownBy(() -> {
120 databaseProvider.init();
121 databaseProvider.init();
122 }).hasMessage("provider is already initialized");
124 databaseProvider.close();
126 databaseProvider.close();
130 public void testProviderMethodsNull() throws Exception {
132 PolicyModelsProvider databaseProvider =
133 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
135 assertThatThrownBy(() -> {
136 databaseProvider.getFilteredPolicyTypes(null);
137 }).hasMessageMatching(FILTER_IS_NULL);
139 assertThatThrownBy(() -> {
140 databaseProvider.getFilteredPolicyTypeList(null);
141 }).hasMessageMatching(FILTER_IS_NULL);
143 assertThatThrownBy(() -> {
144 databaseProvider.createPolicyTypes(null);
145 }).hasMessageMatching(TEMPLATE_IS_NULL);
147 assertThatThrownBy(() -> {
148 databaseProvider.updatePolicyTypes(null);
149 }).hasMessageMatching(TEMPLATE_IS_NULL);
151 assertThatThrownBy(() -> {
152 databaseProvider.deletePolicyType(null, null);
153 }).hasMessageMatching(NAME_IS_NULL);
155 assertThatThrownBy(() -> {
156 databaseProvider.deletePolicyType("aaa", null);
157 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
159 assertThatThrownBy(() -> {
160 databaseProvider.deletePolicyType(null, "aaa");
161 }).hasMessageMatching(NAME_IS_NULL);
163 assertThatThrownBy(() -> {
164 databaseProvider.getFilteredPolicies(null);
165 }).hasMessageMatching(FILTER_IS_NULL);
167 assertThatThrownBy(() -> {
168 databaseProvider.getFilteredPolicyList(null);
169 }).hasMessageMatching(FILTER_IS_NULL);
171 assertThatThrownBy(() -> {
172 databaseProvider.createPolicies(null);
173 }).hasMessageMatching(TEMPLATE_IS_NULL);
175 assertThatThrownBy(() -> {
176 databaseProvider.updatePolicies(null);
177 }).hasMessageMatching(TEMPLATE_IS_NULL);
179 assertThatThrownBy(() -> {
180 databaseProvider.deletePolicy(null, null);
181 }).hasMessageMatching(NAME_IS_NULL);
183 assertThatThrownBy(() -> {
184 databaseProvider.deletePolicy(null, "aaa");
185 }).hasMessageMatching(NAME_IS_NULL);
187 assertThatThrownBy(() -> {
188 databaseProvider.deletePolicy("aaa", null);
189 }).hasMessageMatching("^version is marked .*on.*ull but is null$");
191 assertThatThrownBy(() -> {
192 databaseProvider.getFilteredPdpGroups(null);
193 }).hasMessageMatching(FILTER_IS_NULL);
195 assertThatThrownBy(() -> {
196 databaseProvider.createPdpGroups(null);
197 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
199 assertThatThrownBy(() -> {
200 databaseProvider.updatePdpGroups(null);
201 }).hasMessageMatching("^pdpGroups is marked .*on.*ull but is null$");
203 assertThatThrownBy(() -> {
204 databaseProvider.updatePdpSubGroup(null, null);
205 }).hasMessageMatching(GROUP_IS_NULL);
207 assertThatThrownBy(() -> {
208 databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
209 }).hasMessageMatching(GROUP_IS_NULL);
211 assertThatThrownBy(() -> {
212 databaseProvider.updatePdpSubGroup(NAME, null);
213 }).hasMessageMatching(SUBGROUP_IS_NULL);
215 assertThatThrownBy(() -> {
216 databaseProvider.updatePdpSubGroup(NAME, new PdpSubGroup());
217 }).hasMessage("parameter \"localName\" is null");
219 assertThatThrownBy(() -> {
220 databaseProvider.updatePdp(null, null, null);
221 }).hasMessageMatching(GROUP_IS_NULL);
223 assertThatThrownBy(() -> {
224 databaseProvider.updatePdp(null, null, new Pdp());
225 }).hasMessageMatching(GROUP_IS_NULL);
227 assertThatThrownBy(() -> {
228 databaseProvider.updatePdp(null, "sub", null);
229 }).hasMessageMatching(GROUP_IS_NULL);
231 assertThatThrownBy(() -> {
232 databaseProvider.updatePdp(null, "sub", new Pdp());
233 }).hasMessageMatching(GROUP_IS_NULL);
235 assertThatThrownBy(() -> {
236 databaseProvider.updatePdp(NAME, null, null);
237 }).hasMessageMatching(SUBGROUP_IS_NULL);
239 assertThatThrownBy(() -> {
240 databaseProvider.updatePdp(NAME, null, new Pdp());
241 }).hasMessageMatching(SUBGROUP_IS_NULL);
243 assertThatThrownBy(() -> {
244 databaseProvider.updatePdp(NAME, "sub", null);
245 }).hasMessageMatching("^pdp is marked .*on.*ull but is null$");
247 assertThatThrownBy(() -> {
248 databaseProvider.updatePdp(NAME, "sub", new Pdp());
249 }).hasMessage("parameter \"localName\" is null");
251 assertThatThrownBy(() -> {
252 databaseProvider.deletePdpGroup(null);
253 }).hasMessageMatching(NAME_IS_NULL);
255 assertThatThrownBy(() -> {
256 databaseProvider.getFilteredPdpStatistics(NAME, null, "sub", TIMESTAMP, TIMESTAMP, ORDER, 0);
257 }).hasMessageMatching(GROUP_IS_NULL);
259 assertThatThrownBy(() -> {
260 databaseProvider.createPdpStatistics(null);
261 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
263 assertThatThrownBy(() -> {
264 databaseProvider.updatePdpStatistics(null);
265 }).hasMessageMatching("^pdpStatisticsList is marked .*on.*ull but is null$");
267 assertThatThrownBy(() -> {
268 databaseProvider.deletePdpStatistics(null, TIMESTAMP);
269 }).hasMessageMatching(NAME_IS_NULL);
271 databaseProvider.close();
275 public void testProviderMethodsNotInit() throws Exception {
276 PolicyModelsProvider databaseProvider =
277 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
279 databaseProvider.close();
281 assertThatThrownBy(() -> {
282 databaseProvider.getPolicyTypes(NAME, "version");
283 }).hasMessage("policy models provider is not initilaized");
287 public void testProviderMethods() throws PfModelException {
288 PolicyModelsProvider databaseProvider =
289 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
291 assertThatThrownBy(() -> databaseProvider.getPolicyTypes(NAME, VERSION_100))
292 .hasMessage("service template not found in database");
294 assertTrue(databaseProvider.getPolicyTypeList(NAME, VERSION_100).isEmpty());
296 assertThatThrownBy(() -> databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build()))
297 .hasMessage("service template not found in database");
299 assertTrue(databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).isEmpty());
301 assertThatThrownBy(() -> {
302 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
303 }).hasMessage("no policy types specified on service template");
305 assertThatThrownBy(() -> {
306 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
307 }).hasMessage("no policy types specified on service template");
309 assertThatThrownBy(() -> databaseProvider.deletePolicyType(NAME, VERSION_100))
310 .hasMessage("service template not found in database");
312 assertThatThrownBy(() -> databaseProvider.getPolicies(NAME, VERSION_100))
313 .hasMessage("service template not found in database");
315 assertTrue(databaseProvider.getPolicyList(NAME, VERSION_100).isEmpty());
317 assertThatThrownBy(() -> databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build()))
318 .hasMessage("service template not found in database");
320 assertTrue(databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).isEmpty());
322 assertThatThrownBy(() -> {
323 databaseProvider.createPolicies(new ToscaServiceTemplate());
324 }).hasMessage("topology template not specified on service template");
326 assertThatThrownBy(() -> {
327 databaseProvider.updatePolicies(new ToscaServiceTemplate());
328 }).hasMessage("topology template not specified on service template");
330 assertThatThrownBy(() -> databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate())
331 .hasMessage("service template not found in database");
333 assertEquals(0, databaseProvider.getPdpGroups(NAME).size());
334 assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
336 assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
337 assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
339 PdpGroup pdpGroup = new PdpGroup();
340 pdpGroup.setName(GROUP);
341 pdpGroup.setVersion("1.2.3");
342 pdpGroup.setPdpGroupState(PdpState.ACTIVE);
343 pdpGroup.setPdpSubgroups(new ArrayList<>());
344 List<PdpGroup> groupList = new ArrayList<>();
345 groupList.add(pdpGroup);
347 PdpSubGroup pdpSubGroup = new PdpSubGroup();
348 pdpSubGroup.setPdpType("type");
349 pdpSubGroup.setDesiredInstanceCount(123);
350 pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
351 pdpSubGroup.getSupportedPolicyTypes().add(new ToscaConceptIdentifier("type", "7.8.9"));
352 pdpGroup.getPdpSubgroups().add(pdpSubGroup);
355 pdp.setInstanceId("type-0");
356 pdp.setMessage("Hello");
357 pdp.setPdpState(PdpState.ACTIVE);
358 pdp.setHealthy(PdpHealthStatus.UNKNOWN);
359 pdpSubGroup.setPdpInstances(new ArrayList<>());
360 pdpSubGroup.getPdpInstances().add(pdp);
362 PdpStatistics pdpStatistics = new PdpStatistics();
363 pdpStatistics.setPdpInstanceId(NAME);
364 pdpStatistics.setTimeStamp(new Date());
365 pdpStatistics.setPdpGroupName(GROUP);
366 pdpStatistics.setPdpSubGroupName("type");
367 ArrayList<PdpStatistics> statisticsArrayList = new ArrayList<>();
368 statisticsArrayList.add(pdpStatistics);
371 databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
372 assertEquals(1, databaseProvider.getPdpGroups(GROUP).size());
374 pdpSubGroup.setDesiredInstanceCount(234);
375 databaseProvider.updatePdpSubGroup(GROUP, pdpSubGroup);
377 databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
379 assertEquals("Hello", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
380 .get(0).getMessage());
381 pdp.setMessage("Howdy");
382 databaseProvider.updatePdp(GROUP, "type", pdp);
383 assertEquals("Howdy", databaseProvider.getPdpGroups(GROUP).get(0).getPdpSubgroups().get(0).getPdpInstances()
384 .get(0).getMessage());
386 assertThatThrownBy(() -> {
387 databaseProvider.deletePdpGroup(NAME);
388 }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
390 assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup(GROUP).getName());
392 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
393 assertEquals(1, databaseProvider.createPdpStatistics(statisticsArrayList).size());
394 assertEquals(1, databaseProvider.updatePdpStatistics(statisticsArrayList).size());
396 assertEquals(NAME, databaseProvider.getPdpStatistics(null, null).get(0).getPdpInstanceId());
397 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, null, ORDER, 0).get(0)
398 .getPdpInstanceId());
400 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), null, ORDER, 0).size());
401 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(null, GROUP, null, null, new Date(), ORDER, 0)
402 .get(0).getPdpInstanceId());
404 databaseProvider.getFilteredPdpStatistics(null, GROUP, null, new Date(), new Date(), ORDER, 0).size());
406 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, null, null, ORDER, 0).get(0)
407 .getPdpInstanceId());
409 databaseProvider.getFilteredPdpStatistics(NAME, GROUP, null, new Date(), new Date(), ORDER, 0).size());
411 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 0).get(0)
412 .getPdpInstanceId());
413 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 0)
416 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 1).get(0)
417 .getPdpInstanceId());
418 assertEquals(NAME, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", null, null, ORDER, 5).get(0)
419 .getPdpInstanceId());
420 assertEquals(0, databaseProvider.getFilteredPdpStatistics(NAME, GROUP, "type", new Date(), new Date(), ORDER, 5)
423 assertEquals(NAME, databaseProvider.deletePdpStatistics(NAME, null).get(0).getPdpInstanceId());
424 assertEquals(0, databaseProvider.getPdpStatistics(null, null).size());
426 databaseProvider.close();
430 public void testDeletePolicyDeployedInSubgroup() throws PfModelException {
431 List<ToscaConceptIdentifier> policies = new ArrayList<>();
433 policies.add(new ToscaConceptIdentifier("p0", "0.0.1"));
434 policies.add(new ToscaConceptIdentifier("p1", "0.0.1"));
436 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
437 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
439 PdpSubGroup subGroup = new PdpSubGroup();
440 subGroup.setPdpType("pdpType");
441 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
442 subGroup.setPolicies(policies);
444 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
445 pdpSubgroups.add(subGroup);
447 PdpGroup pdpGroup = new PdpGroup();
448 pdpGroup.setName("pdpGroup");
449 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
450 pdpGroup.setPdpSubgroups(pdpSubgroups);
452 List<PdpGroup> pdpGroups = new ArrayList<>();
453 pdpGroups.add(pdpGroup);
455 PolicyModelsProvider databaseProvider =
456 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
458 databaseProvider.createPdpGroups(pdpGroups);
460 assertThatThrownBy(() -> databaseProvider.deletePolicy("p0", "0.0.1"))
461 .hasMessageContaining("policy is in use, it is deployed in PDP group pdpGroup subgroup pdpType");
463 assertThatThrownBy(() -> databaseProvider.deletePolicy("p3", "0.0.1"))
464 .hasMessageContaining("service template not found in database");
466 databaseProvider.close();
470 public void testDeletePolicyTypeSupportedInSubgroup() throws PfModelException {
471 List<ToscaConceptIdentifier> supportedPolicyTypes = new ArrayList<>();
472 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt1", "0.0.1"));
473 supportedPolicyTypes.add(new ToscaConceptIdentifier("pt2", "0.0.1"));
475 PdpSubGroup subGroup = new PdpSubGroup();
476 subGroup.setPdpType("pdpType");
477 subGroup.setSupportedPolicyTypes(supportedPolicyTypes);
479 List<PdpSubGroup> pdpSubgroups = new ArrayList<>();
480 pdpSubgroups.add(subGroup);
482 PdpGroup pdpGroup = new PdpGroup();
483 pdpGroup.setName("pdpGroup");
484 pdpGroup.setPdpGroupState(PdpState.PASSIVE);
485 pdpGroup.setPdpSubgroups(pdpSubgroups);
487 List<PdpGroup> pdpGroups = new ArrayList<>();
488 pdpGroups.add(pdpGroup);
490 PolicyModelsProvider databaseProvider =
491 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
493 databaseProvider.createPdpGroups(pdpGroups);
495 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt2", "0.0.1"))
496 .hasMessageContaining("policy type is in use, it is referenced in PDP group pdpGroup subgroup pdpType");
498 assertThatThrownBy(() -> databaseProvider.deletePolicyType("pt0", "0.0.1"))
499 .hasMessageContaining("service template not found in database");
501 databaseProvider.close();