2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.models.pap.persistence.provider;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertThrows;
28 import static org.junit.Assert.assertTrue;
30 import java.time.Instant;
31 import java.time.temporal.ChronoUnit;
32 import java.util.ArrayList;
33 import java.util.List;
34 import java.util.Properties;
35 import java.util.concurrent.TimeUnit;
36 import org.awaitility.Awaitility;
37 import org.eclipse.persistence.config.PersistenceUnitProperties;
38 import org.junit.After;
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.onap.policy.models.base.PfModelRuntimeException;
42 import org.onap.policy.models.dao.DaoParameters;
43 import org.onap.policy.models.dao.PfDao;
44 import org.onap.policy.models.dao.PfDaoFactory;
45 import org.onap.policy.models.dao.impl.DefaultPfDao;
46 import org.onap.policy.models.pap.concepts.PolicyAudit;
47 import org.onap.policy.models.pap.concepts.PolicyAudit.AuditAction;
48 import org.onap.policy.models.pap.persistence.provider.PolicyAuditProvider.AuditFilter;
49 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
52 * Class for unit testing {@link PolicyAuditProvider}.
54 * @author Adheli Tavares (adheli.tavares@est.tech)
57 public class PolicyAuditProviderTest {
59 private static final String FIELD_IS_NULL = "%s is marked .*ull but is null";
60 private static final String GROUP_A = "groupA";
61 private static final String GROUP_B = "groupB";
62 private static final ToscaConceptIdentifier MY_POLICY = new ToscaConceptIdentifier("MyPolicy", "1.2.3");
63 private static final ToscaConceptIdentifier MY_POLICY2 = new ToscaConceptIdentifier("MyPolicyB", "2.3.4");
64 private static final Integer NUMBER_RECORDS = 10;
69 * Set up the DAO towards the database.
71 * @throws Exception on database errors
74 public void setupDao() throws Exception {
75 final DaoParameters daoParameters = new DaoParameters();
76 daoParameters.setPluginClass(DefaultPfDao.class.getName());
78 daoParameters.setPersistenceUnit("ToscaConceptTest");
80 Properties jdbcProperties = new Properties();
81 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy");
82 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY");
84 if (System.getProperty("USE-MARIADB") != null) {
85 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.mariadb.jdbc.Driver");
86 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:mariadb://localhost:3306/policy");
88 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver");
89 jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:h2:mem:PolicyAuditProviderTest");
92 daoParameters.setJdbcProperties(jdbcProperties);
94 pfDao = new PfDaoFactory().createPfDao(daoParameters);
95 pfDao.init(daoParameters);
99 public void teardown() {
104 public void testCreatePolicyAudit() {
105 PolicyAuditProvider provider = new PolicyAuditProvider();
107 Instant date = Instant.now();
108 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_A, MY_POLICY));
110 List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS);
111 assertThat(records).hasSize(2);
113 // as the start date is 10 min ahead of first record, shouldn't return any records
114 List<PolicyAudit> emptyList = provider.getAuditRecords(pfDao,
115 AuditFilter.builder().fromDate(Instant.now().plusSeconds(600)).build(), 600);
116 assertThat(emptyList).isEmpty();
120 public void testCreatePolicyAuditInvalid() {
121 PolicyAuditProvider provider = new PolicyAuditProvider();
123 List<PolicyAudit> audits = List.of(PolicyAudit.builder().pdpType("pdpType").action(AuditAction.DEPLOYMENT)
124 .timestamp(Instant.now()).build());
126 assertThrows(PfModelRuntimeException.class, () -> provider.createAuditRecords(pfDao, audits));
128 List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS);
129 assertThat(records).isEmpty();
133 public void testFilters() {
134 PolicyAuditProvider provider = new PolicyAuditProvider();
136 Instant date = Instant.now().truncatedTo(ChronoUnit.SECONDS);
137 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_A, MY_POLICY));
138 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY));
139 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY2));
140 Awaitility.await().pollDelay(3, TimeUnit.SECONDS).until(() -> {
144 List<PolicyAudit> records = provider.getAuditRecords(pfDao,
145 AuditFilter.builder().fromDate(date).toDate(Instant.now()).recordNum(NUMBER_RECORDS).build());
146 assertThat(records).hasSize(6);
148 List<PolicyAudit> recordsWithGroupB =
149 provider.getAuditRecords(pfDao,
150 AuditFilter.builder().pdpGroup(GROUP_B).recordNum(NUMBER_RECORDS).build());
151 assertThat(recordsWithGroupB).hasSize(4);
153 List<PolicyAudit> recordsWithActionDeploy = provider.getAuditRecords(pfDao,
154 AuditFilter.builder().action(AuditAction.DEPLOYMENT).recordNum(NUMBER_RECORDS).build());
155 assertThat(recordsWithActionDeploy).hasSize(3);
157 List<PolicyAudit> recordsWithMyPolicy = provider.getAuditRecords(pfDao,
158 AuditFilter.builder().name(MY_POLICY.getName()).version(MY_POLICY.getVersion())
159 .recordNum(NUMBER_RECORDS).build());
160 assertThat(recordsWithMyPolicy).hasSize(4);
164 public void testFiltersOld() {
165 PolicyAuditProvider provider = new PolicyAuditProvider();
167 Instant date = Instant.now().truncatedTo(ChronoUnit.SECONDS);
168 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_A, MY_POLICY));
169 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY));
170 provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY2));
171 Awaitility.await().pollDelay(3, TimeUnit.SECONDS).until(() -> {
175 List<PolicyAudit> records = provider.getAuditRecords(pfDao,
176 AuditFilter.builder().fromDate(date).toDate(Instant.now()).build(), NUMBER_RECORDS);
177 assertThat(records).hasSize(6);
179 List<PolicyAudit> recordsWithGroupB =
180 provider.getAuditRecords(pfDao, AuditFilter.builder().pdpGroup(GROUP_B).build(), NUMBER_RECORDS);
181 assertThat(recordsWithGroupB).hasSize(4);
183 List<PolicyAudit> recordsWithActionDeploy = provider.getAuditRecords(pfDao,
184 AuditFilter.builder().action(AuditAction.DEPLOYMENT).build(), NUMBER_RECORDS);
185 assertThat(recordsWithActionDeploy).hasSize(3);
187 List<PolicyAudit> recordsWithMyPolicy = provider.getAuditRecords(pfDao,
188 AuditFilter.builder().name(MY_POLICY.getName()).version(MY_POLICY.getVersion()).build(),
190 assertThat(recordsWithMyPolicy).hasSize(4);
194 public void testLoadRecordsForLimit() {
195 PolicyAuditProvider provider = new PolicyAuditProvider();
197 List<PolicyAudit> loadAudits = new ArrayList<>();
199 // going to create 102 records.
200 for (int i = 0; i <= 50; i++) {
201 loadAudits.addAll(generatePolicyAudits(Instant.now().plusSeconds(i), GROUP_A, MY_POLICY));
204 provider.createAuditRecords(pfDao, loadAudits);
206 List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS);
207 assertThat(records).hasSize(10);
209 // check that is being ordered
210 assertTrue(records.get(0).getTimestamp().isAfter(records.get(9).getTimestamp()));
211 assertEquals(loadAudits.get(loadAudits.size() - 1).getTimestamp(), records.get(0).getTimestamp());
213 // try to get 102 records should return 100
214 records = provider.getAuditRecords(pfDao, 102);
215 assertThat(records).hasSize(100);
219 public void policyProviderExceptions() {
220 PolicyAuditProvider provider = new PolicyAuditProvider();
222 assertThatThrownBy(() -> {
223 provider.createAuditRecords(null, null);
224 }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao"));
226 assertThatThrownBy(() -> {
227 provider.createAuditRecords(pfDao, null);
228 }).hasMessageMatching(String.format(FIELD_IS_NULL, "audits"));
230 assertThatThrownBy(() -> {
231 provider.getAuditRecords(null, NUMBER_RECORDS);
232 }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao"));
234 assertThatThrownBy(() -> {
235 provider.getAuditRecords(pfDao, (Integer) null);
236 }).hasMessageMatching(String.format(FIELD_IS_NULL, "numRecords"));
238 assertThatThrownBy(() -> {
239 provider.getAuditRecords(null, AuditFilter.builder().build(), NUMBER_RECORDS);
240 }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao"));
242 assertThatThrownBy(() -> {
243 provider.getAuditRecords(pfDao, AuditFilter.builder().build(), null);
244 }).hasMessageMatching(String.format(FIELD_IS_NULL, "numRecords"));
246 assertThatThrownBy(() -> {
247 provider.getAuditRecords(pfDao, null, NUMBER_RECORDS);
248 }).hasMessageMatching(String.format(FIELD_IS_NULL, "auditFilter"));
252 public void testAuditFiltersIsEmpty() {
253 AuditFilter emptyFilter = AuditFilter.builder().build();
254 assertTrue(emptyFilter.isEmpty());
256 AuditFilter stringsEmpty =
257 AuditFilter.builder().action(AuditAction.DEPLOYMENT).fromDate(Instant.MIN).toDate(Instant.MAX).build();
258 assertFalse(stringsEmpty.isEmpty());
260 AuditFilter filter = AuditFilter.builder().fromDate(Instant.MIN).toDate(Instant.MAX).build();
261 assertFalse(filter.isEmpty());
262 filter = AuditFilter.builder().fromDate(Instant.MIN).build();
263 assertFalse(filter.isEmpty());
264 filter = AuditFilter.builder().toDate(Instant.MAX).build();
265 assertFalse(filter.isEmpty());
266 filter = AuditFilter.builder().name("myPolicy").toDate(Instant.MAX).build();
267 assertFalse(filter.isEmpty());
270 private List<PolicyAudit> generatePolicyAudits(Instant date, String group, ToscaConceptIdentifier policy) {
272 PolicyAudit deploy = PolicyAudit.builder()
276 .action(AuditAction.DEPLOYMENT)
277 .timestamp(date.truncatedTo(ChronoUnit.SECONDS))
280 PolicyAudit undeploy = PolicyAudit.builder()
284 .action(AuditAction.UNDEPLOYMENT)
285 .timestamp(date.plusSeconds(1).truncatedTo(ChronoUnit.SECONDS))
289 return List.of(deploy, undeploy);