diff options
author | Jim Hahn <jrh3@att.com> | 2021-06-02 14:35:48 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@onap.org> | 2021-06-02 14:35:48 +0000 |
commit | 2ba648e483fe5f5ef953acb2b25135e9a3cbd742 (patch) | |
tree | 1af38fd6a6ada71ab88e2b412e8b504564eb09ba /models-pap/src/test | |
parent | b1ebc97af3bf155a34100380435b5d21a2be774d (diff) | |
parent | 09e2bc57b947fb71c4dde9a8c0ded52f695abda1 (diff) |
Merge "Handling Policy deploy/undeploy audit models"
Diffstat (limited to 'models-pap/src/test')
3 files changed, 413 insertions, 0 deletions
diff --git a/models-pap/src/test/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAuditTest.java b/models-pap/src/test/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAuditTest.java new file mode 100644 index 000000000..4f8693304 --- /dev/null +++ b/models-pap/src/test/java/org/onap/policy/models/pap/persistence/concepts/JpaPolicyAuditTest.java @@ -0,0 +1,126 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.pap.persistence.concepts; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.models.pap.concepts.PolicyAudit; +import org.onap.policy.models.pap.concepts.PolicyAudit.AuditAction; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus; +import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State; +import org.onap.policy.models.pdp.persistence.concepts.JpaPdpPolicyStatus; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +public class JpaPolicyAuditTest { + + private static final ToscaConceptIdentifier MY_POLICY = new ToscaConceptIdentifier("MyPolicy", "1.2.3"); + private static final String PDP_GROUP = "pdpGroupxyz"; + private static final String USER = "user"; + + PolicyAudit audit; + + /** + * Setup an audit for usage on unit tests. + */ + @Before + public void setup() { + audit = PolicyAudit.builder().auditId(1L).pdpGroup(PDP_GROUP).pdpType("pdpType").policy(MY_POLICY) + .action(AuditAction.DEPLOYMENT).timestamp(Instant.now().truncatedTo(ChronoUnit.SECONDS)).build(); + } + + @Test + public void testCompareTo() { + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(audit); + assertEquals(-1, jpaAudit.compareTo(null)); + assertEquals(0, jpaAudit.compareTo(jpaAudit)); + assertEquals(0, jpaAudit.compareTo(new JpaPolicyAudit(jpaAudit))); + + PdpPolicyStatus idw = PdpPolicyStatus.builder().deploy(true).state(State.SUCCESS).pdpGroup(PDP_GROUP) + .pdpId("wId").policy(MY_POLICY).policyType(MY_POLICY).build(); + JpaPdpPolicyStatus jpaStatus = new JpaPdpPolicyStatus(idw); + assertNotEquals(0, jpaAudit.compareTo(jpaStatus)); + } + + @Test + public void testKeys() { + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(); + assertThat(jpaAudit.getKeys()).isNotNull(); + assertTrue(jpaAudit.getKey().isNullKey()); + + jpaAudit = new JpaPolicyAudit(audit); + assertFalse(jpaAudit.getKey().isNullKey()); + } + + @Test + public void testClean() { + audit.setUser(" user"); + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(audit); + assertThatNoException().isThrownBy(() -> jpaAudit.clean()); + assertEquals(USER, jpaAudit.getUser()); + } + + @Test + public void testToAuthorative() { + audit.setUser(USER); + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(audit); + PolicyAudit convertedAudit = jpaAudit.toAuthorative(); + + assertEquals(audit, convertedAudit); + assertEquals(USER, convertedAudit.getUser()); + + JpaPolicyAudit jpaAuditWithNullKey = new JpaPolicyAudit(); + PolicyAudit convertedAudit2 = jpaAuditWithNullKey.toAuthorative(); + assertTrue(convertedAudit2.getPolicy().asConceptKey().isNullKey()); + + } + + @Test + public void testConversionsWithRequiredOnly() { + audit = PolicyAudit.builder().policy(MY_POLICY).action(AuditAction.DEPLOYMENT) + .timestamp(Instant.now().truncatedTo(ChronoUnit.SECONDS)).build(); + + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(audit); + PolicyAudit convertedAudit = jpaAudit.toAuthorative(); + + assertEquals(audit, convertedAudit); + assertTrue(jpaAudit.validate("jpaAudit").isValid()); + } + + @Test + public void testValidation() { + PolicyAudit invalidAudit = PolicyAudit.builder().pdpGroup(PDP_GROUP).user(USER).build(); + + JpaPolicyAudit jpaAudit = new JpaPolicyAudit(invalidAudit); + + BeanValidationResult result = jpaAudit.validate("jpaAudit"); + assertFalse(result.isValid()); + } +} diff --git a/models-pap/src/test/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProviderTest.java b/models-pap/src/test/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProviderTest.java new file mode 100644 index 000000000..da231dc7b --- /dev/null +++ b/models-pap/src/test/java/org/onap/policy/models/pap/persistence/provider/PolicyAuditProviderTest.java @@ -0,0 +1,241 @@ +/*- + * ============LICENSE_START======================================================= + * Copyright (C) 2021 Nordix Foundation. + * ================================================================================ + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.policy.models.pap.persistence.provider; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.concurrent.TimeUnit; +import org.awaitility.Awaitility; +import org.eclipse.persistence.config.PersistenceUnitProperties; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.onap.policy.models.base.PfModelRuntimeException; +import org.onap.policy.models.dao.DaoParameters; +import org.onap.policy.models.dao.PfDao; +import org.onap.policy.models.dao.PfDaoFactory; +import org.onap.policy.models.dao.impl.DefaultPfDao; +import org.onap.policy.models.pap.concepts.PolicyAudit; +import org.onap.policy.models.pap.concepts.PolicyAudit.AuditAction; +import org.onap.policy.models.pap.persistence.provider.PolicyAuditProvider.AuditFilter; +import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; + +/** + * Class for unit testing {@link PolicyAuditProvider}. + * + * @author Adheli Tavares (adheli.tavares@est.tech) + * + */ +public class PolicyAuditProviderTest { + + private static final String FIELD_IS_NULL = "%s is marked .*ull but is null"; + private static final String GROUP_A = "groupA"; + private static final String GROUP_B = "groupB"; + private static final ToscaConceptIdentifier MY_POLICY = new ToscaConceptIdentifier("MyPolicy", "1.2.3"); + private static final ToscaConceptIdentifier MY_POLICY2 = new ToscaConceptIdentifier("MyPolicyB", "2.3.4"); + private static final Integer NUMBER_RECORDS = 10; + + private PfDao pfDao; + + /** + * Set up the DAO towards the database. + * + * @throws Exception on database errors + */ + @Before + public void setupDao() throws Exception { + final DaoParameters daoParameters = new DaoParameters(); + daoParameters.setPluginClass(DefaultPfDao.class.getName()); + + daoParameters.setPersistenceUnit("ToscaConceptTest"); + + Properties jdbcProperties = new Properties(); + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_USER, "policy"); + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_PASSWORD, "P01icY"); + + if (System.getProperty("USE-MARIADB") != null) { + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.mariadb.jdbc.Driver"); + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:mariadb://localhost:3306/policy"); + } else { + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_DRIVER, "org.h2.Driver"); + jdbcProperties.setProperty(PersistenceUnitProperties.JDBC_URL, "jdbc:h2:mem:PolicyAuditProviderTest"); + } + + daoParameters.setJdbcProperties(jdbcProperties); + + pfDao = new PfDaoFactory().createPfDao(daoParameters); + pfDao.init(daoParameters); + } + + @After + public void teardown() { + pfDao.close(); + } + + @Test + public void testCreatePolicyAudit() { + PolicyAuditProvider provider = new PolicyAuditProvider(); + + Instant date = Instant.now(); + provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_A, MY_POLICY)); + + List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS); + assertThat(records).hasSize(2); + + // as the start date is 10 min ahead of first record, shouldn't return any records + List<PolicyAudit> emptyList = provider.getAuditRecords(pfDao, + AuditFilter.builder().fromDate(Instant.now().plusSeconds(600)).build(), 600); + assertThat(emptyList).isEmpty(); + } + + @Test + public void testCreatePolicyAuditInvalid() { + PolicyAuditProvider provider = new PolicyAuditProvider(); + + List<PolicyAudit> audits = List.of(PolicyAudit.builder().pdpType("pdpType").action(AuditAction.DEPLOYMENT) + .timestamp(Instant.now()).build()); + + assertThrows(PfModelRuntimeException.class, () -> provider.createAuditRecords(pfDao, audits)); + + List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS); + assertThat(records).isEmpty(); + } + + @Test + public void testFilters() { + PolicyAuditProvider provider = new PolicyAuditProvider(); + + Instant date = Instant.now().truncatedTo(ChronoUnit.SECONDS); + System.out.println(date); + provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_A, MY_POLICY)); + provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY)); + provider.createAuditRecords(pfDao, generatePolicyAudits(date, GROUP_B, MY_POLICY2)); + Awaitility.await().pollDelay(3, TimeUnit.SECONDS).until(() -> { + return true; + }); + + List<PolicyAudit> records = provider.getAuditRecords(pfDao, + AuditFilter.builder().fromDate(date).toDate(Instant.now()).build(), NUMBER_RECORDS); + assertThat(records).hasSize(6); + + List<PolicyAudit> recordsWithGroupB = + provider.getAuditRecords(pfDao, AuditFilter.builder().pdpGroup(GROUP_B).build(), NUMBER_RECORDS); + assertThat(recordsWithGroupB).hasSize(4); + + List<PolicyAudit> recordsWithActionDeploy = provider.getAuditRecords(pfDao, + AuditFilter.builder().action(AuditAction.DEPLOYMENT).build(), NUMBER_RECORDS); + assertThat(recordsWithActionDeploy).hasSize(3); + + List<PolicyAudit> recordsWithMyPolicy = provider.getAuditRecords(pfDao, + AuditFilter.builder().name(MY_POLICY.getName()).version(MY_POLICY.getVersion()).build(), + NUMBER_RECORDS); + assertThat(recordsWithMyPolicy).hasSize(4); + } + + @Test + public void testLoadRecordsForLimit() { + PolicyAuditProvider provider = new PolicyAuditProvider(); + + List<PolicyAudit> loadAudits = new ArrayList<>(); + + // going to create 102 records. + for (int i = 0; i <= 50; i++) { + loadAudits.addAll(generatePolicyAudits(Instant.now().plusSeconds(i), GROUP_A, MY_POLICY)); + } + + provider.createAuditRecords(pfDao, loadAudits); + + List<PolicyAudit> records = provider.getAuditRecords(pfDao, NUMBER_RECORDS); + assertThat(records).hasSize(10); + + // check that is being ordered + assertTrue(records.get(0).getTimestamp().isAfter(records.get(9).getTimestamp())); + assertEquals(loadAudits.get(loadAudits.size() - 1).getTimestamp(), records.get(0).getTimestamp()); + + // try to get 102 records should return 100 + records = provider.getAuditRecords(pfDao, 102); + assertThat(records).hasSize(100); + } + + @Test + public void policyProviderExceptions() { + PolicyAuditProvider provider = new PolicyAuditProvider(); + + assertThatThrownBy(() -> { + provider.createAuditRecords(null, null); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao")); + + assertThatThrownBy(() -> { + provider.createAuditRecords(pfDao, null); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "audits")); + + assertThatThrownBy(() -> { + provider.getAuditRecords(null, NUMBER_RECORDS); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao")); + + assertThatThrownBy(() -> { + provider.getAuditRecords(pfDao, null); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "numRecords")); + + assertThatThrownBy(() -> { + provider.getAuditRecords(null, AuditFilter.builder().build(), NUMBER_RECORDS); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "dao")); + + assertThatThrownBy(() -> { + provider.getAuditRecords(pfDao, AuditFilter.builder().build(), null); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "numRecords")); + + assertThatThrownBy(() -> { + provider.getAuditRecords(pfDao, null, NUMBER_RECORDS); + }).hasMessageMatching(String.format(FIELD_IS_NULL, "auditFilter")); + } + + private List<PolicyAudit> generatePolicyAudits(Instant date, String group, ToscaConceptIdentifier policy) { + // @formatter:off + PolicyAudit deploy = PolicyAudit.builder() + .pdpGroup(group) + .pdpType("pdpType") + .policy(policy) + .action(AuditAction.DEPLOYMENT) + .timestamp(date.truncatedTo(ChronoUnit.SECONDS)) + .build(); + + PolicyAudit undeploy = PolicyAudit.builder() + .pdpGroup(group) + .pdpType("pdpType") + .policy(policy) + .action(AuditAction.UNDEPLOYMENT) + .timestamp(date.plusSeconds(1).truncatedTo(ChronoUnit.SECONDS)) + .build(); + // @formatter:on + + return List.of(deploy, undeploy); + } +} diff --git a/models-pap/src/test/resources/META-INF/persistence.xml b/models-pap/src/test/resources/META-INF/persistence.xml new file mode 100644 index 000000000..58e2deca3 --- /dev/null +++ b/models-pap/src/test/resources/META-INF/persistence.xml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + ============LICENSE_START======================================================= + Copyright (C) 2021 Nordix Foundation. + ================================================================================ + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + SPDX-License-Identifier: Apache-2.0 + ============LICENSE_END========================================================= +--> + +<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> + <persistence-unit name="ToscaConceptTest" transaction-type="RESOURCE_LOCAL"> + <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> + + <class>org.onap.policy.models.pap.persistence.concepts.JpaPolicyAudit</class> + + <properties> + <property name="eclipselink.target-database" value="MySQL" /> + <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> + <property name="eclipselink.ddl-generation.output-mode" value="database" /> + <property name="eclipselink.logging.level" value="INFO" /> + + <property name="eclipselink.logging.level" value="ALL" /> + <property name="eclipselink.logging.level.jpa" value="ALL" /> + <property name="eclipselink.logging.level.ddl" value="ALL" /> + <property name="eclipselink.logging.level.connection" value="ALL" /> + <property name="eclipselink.logging.level.sql" value="ALL" /> + <property name="eclipselink.logging.level.transaction" value="ALL" /> + <property name="eclipselink.logging.level.sequencing" value="ALL" /> + <property name="eclipselink.logging.level.server" value="ALL" /> + <property name="eclipselink.logging.level.query" value="ALL" /> + <property name="eclipselink.logging.level.properties" value="ALL" /> + </properties> + </persistence-unit> +</persistence> |