Fix the bug of cannot return multiple versions of particular tosca policy and policy...
[policy/models.git] / models-provider / src / test / java / org / onap / policy / models / provider / impl / DatabasePolicyModelsProviderTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.models.provider.impl;
22
23 import static org.assertj.core.api.Assertions.assertThatThrownBy;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertTrue;
27 import static org.junit.Assert.fail;
28
29 import java.util.ArrayList;
30 import java.util.Base64;
31 import java.util.List;
32
33 import org.junit.Before;
34 import org.junit.Test;
35 import org.onap.policy.models.pdp.concepts.Pdp;
36 import org.onap.policy.models.pdp.concepts.PdpGroup;
37 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
38 import org.onap.policy.models.pdp.concepts.PdpStatistics;
39 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
40 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
41 import org.onap.policy.models.pdp.enums.PdpState;
42 import org.onap.policy.models.provider.PolicyModelsProvider;
43 import org.onap.policy.models.provider.PolicyModelsProviderFactory;
44 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeFilter;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
48 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
49 import org.onap.policy.models.tosca.legacy.concepts.LegacyGuardPolicyInput;
50 import org.onap.policy.models.tosca.legacy.concepts.LegacyOperationalPolicy;
51 import org.slf4j.Logger;
52 import org.slf4j.LoggerFactory;
53
54 /**
55  * Test the database models provider implementation.
56  *
57  * @author Liam Fallon (liam.fallon@est.tech)
58  */
59 public class DatabasePolicyModelsProviderTest {
60     private static final Logger LOGGER = LoggerFactory.getLogger(DatabasePolicyModelsProviderTest.class);
61
62     PolicyModelsProviderParameters parameters;
63
64     /**
65      * Initialize parameters.
66      */
67     @Before
68     public void setupParameters() {
69         parameters = new PolicyModelsProviderParameters();
70         parameters.setDatabaseDriver("org.h2.Driver");
71         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
72         parameters.setDatabaseUser("policy");
73         parameters.setDatabasePassword(Base64.getEncoder().encodeToString("P01icY".getBytes()));
74         parameters.setPersistenceUnit("ToscaConceptTest");
75     }
76
77     @Test
78     public void testInitAndClose() throws Exception {
79         assertThatThrownBy(() -> {
80             new DatabasePolicyModelsProviderImpl(null);
81         }).hasMessage("parameters is marked @NonNull but is null");
82
83         PolicyModelsProvider databaseProvider =
84                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
85
86         parameters.setDatabaseUrl("jdbc://www.acmecorp.nonexist");
87
88         try {
89             databaseProvider.close();
90             databaseProvider.init();
91         } catch (Exception pfme) {
92             fail("test shold not throw an exception here");
93         }
94         databaseProvider.close();
95
96         parameters.setDatabaseUrl("jdbc:h2:mem:testdb");
97
98         parameters.setPersistenceUnit("WileECoyote");
99
100         assertThatThrownBy(() -> {
101             databaseProvider.init();
102         }).hasMessageContaining("could not create Data Access Object (DAO)");
103
104         parameters.setPersistenceUnit("ToscaConceptTest");
105
106         try {
107             databaseProvider.init();
108             databaseProvider.close();
109         } catch (Exception pfme) {
110             pfme.printStackTrace();
111             fail("test shold not throw an exception here");
112         }
113
114         assertThatThrownBy(() -> {
115             databaseProvider.init();
116             databaseProvider.init();
117         }).hasMessage("provider is already initialized");
118
119         try {
120             databaseProvider.close();
121         } catch (Exception pfme) {
122             fail("test shold not throw an exception here");
123         }
124
125         try {
126             databaseProvider.close();
127         } catch (Exception pfme) {
128             fail("test shold not throw an exception here");
129         }
130     }
131
132     @Test
133     public void testProviderMethodsNull() throws Exception {
134         PolicyModelsProvider databaseProvider =
135                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
136
137         assertThatThrownBy(() -> {
138             databaseProvider.getFilteredPolicyTypes(null);
139         }).hasMessage("filter is marked @NonNull but is null");
140
141         assertThatThrownBy(() -> {
142             databaseProvider.getFilteredPolicyTypeList(null);
143         }).hasMessage("filter is marked @NonNull but is null");
144
145         assertThatThrownBy(() -> {
146             databaseProvider.createPolicyTypes(null);
147         }).hasMessage("serviceTemplate is marked @NonNull but is null");
148
149         assertThatThrownBy(() -> {
150             databaseProvider.updatePolicyTypes(null);
151         }).hasMessage("serviceTemplate is marked @NonNull but is null");
152
153         assertThatThrownBy(() -> {
154             databaseProvider.deletePolicyType(null, null);
155         }).hasMessage("name is marked @NonNull but is null");
156
157         assertThatThrownBy(() -> {
158             databaseProvider.deletePolicyType("aaa", null);
159         }).hasMessage("version is marked @NonNull but is null");
160
161         assertThatThrownBy(() -> {
162             databaseProvider.deletePolicyType(null, "aaa");
163         }).hasMessage("name is marked @NonNull but is null");
164
165         assertThatThrownBy(() -> {
166             databaseProvider.getFilteredPolicies(null);
167         }).hasMessage("filter is marked @NonNull but is null");
168
169         assertThatThrownBy(() -> {
170             databaseProvider.getFilteredPolicyList(null);
171         }).hasMessage("filter is marked @NonNull but is null");
172
173         assertThatThrownBy(() -> {
174             databaseProvider.createPolicies(null);
175         }).hasMessage("serviceTemplate is marked @NonNull but is null");
176
177         assertThatThrownBy(() -> {
178             databaseProvider.updatePolicies(null);
179         }).hasMessage("serviceTemplate is marked @NonNull but is null");
180
181         assertThatThrownBy(() -> {
182             databaseProvider.deletePolicy(null, null);
183         }).hasMessage("name is marked @NonNull but is null");
184
185         assertThatThrownBy(() -> {
186             databaseProvider.deletePolicy(null, "aaa");
187         }).hasMessage("name is marked @NonNull but is null");
188
189         assertThatThrownBy(() -> {
190             databaseProvider.deletePolicy("aaa", null);
191         }).hasMessage("version is marked @NonNull but is null");
192
193         assertThatThrownBy(() -> {
194             databaseProvider.getOperationalPolicy(null, null);
195         }).hasMessage("policyId is marked @NonNull but is null");
196
197         assertThatThrownBy(() -> {
198             databaseProvider.getOperationalPolicy(null, "");
199         }).hasMessage("policyId is marked @NonNull but is null");
200
201         assertThatThrownBy(() -> {
202             databaseProvider.getOperationalPolicy("", null);
203         }).hasMessage("no policy found for policy: :null");
204
205         assertThatThrownBy(() -> {
206             databaseProvider.createOperationalPolicy(null);
207         }).hasMessage("legacyOperationalPolicy is marked @NonNull but is null");
208
209         assertThatThrownBy(() -> {
210             databaseProvider.updateOperationalPolicy(null);
211         }).hasMessage("legacyOperationalPolicy is marked @NonNull but is null");
212
213         assertThatThrownBy(() -> {
214             databaseProvider.deleteOperationalPolicy(null, null);
215         }).hasMessage("policyId is marked @NonNull but is null");
216
217         assertThatThrownBy(() -> {
218             databaseProvider.deleteOperationalPolicy(null, "");
219         }).hasMessage("policyId is marked @NonNull but is null");
220
221         assertThatThrownBy(() -> {
222             databaseProvider.deleteOperationalPolicy("", null);
223         }).hasMessage("policyVersion is marked @NonNull but is null");
224
225         assertThatThrownBy(() -> {
226             databaseProvider.getGuardPolicy(null, null);
227         }).hasMessage("policyId is marked @NonNull but is null");
228
229         assertThatThrownBy(() -> {
230             databaseProvider.getGuardPolicy(null, "");
231         }).hasMessage("policyId is marked @NonNull but is null");
232
233         assertThatThrownBy(() -> {
234             databaseProvider.getGuardPolicy("", null);
235         }).hasMessage("no policy found for policy: :null");
236
237         assertThatThrownBy(() -> {
238             databaseProvider.createGuardPolicy(null);
239         }).hasMessage("legacyGuardPolicy is marked @NonNull but is null");
240
241         assertThatThrownBy(() -> {
242             databaseProvider.updateGuardPolicy(null);
243         }).hasMessage("legacyGuardPolicy is marked @NonNull but is null");
244
245         assertThatThrownBy(() -> {
246             databaseProvider.deleteGuardPolicy(null, null);
247         }).hasMessage("policyId is marked @NonNull but is null");
248
249         assertThatThrownBy(() -> {
250             databaseProvider.deleteGuardPolicy(null, "");
251         }).hasMessage("policyId is marked @NonNull but is null");
252
253         assertThatThrownBy(() -> {
254             databaseProvider.deleteGuardPolicy("", null);
255         }).hasMessage("policyVersion is marked @NonNull but is null");
256
257         assertThatThrownBy(() -> {
258             databaseProvider.getFilteredPdpGroups(null);
259         }).hasMessage("filter is marked @NonNull but is null");
260
261         assertThatThrownBy(() -> {
262             databaseProvider.createPdpGroups(null);
263         }).hasMessage("pdpGroups is marked @NonNull but is null");
264
265         assertThatThrownBy(() -> {
266             databaseProvider.updatePdpGroups(null);
267         }).hasMessage("pdpGroups is marked @NonNull but is null");
268
269         assertThatThrownBy(() -> {
270             databaseProvider.updatePdpSubGroup(null, null);
271         }).hasMessage("pdpGroupName is marked @NonNull but is null");
272
273         assertThatThrownBy(() -> {
274             databaseProvider.updatePdpSubGroup(null, new PdpSubGroup());
275         }).hasMessage("pdpGroupName is marked @NonNull but is null");
276
277         assertThatThrownBy(() -> {
278             databaseProvider.updatePdpSubGroup("name", null);
279         }).hasMessage("pdpSubGroup is marked @NonNull but is null");
280
281         assertThatThrownBy(() -> {
282             databaseProvider.updatePdpSubGroup("name", new PdpSubGroup());
283         }).hasMessage("parameter \"localName\" is null");
284
285         assertThatThrownBy(() -> {
286             databaseProvider.updatePdp(null, null, null);
287         }).hasMessage("pdpGroupName is marked @NonNull but is null");
288
289         assertThatThrownBy(() -> {
290             databaseProvider.updatePdp(null, null, new Pdp());
291         }).hasMessage("pdpGroupName is marked @NonNull but is null");
292
293         assertThatThrownBy(() -> {
294             databaseProvider.updatePdp(null, "sub", null);
295         }).hasMessage("pdpGroupName is marked @NonNull but is null");
296
297         assertThatThrownBy(() -> {
298             databaseProvider.updatePdp(null, "sub", new Pdp());
299         }).hasMessage("pdpGroupName is marked @NonNull but is null");
300
301         assertThatThrownBy(() -> {
302             databaseProvider.updatePdp("name", null, null);
303         }).hasMessage("pdpSubGroup is marked @NonNull but is null");
304
305         assertThatThrownBy(() -> {
306             databaseProvider.updatePdp("name", null, new Pdp());
307         }).hasMessage("pdpSubGroup is marked @NonNull but is null");
308
309         assertThatThrownBy(() -> {
310             databaseProvider.updatePdp("name", "sub", null);
311         }).hasMessage("pdp is marked @NonNull but is null");
312
313         assertThatThrownBy(() -> {
314             databaseProvider.updatePdp("name", "sub", new Pdp());
315         }).hasMessage("parameter \"localName\" is null");
316
317         assertThatThrownBy(() -> {
318             databaseProvider.deletePdpGroup(null);
319         }).hasMessage("name is marked @NonNull but is null");
320
321         assertThatThrownBy(() -> {
322             databaseProvider.updatePdpStatistics(null, null, null, null);
323         }).hasMessage("pdpGroupName is marked @NonNull but is null");
324
325         assertThatThrownBy(() -> {
326             databaseProvider.updatePdpStatistics(null, null, null, new PdpStatistics());
327         }).hasMessage("pdpGroupName is marked @NonNull but is null");
328
329         assertThatThrownBy(() -> {
330             databaseProvider.updatePdpStatistics(null, null, "Instance", null);
331         }).hasMessage("pdpGroupName is marked @NonNull but is null");
332
333         assertThatThrownBy(() -> {
334             databaseProvider.updatePdpStatistics(null, null, "Instance", new PdpStatistics());
335         }).hasMessage("pdpGroupName is marked @NonNull but is null");
336
337         assertThatThrownBy(() -> {
338             databaseProvider.updatePdpStatistics(null, "type", null, null);
339         }).hasMessage("pdpGroupName is marked @NonNull but is null");
340
341         assertThatThrownBy(() -> {
342             databaseProvider.updatePdpStatistics(null, "type", null, new PdpStatistics());
343         }).hasMessage("pdpGroupName is marked @NonNull but is null");
344
345         assertThatThrownBy(() -> {
346             databaseProvider.updatePdpStatistics(null, "type", "Instance", null);
347         }).hasMessage("pdpGroupName is marked @NonNull but is null");
348
349         assertThatThrownBy(() -> {
350             databaseProvider.updatePdpStatistics(null, "type", "Instance", new PdpStatistics());
351         }).hasMessage("pdpGroupName is marked @NonNull but is null");
352
353         assertThatThrownBy(() -> {
354             databaseProvider.updatePdpStatistics("name", null, null, null);
355         }).hasMessage("pdpType is marked @NonNull but is null");
356
357         assertThatThrownBy(() -> {
358             databaseProvider.updatePdpStatistics("name", null, null, new PdpStatistics());
359         }).hasMessage("pdpType is marked @NonNull but is null");
360
361         assertThatThrownBy(() -> {
362             databaseProvider.updatePdpStatistics("name", null, "Instance", null);
363         }).hasMessage("pdpType is marked @NonNull but is null");
364
365         assertThatThrownBy(() -> {
366             databaseProvider.updatePdpStatistics("name", null, "Instance", new PdpStatistics());
367         }).hasMessage("pdpType is marked @NonNull but is null");
368
369         assertThatThrownBy(() -> {
370             databaseProvider.updatePdpStatistics("name", "type", null, null);
371         }).hasMessage("pdpInstanceId is marked @NonNull but is null");
372
373         assertThatThrownBy(() -> {
374             databaseProvider.updatePdpStatistics("name", "type", null, new PdpStatistics());
375         }).hasMessage("pdpInstanceId is marked @NonNull but is null");
376
377         assertThatThrownBy(() -> {
378             databaseProvider.updatePdpStatistics("name", "type", "Instance", null);
379         }).hasMessage("pdpStatistics is marked @NonNull but is null");
380
381         databaseProvider.updatePdpStatistics("name", "type", "Instance", new PdpStatistics());
382
383         databaseProvider.close();
384     }
385
386     @Test
387     public void testProviderMethodsNotInit() throws Exception {
388         PolicyModelsProvider databaseProvider =
389                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters);
390
391         databaseProvider.close();
392
393         assertThatThrownBy(() -> {
394             databaseProvider.getPolicyTypes("name", "version");
395         }).hasMessage("policy models provider is not initilaized");
396     }
397
398     @Test
399     public void testProviderMethods() {
400         try (PolicyModelsProvider databaseProvider =
401                 new PolicyModelsProviderFactory().createPolicyModelsProvider(parameters)) {
402
403             assertTrue(databaseProvider.getPolicyTypes("name", "1.0.0").getPolicyTypes().isEmpty());
404             assertEquals(0, databaseProvider.getPolicyTypeList("name", "1.0.0").size());
405             assertEquals(0, databaseProvider.getFilteredPolicyTypes(ToscaPolicyTypeFilter.builder().build())
406                     .getPolicyTypes().size());
407             assertEquals(0, databaseProvider.getFilteredPolicyTypeList(ToscaPolicyTypeFilter.builder().build()).size());
408
409             assertThatThrownBy(() -> {
410                 databaseProvider.createPolicyTypes(new ToscaServiceTemplate());
411             }).hasMessage("no policy types specified on service template");
412
413             assertThatThrownBy(() -> {
414                 databaseProvider.updatePolicyTypes(new ToscaServiceTemplate());
415             }).hasMessage("no policy types specified on service template");
416
417             assertTrue(databaseProvider.deletePolicyType("name", "1.0.0").getPolicyTypes().isEmpty());
418
419             assertTrue(databaseProvider.deletePolicyType("name", "1.0.0").getPolicyTypes().isEmpty());
420
421             assertTrue(
422                     databaseProvider.getPolicies("name", "1.0.0").getToscaTopologyTemplate().getPolicies().isEmpty());
423             assertEquals(0, databaseProvider.getPolicyList("name", "1.0.0").size());
424             assertEquals(0, databaseProvider.getFilteredPolicies(ToscaPolicyFilter.builder().build())
425                     .getToscaTopologyTemplate().getPolicies().size());
426             assertEquals(0, databaseProvider.getFilteredPolicyList(ToscaPolicyFilter.builder().build()).size());
427
428             assertThatThrownBy(() -> {
429                 databaseProvider.createPolicies(new ToscaServiceTemplate());
430             }).hasMessage("topology template not specified on service template");
431
432             assertThatThrownBy(() -> {
433                 databaseProvider.updatePolicies(new ToscaServiceTemplate());
434             }).hasMessage("topology template not specified on service template");
435
436             assertTrue(databaseProvider.deletePolicy("Policy", "0.0.0").getToscaTopologyTemplate().getPolicies()
437                     .isEmpty());
438
439             assertThatThrownBy(() -> {
440                 databaseProvider.getOperationalPolicy("policy_id", null);
441             }).hasMessage("no policy found for policy: policy_id:null");
442
443             assertThatThrownBy(() -> {
444                 databaseProvider.getOperationalPolicy("policy_id", "10");
445             }).hasMessage("no policy found for policy: policy_id:10");
446
447             assertThatThrownBy(() -> {
448                 databaseProvider.createOperationalPolicy(new LegacyOperationalPolicy());
449             }).hasMessage("name is marked @NonNull but is null");
450
451             assertThatThrownBy(() -> {
452                 databaseProvider.updateOperationalPolicy(new LegacyOperationalPolicy());
453             }).hasMessage("name is marked @NonNull but is null");
454
455             assertThatThrownBy(() -> {
456                 databaseProvider.deleteOperationalPolicy("policy_id", "55");
457             }).hasMessage("no policy found for policy: policy_id:55");
458
459             assertThatThrownBy(() -> {
460                 databaseProvider.getGuardPolicy("policy_id", null);
461             }).hasMessage("no policy found for policy: policy_id:null");
462
463             assertThatThrownBy(() -> {
464                 databaseProvider.getGuardPolicy("policy_id", "6");
465             }).hasMessage("no policy found for policy: policy_id:6");
466
467             assertThatThrownBy(() -> {
468                 databaseProvider.createGuardPolicy(new LegacyGuardPolicyInput());
469             }).hasMessage("policy type for guard policy \"null\" unknown");
470
471             assertThatThrownBy(() -> {
472                 databaseProvider.updateGuardPolicy(new LegacyGuardPolicyInput());
473             }).hasMessage("policy type for guard policy \"null\" unknown");
474
475             assertThatThrownBy(() -> {
476                 databaseProvider.deleteGuardPolicy("policy_id", "33");
477             }).hasMessage("no policy found for policy: policy_id:33");
478
479             assertEquals(0, databaseProvider.getPdpGroups("name").size());
480             assertEquals(0, databaseProvider.getFilteredPdpGroups(PdpGroupFilter.builder().build()).size());
481
482             assertNotNull(databaseProvider.createPdpGroups(new ArrayList<>()));
483             assertNotNull(databaseProvider.updatePdpGroups(new ArrayList<>()));
484
485             PdpGroup pdpGroup = new PdpGroup();
486             pdpGroup.setName("group");
487             pdpGroup.setVersion("1.2.3");
488             pdpGroup.setPdpGroupState(PdpState.ACTIVE);
489             pdpGroup.setPdpSubgroups(new ArrayList<>());
490             List<PdpGroup> groupList = new ArrayList<>();
491             groupList.add(pdpGroup);
492
493             PdpSubGroup pdpSubGroup = new PdpSubGroup();
494             pdpSubGroup.setPdpType("type");
495             pdpSubGroup.setDesiredInstanceCount(123);
496             pdpSubGroup.setSupportedPolicyTypes(new ArrayList<>());
497             pdpSubGroup.getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("type", "7.8.9"));
498             pdpGroup.getPdpSubgroups().add(pdpSubGroup);
499
500             Pdp pdp = new Pdp();
501             pdp.setInstanceId("type-0");
502             pdp.setMessage("Hello");
503             pdp.setPdpState(PdpState.ACTIVE);
504             pdp.setHealthy(PdpHealthStatus.UNKNOWN);
505             pdpSubGroup.setPdpInstances(new ArrayList<>());
506             pdpSubGroup.getPdpInstances().add(pdp);
507
508             assertEquals(123, databaseProvider.createPdpGroups(groupList).get(0).getPdpSubgroups().get(0)
509                     .getDesiredInstanceCount());
510             assertEquals(1, databaseProvider.getPdpGroups("group").size());
511
512             pdpSubGroup.setDesiredInstanceCount(234);
513             databaseProvider.updatePdpSubGroup("group", pdpSubGroup);
514             assertEquals(234,
515                     databaseProvider.getPdpGroups("group").get(0).getPdpSubgroups().get(0).getDesiredInstanceCount());
516
517             assertEquals("Hello", databaseProvider.getPdpGroups("group").get(0).getPdpSubgroups().get(0)
518                     .getPdpInstances().get(0).getMessage());
519             pdp.setMessage("Howdy");
520             databaseProvider.updatePdp("group", "type", pdp);
521             assertEquals("Howdy", databaseProvider.getPdpGroups("group").get(0).getPdpSubgroups().get(0)
522                     .getPdpInstances().get(0).getMessage());
523
524             assertThatThrownBy(() -> {
525                 databaseProvider.deletePdpGroup("name");
526             }).hasMessage("delete of PDP group \"name:0.0.0\" failed, PDP group does not exist");
527
528             assertEquals(pdpGroup.getName(), databaseProvider.deletePdpGroup("group").getName());
529
530             assertEquals(0, databaseProvider.getPdpStatistics(null).size());
531
532             databaseProvider.updatePdpStatistics("group", "type", "type-0", new PdpStatistics());
533         } catch (Exception exc) {
534             LOGGER.warn("test should not throw an exception", exc);
535             fail("test should not throw an exception");
536         }
537     }
538 }