From a88c9a232d486865ce007886daff56392ebf2d7b Mon Sep 17 00:00:00 2001 From: FrancescoFioraEst Date: Tue, 2 Nov 2021 16:08:46 +0000 Subject: Add support transaction in Statistics Providers Add support transaction in ClElementStatisticsProvider and ParticipantStatisticsProvider Issue-ID: POLICY-3801 Change-Id: Iaf9d55a268627f9d548afdf108476441b19e1413 Signed-off-by: FrancescoFioraEst --- .../provider/ClElementStatisticsProvider.java | 69 ++++------ .../provider/ParticipantStatisticsProvider.java | 61 ++++----- .../repository/ClElementStatisticsRepository.java | 32 +++++ .../persistence/repository/FilterRepository.java | 53 ++++++++ .../repository/FilterRepositoryImpl.java | 51 ++++++++ .../ParticipantStatisticsRepository.java | 32 +++++ .../provider/ClElementStatisticsProviderTest.java | 50 +++---- .../ParticipantStatisticsProviderTest.java | 41 +++--- .../clamp/controlloop/runtime/Application.java | 2 +- .../ControlLoopInstantiationProviderTest.java | 7 +- .../runtime/monitoring/TestMonitoringProvider.java | 144 ++++++++++++++------- .../rest/MonitoringQueryControllerTest.java | 13 +- .../supervision/comm/SupervisionMessagesTest.java | 6 +- 13 files changed, 375 insertions(+), 186 deletions(-) create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java create mode 100644 models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java index e5b062bc1..bdb0d4d9b 100644 --- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProvider.java @@ -21,19 +21,20 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.ws.rs.core.Response.Status; +import lombok.AllArgsConstructor; import lombok.NonNull; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ClElementStatisticsRepository; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfReferenceTimestampKey; import org.onap.policy.models.dao.PfFilterParameters; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; -import org.onap.policy.models.provider.impl.AbstractModelsProvider; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; /** * This class provides the provision of information on control loop element statistics in the database to callers. @@ -41,46 +42,34 @@ import org.springframework.stereotype.Component; * @author Ramesh Murugan Iyer (ramesh.murugan.iyer@est.tech) */ @Component -public class ClElementStatisticsProvider extends AbstractModelsProvider { +@Transactional +@AllArgsConstructor +public class ClElementStatisticsProvider { - /** - * Create a provider for control loop element statistics. - * - * @param parameters the parameters for database access - * @throws PfModelException on initiation errors - */ - public ClElementStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException { - super(parameters); - this.init(); - } + private ClElementStatisticsRepository clElementStatisticsRepository; /** * Creates control loop element statistics. * * @param clElementStatisticsList a specification of the CL element statistics to create * @return the clElement statistics created - * @throws PfModelException on errors creating clElement statistics + * @throws PfModelException on initiation errors */ public List createClElementStatistics( @NonNull final List clElementStatisticsList) throws PfModelException { - List jpaClElementStatisticsList = ProviderUtils.getJpaAndValidate( - clElementStatisticsList, JpaClElementStatistics::new, "control loop element statistics"); + try { + var jpaClElementStatisticsList = ProviderUtils.getJpaAndValidate(clElementStatisticsList, + JpaClElementStatistics::new, "control loop element statistics"); - jpaClElementStatisticsList.forEach(jpaClElementStatistics -> getPfDao().create(jpaClElementStatistics)); + var jpaClElementStatisticsSaved = clElementStatisticsRepository.saveAll(jpaClElementStatisticsList); - // Return the created control loop element statistics - List elementStatistics = new ArrayList<>(clElementStatisticsList.size()); - - for (ClElementStatistics clElementStat : clElementStatisticsList) { - var jpaClElementStatistics = getPfDao().get(JpaClElementStatistics.class, - new PfReferenceTimestampKey(clElementStat.getParticipantId().getName(), - clElementStat.getParticipantId().getVersion(), clElementStat.getId().toString(), - clElementStat.getTimeStamp())); - elementStatistics.add(jpaClElementStatistics.toAuthorative()); + // Return the saved control loop element statistics + return asClElementStatisticsList(jpaClElementStatisticsSaved); + } catch (IllegalArgumentException e) { + throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error in save control loop element statistics", + e); } - - return elementStatistics; } /** @@ -101,22 +90,17 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { * @param id of the control loop element * @param timestamp timestamp of the statistics * @return the clElement statistics found - * @throws PfModelException on errors getting clElement statistics */ + @Transactional(readOnly = true) public List getClElementStatistics(final String name, final String version, final String id, - final Instant timestamp) throws PfModelException { - List clElementStatistics = new ArrayList<>(1); + final Instant timestamp) { if (name != null && version != null && timestamp != null && id != null) { - clElementStatistics.add(getPfDao() - .get(JpaClElementStatistics.class, new PfReferenceTimestampKey(name, version, id, timestamp)) - .toAuthorative()); - return clElementStatistics; + return asClElementStatisticsList(clElementStatisticsRepository + .findAllById(List.of(new PfReferenceTimestampKey(name, version, id, timestamp)))); } else if (name != null) { - clElementStatistics.addAll(getFilteredClElementStatistics(name, version, null, null, null, "DESC", 0)); - } else { - clElementStatistics.addAll(asClElementStatisticsList(getPfDao().getAll(JpaClElementStatistics.class))); + return getFilteredClElementStatistics(name, version, null, null, null, "DESC", 0); } - return clElementStatistics; + return asClElementStatisticsList(clElementStatisticsRepository.findAll()); } /** @@ -130,8 +114,8 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { * @param getRecordNum Total query count from database * @param filterMap the filters to apply to the get operation * @return the clElement statistics found - * @throws PfModelException on errors getting policies */ + @Transactional(readOnly = true) public List getFilteredClElementStatistics(final String name, final String version, final Instant startTimeStamp, final Instant endTimeStamp, Map filterMap, final String sortOrder, final int getRecordNum) { @@ -148,6 +132,7 @@ public class ClElementStatisticsProvider extends AbstractModelsProvider { .recordNum(getRecordNum) .build(); // @formatter:on - return asClElementStatisticsList(getPfDao().getFiltered(JpaClElementStatistics.class, filterParams)); + return asClElementStatisticsList( + clElementStatisticsRepository.getFiltered(JpaClElementStatistics.class, filterParams)); } } diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java index fa27a41c2..06c7a11f8 100644 --- a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProvider.java @@ -21,36 +21,30 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.ws.rs.core.Response.Status; +import lombok.AllArgsConstructor; import lombok.NonNull; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ParticipantStatisticsRepository; import org.onap.policy.models.base.PfModelException; import org.onap.policy.models.base.PfTimestampKey; import org.onap.policy.models.dao.PfFilterParameters; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; -import org.onap.policy.models.provider.impl.AbstractModelsProvider; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; /** * This class provides the provision of information on participant statistics in the database to callers. */ @Component -public class ParticipantStatisticsProvider extends AbstractModelsProvider { +@Transactional +@AllArgsConstructor +public class ParticipantStatisticsProvider { - /** - * Create a provider for control loops statistics. - * - * @param parameters the parameters for database access - * @throws PfModelException on initiation errors - */ - public ParticipantStatisticsProvider(@NonNull PolicyModelsProviderParameters parameters) throws PfModelException { - super(parameters); - this.init(); - } + private ParticipantStatisticsRepository participantStatisticsRepository; /** * Get Participant statistics. @@ -59,20 +53,18 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { * @param version the version of the participant statistics to get, null to get all stats for a name * @param timestamp the time stamp for the stats to get * @return the participant statistics found - * @throws PfModelException on errors getting participant statistics */ + @Transactional(readOnly = true) public List getParticipantStatistics(final String name, final String version, - final Instant timestamp) throws PfModelException { + final Instant timestamp) { if (name != null && version != null && timestamp != null) { - List participantStatistics = new ArrayList<>(1); - participantStatistics.add(getPfDao() - .get(JpaParticipantStatistics.class, new PfTimestampKey(name, version, timestamp)).toAuthorative()); - return participantStatistics; + return asParticipantStatisticsList( + participantStatisticsRepository.findAllById(List.of(new PfTimestampKey(name, version, timestamp)))); } else if (name != null) { return getFilteredParticipantStatistics(name, version, timestamp, null, null, "DESC", 0); } else { - return asParticipantStatisticsList(getPfDao().getAll(JpaParticipantStatistics.class)); + return asParticipantStatisticsList(participantStatisticsRepository.findAll()); } } @@ -87,8 +79,8 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { * @param getRecordNum Total query count from database * @param filterMap the filters to apply to the get operation * @return the participant statistics found - * @throws PfModelException on errors getting policies */ + @Transactional(readOnly = true) public List getFilteredParticipantStatistics(final String name, final String version, final Instant startTimeStamp, final Instant endTimeStamp, Map filterMap, final String sortOrder, final int getRecordNum) { @@ -106,7 +98,8 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { .build(); // @formatter:on - return asParticipantStatisticsList(getPfDao().getFiltered(JpaParticipantStatistics.class, filterParams)); + return asParticipantStatisticsList( + participantStatisticsRepository.getFiltered(JpaParticipantStatistics.class, filterParams)); } /** @@ -119,23 +112,17 @@ public class ParticipantStatisticsProvider extends AbstractModelsProvider { public List createParticipantStatistics( @NonNull final List participantStatisticsList) throws PfModelException { - List jpaParticipantStatisticsList = ProviderUtils - .getJpaAndValidate(participantStatisticsList, JpaParticipantStatistics::new, "Participant Statistics"); - - jpaParticipantStatisticsList.forEach(jpaParticipantStatistics -> getPfDao().update(jpaParticipantStatistics)); + try { + var jpaParticipantStatisticsList = ProviderUtils.getJpaAndValidate(participantStatisticsList, + JpaParticipantStatistics::new, "Participant Statistics"); - // Return the created participant statistics - List participantStatistics = new ArrayList<>(participantStatisticsList.size()); + var jpaParticipantStatisticsSaved = participantStatisticsRepository.saveAll(jpaParticipantStatisticsList); - for (ParticipantStatistics participantStatisticsItem : participantStatisticsList) { - var jpaParticipantStatistics = getPfDao().get(JpaParticipantStatistics.class, - new PfTimestampKey(participantStatisticsItem.getParticipantId().getName(), - participantStatisticsItem.getParticipantId().getVersion(), - participantStatisticsItem.getTimeStamp())); - participantStatistics.add(jpaParticipantStatistics.toAuthorative()); + // Return the saved participant statistics + return asParticipantStatisticsList(jpaParticipantStatisticsSaved); + } catch (IllegalArgumentException e) { + throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "Error in save participant statistics", e); } - - return participantStatistics; } /** diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java new file mode 100644 index 000000000..1e07a4fe6 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ClElementStatisticsRepository.java @@ -0,0 +1,32 @@ +/*- + * ============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.clamp.controlloop.models.controlloop.persistence.repository; + +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics; +import org.onap.policy.models.base.PfReferenceTimestampKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ClElementStatisticsRepository + extends JpaRepository, FilterRepository { + +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java new file mode 100644 index 000000000..ce1f3d8c3 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepository.java @@ -0,0 +1,53 @@ +/*- + * ============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.clamp.controlloop.models.controlloop.persistence.repository; + +import java.util.List; +import org.onap.policy.models.base.PfConcept; +import org.onap.policy.models.dao.PfFilterParametersIntfc; + +public interface FilterRepository { + + /** + * Get an object from the database, referred to by concept key. + * + * @param the type of the object to get, a subclass of {@link PfConcept} + * @param someClass the class of the object to get, a subclass of {@link PfConcept}, if name is null, all concepts + * of type T are returned, if name is not null and version is null, all versions of that concept matching the + * name are returned. + * @param filterParams filter parameters + * @return the objects that was retrieved from the database + */ + List getFiltered(Class someClass, PfFilterParametersIntfc filterParams); + + /** + * Get an object from the database, referred to by concept key. + * + * @param the type of the object to get, a subclass of {@link PfConcept} + * @param someClass the class of the object to get, a subclass of {@link PfConcept}, if name is null, all concepts + * of type T are returned, if name is not null and version is null, all versions of that concept matching the + * name are returned. + * @param name the name of the object to get, null returns all objects + * @param version the version the object to get, null returns all objects for a specified name + * @return the objects that was retrieved from the database + */ + List getFiltered(Class someClass, String name, String version); +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java new file mode 100644 index 000000000..0dc8fc373 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/FilterRepositoryImpl.java @@ -0,0 +1,51 @@ +/*- + * ============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.clamp.controlloop.models.controlloop.persistence.repository; + +import java.util.List; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.onap.policy.models.base.PfConcept; +import org.onap.policy.models.dao.PfDao; +import org.onap.policy.models.dao.PfFilterParametersIntfc; +import org.onap.policy.models.dao.impl.ProxyDao; +import org.springframework.stereotype.Repository; + +@Repository +public class FilterRepositoryImpl implements FilterRepository { + + @PersistenceContext + private EntityManager entityManager; + + protected PfDao getPfDao() { + return new ProxyDao(entityManager); + } + + @Override + public List getFiltered(Class someClass, PfFilterParametersIntfc filterParams) { + return getPfDao().getFiltered(someClass, filterParams); + } + + @Override + public List getFiltered(Class someClass, String name, String version) { + return getPfDao().getFiltered(someClass, name, version); + } +} diff --git a/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java new file mode 100644 index 000000000..6fecd6143 --- /dev/null +++ b/models/src/main/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/repository/ParticipantStatisticsRepository.java @@ -0,0 +1,32 @@ +/*- + * ============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.clamp.controlloop.models.controlloop.persistence.repository; + +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics; +import org.onap.policy.models.base.PfTimestampKey; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ParticipantStatisticsRepository + extends JpaRepository, FilterRepository { + +} diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java index a9ef9148f..cf4136d3e 100644 --- a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ClElementStatisticsProviderTest.java @@ -23,19 +23,23 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provide 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.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.time.Instant; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ClElementStatisticsList; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaClElementStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ClElementStatisticsRepository; import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.resources.ResourceUtils; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class ClElementStatisticsProviderTest { @@ -43,9 +47,6 @@ class ClElementStatisticsProviderTest { private static final Coder CODER = new StandardCoder(); private static final String CL_ELEMENT_STATS_JSON = "src/test/resources/providers/TestClElementStatistics.json"; - private static AtomicInteger dbNameCounter = new AtomicInteger(); - - private PolicyModelsProviderParameters parameters; private ClElementStatisticsProvider clElementStatisticsProvider; private ClElementStatisticsList inputClElementStats; private String originalJson = ResourceUtils.getResourceAsString(CL_ELEMENT_STATS_JSON); @@ -58,22 +59,23 @@ class ClElementStatisticsProviderTest { @BeforeEach void beforeSetupDao() throws Exception { - parameters = new PolicyModelsProviderParameters(); - parameters.setDatabaseDriver("org.h2.Driver"); - parameters.setName("PolicyProviderParameterGroup"); - parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl"); - parameters.setDatabaseUrl("jdbc:h2:mem:clElementTestDb" + dbNameCounter.getAndIncrement()); - parameters.setDatabaseUser("policy"); - parameters.setDatabasePassword("P01icY"); - parameters.setPersistenceUnit("ToscaConceptTest"); - - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters); inputClElementStats = CODER.decode(originalJson, ClElementStatisticsList.class); - } + var clElementStatisticsRepository = mock(ClElementStatisticsRepository.class); + + var jpaClElementStatisticsList = ProviderUtils.getJpaAndValidate(inputClElementStats.getClElementStatistics(), + JpaClElementStatistics::new, "control loop element statistics"); + + for (var clElementStat : jpaClElementStatisticsList) { + when(clElementStatisticsRepository.findAllById(List.of(clElementStat.getKey()))) + .thenReturn(List.of(clElementStat)); + } + + when(clElementStatisticsRepository.saveAll(anyList())).thenReturn(jpaClElementStatisticsList); + + when(clElementStatisticsRepository.getFiltered(eq(JpaClElementStatistics.class), any())) + .thenReturn(List.of(jpaClElementStatisticsList.get(0))); - @AfterEach - void teardown() { - clElementStatisticsProvider.close(); + clElementStatisticsProvider = new ClElementStatisticsProvider(clElementStatisticsRepository); } @Test @@ -84,10 +86,10 @@ class ClElementStatisticsProviderTest { ClElementStatisticsList createdClElementStats = new ClElementStatisticsList(); createdClElementStats.setClElementStatistics( - clElementStatisticsProvider.createClElementStatistics(inputClElementStats.getClElementStatistics())); + clElementStatisticsProvider.createClElementStatistics(inputClElementStats.getClElementStatistics())); assertEquals(inputClElementStats.toString().replaceAll("\\s+", ""), - createdClElementStats.toString().replaceAll("\\s+", "")); + createdClElementStats.toString().replaceAll("\\s+", "")); } @Test @@ -104,9 +106,9 @@ class ClElementStatisticsProviderTest { Instant instant = inputClElementStats.getClElementStatistics().get(0).getTimeStamp(); String id = inputClElementStats.getClElementStatistics().get(0).getId().toString(); assertEquals(1, clElementStatisticsProvider - .getClElementStatistics(identifier.getName(), identifier.getVersion(), id, instant).size()); + .getClElementStatistics(identifier.getName(), identifier.getVersion(), id, instant).size()); assertEquals(1, clElementStatisticsProvider - .getFilteredClElementStatistics("name2", "1.0.1", null, null, null, "DESC", 1).size()); + .getFilteredClElementStatistics("name2", "1.0.1", null, null, null, "DESC", 1).size()); } } diff --git a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java index 8191dd618..c6e1f817d 100644 --- a/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java +++ b/models/src/test/java/org/onap/policy/clamp/controlloop/models/controlloop/persistence/provider/ParticipantStatisticsProviderTest.java @@ -23,19 +23,23 @@ package org.onap.policy.clamp.controlloop.models.controlloop.persistence.provide 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.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.time.Instant; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatistics; import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ParticipantStatisticsList; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts.JpaParticipantStatistics; +import org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository.ParticipantStatisticsRepository; import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.StandardCoder; import org.onap.policy.common.utils.resources.ResourceUtils; -import org.onap.policy.models.provider.PolicyModelsProviderParameters; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class ParticipantStatisticsProviderTest { @@ -44,32 +48,29 @@ class ParticipantStatisticsProviderTest { private static final Coder CODER = new StandardCoder(); private static final String PARTICIPANT_STATS_JSON = "src/test/resources/providers/TestParticipantStatistics.json"; - private static AtomicInteger dbNameCounter = new AtomicInteger(); - - private PolicyModelsProviderParameters parameters; private ParticipantStatisticsProvider participantStatisticsProvider; private ParticipantStatisticsList inputParticipantStatistics; private String originalJson = ResourceUtils.getResourceAsString(PARTICIPANT_STATS_JSON); @BeforeEach void beforeSetupDao() throws Exception { + var participantStatisticsRepository = mock(ParticipantStatisticsRepository.class); + participantStatisticsProvider = new ParticipantStatisticsProvider(participantStatisticsRepository); + inputParticipantStatistics = CODER.decode(originalJson, ParticipantStatisticsList.class); - parameters = new PolicyModelsProviderParameters(); - parameters.setDatabaseDriver("org.h2.Driver"); - parameters.setName("PolicyProviderParameterGroup"); - parameters.setImplementation("org.onap.policy.models.provider.impl.DatabasePolicyModelsProviderImpl"); - parameters.setDatabaseUrl("jdbc:h2:mem:participantStatisticsProviderTestDb" + dbNameCounter.getAndIncrement()); - parameters.setDatabaseUser("policy"); - parameters.setDatabasePassword("P01icY"); - parameters.setPersistenceUnit("ToscaConceptTest"); + var jpaParticipantStatisticsList = + ProviderUtils.getJpaAndValidate(inputParticipantStatistics.getStatisticsList(), + JpaParticipantStatistics::new, "Participant Statistics"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters); - inputParticipantStatistics = CODER.decode(originalJson, ParticipantStatisticsList.class); - } + for (var participantStat : jpaParticipantStatisticsList) { + when(participantStatisticsRepository.findAllById(List.of(participantStat.getKey()))) + .thenReturn(List.of(participantStat)); + } + + when(participantStatisticsRepository.getFiltered(eq(JpaParticipantStatistics.class), any())) + .thenReturn(List.of(jpaParticipantStatisticsList.get(0))); - @AfterEach - void teardown() { - participantStatisticsProvider.close(); + when(participantStatisticsRepository.saveAll(anyList())).thenReturn(jpaParticipantStatisticsList); } @Test diff --git a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java index 3f51f1f2b..64d1393ac 100644 --- a/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java +++ b/runtime-controlloop/src/main/java/org/onap/policy/clamp/controlloop/runtime/Application.java @@ -30,7 +30,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @SpringBootApplication -@EnableJpaRepositories +@EnableJpaRepositories({"org.onap.policy.clamp.controlloop.models.controlloop.persistence.repository"}) @ComponentScan({"org.onap.policy.clamp.controlloop.models.controlloop.persistence.provider", "org.onap.policy.clamp.controlloop.runtime", "org.onap.policy.clamp.controlloop.common.rest"}) diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java index 8fbd47136..564109e5d 100644 --- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java +++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/instantiation/ControlLoopInstantiationProviderTest.java @@ -26,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; import java.io.IOException; import java.util.ArrayList; @@ -124,10 +125,8 @@ class ControlLoopInstantiationProviderTest { clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters()); participantProvider = new ParticipantProvider(controlLoopParameters.getDatabaseProviderParameters()); - var participantStatisticsProvider = - new ParticipantStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters()); - var clElementStatisticsProvider = - new ClElementStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters()); + var participantStatisticsProvider = Mockito.mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); commissioningProvider = new CommissioningProvider(new ServiceTemplateProvider(modelsProvider), clProvider, null, participantProvider); var monitoringProvider = diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java index 2fcbf1297..2233e862c 100644 --- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java +++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/TestMonitoringProvider.java @@ -24,13 +24,19 @@ package org.onap.policy.clamp.controlloop.runtime.monitoring; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyMap; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.io.File; import java.time.Instant; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.UUID; +import javax.ws.rs.core.Response; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -47,6 +53,7 @@ import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData; import org.onap.policy.common.utils.coder.Coder; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; +import org.onap.policy.models.base.PfModelRuntimeException; import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier; class TestMonitoringProvider { @@ -61,14 +68,23 @@ class TestMonitoringProvider { "src/test/resources/rest/monitoring/TestClElementStatistics_Invalid.json"; private static final Coder CODER = new StandardCoder(); - private static final String LIST_IS_NULL = ".*StatisticsList is marked .*ull but is null"; + private static final String STAT_LIST_IS_NULL = ".*StatisticsList is marked .*ull but is null"; + private static final String PARTICIPANT_STAT_LIST_IS_NULL = + "participantStatisticsList is marked .*null but is null"; + private static final String NAME_IS_NULL = "name is marked .*null but is null"; + private static final String CL_LIST_IS_NULL = "clElementStatisticsList is marked .*null but is null"; + private static final String ID_VERSION1 = "1.001"; + private static final String ID_VERSION2 = "1.002"; + private static final String ID_NAME1 = "name1"; + private static final String ID_NAME2 = "name2"; + private static final String SORT_DESC = "DESC"; + private static final String ID_NAME3 = "testCLName"; + private static final String ID_INVALID_NAME = "invalidCLName"; private static ParticipantStatisticsList inputParticipantStatistics; private static ParticipantStatisticsList invalidParticipantInput; private static ClElementStatisticsList inputClElementStatistics; private static ClElementStatisticsList invalidClElementInput; - private ParticipantStatisticsProvider participantStatisticsProvider = null; - private ClElementStatisticsProvider clElementStatisticsProvider = null; private ControlLoopProvider clProvider = null; @BeforeAll @@ -84,12 +100,6 @@ class TestMonitoringProvider { @AfterEach void close() throws Exception { - if (participantStatisticsProvider != null) { - participantStatisticsProvider.close(); - } - if (clElementStatisticsProvider != null) { - clElementStatisticsProvider.close(); - } if (clProvider != null) { clProvider.close(); } @@ -97,20 +107,28 @@ class TestMonitoringProvider { @Test void testCreateParticipantStatistics() throws Exception { + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("createparStat"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); clProvider = new ControlLoopProvider(parameters.getDatabaseProviderParameters()); MonitoringProvider provider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider); + + when(participantStatisticsProvider.createParticipantStatistics(any())) + .thenReturn(inputParticipantStatistics.getStatisticsList()); + + when(participantStatisticsProvider.createParticipantStatistics(eq(null))) + .thenThrow(new PfModelRuntimeException(Response.Status.BAD_REQUEST, PARTICIPANT_STAT_LIST_IS_NULL)); + // Creating statistics data in db with null input + assertThatThrownBy(() -> { provider.createParticipantStatistics(null); - }).hasMessageMatching(LIST_IS_NULL); + }).hasMessageMatching(STAT_LIST_IS_NULL); assertThatThrownBy(() -> { provider.createParticipantStatistics(invalidParticipantInput.getStatisticsList()); - }).hasMessageMatching("participantStatisticsList is marked .*null but is null"); + }).hasMessageMatching(PARTICIPANT_STAT_LIST_IS_NULL); // Creating statistics data from input json ParticipantStatisticsList createResponse = @@ -123,32 +141,41 @@ class TestMonitoringProvider { @Test void testGetParticipantStatistics() throws Exception { + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + when(participantStatisticsProvider.getFilteredParticipantStatistics(eq(ID_NAME1), any(), any(), any(), eq(null), + eq(SORT_DESC), eq(0))).thenReturn(List.of(inputParticipantStatistics.getStatisticsList().get(0))); + + when(participantStatisticsProvider.getFilteredParticipantStatistics(eq(ID_NAME1), any(), + eq(Instant.parse("2021-01-11T12:00:00.000Z")), eq(Instant.parse("2021-01-11T16:00:00.000Z")), eq(null), + eq(SORT_DESC), eq(0))).thenReturn(List.of()); + + when(participantStatisticsProvider.getFilteredParticipantStatistics(eq(ID_NAME2), any(), any(), any(), eq(null), + eq(SORT_DESC), eq(1))).thenReturn(List.of(inputParticipantStatistics.getStatisticsList().get(2))); + ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("getparStat"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); clProvider = new ControlLoopProvider(parameters.getDatabaseProviderParameters()); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); MonitoringProvider provider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider); - provider.createParticipantStatistics(inputParticipantStatistics.getStatisticsList()); assertThatThrownBy(() -> { provider.fetchFilteredParticipantStatistics(null, null, 0, null, null); - }).hasMessageMatching("name is marked .*null but is null"); + }).hasMessageMatching(NAME_IS_NULL); // Fetch specific statistics record with name, version and record count ParticipantStatisticsList getResponse = - provider.fetchFilteredParticipantStatistics("name2", "1.001", 1, null, null); + provider.fetchFilteredParticipantStatistics(ID_NAME2, ID_VERSION1, 1, null, null); assertThat(getResponse.getStatisticsList()).hasSize(1); assertEquals(getResponse.getStatisticsList().get(0).toString().replaceAll("\\s+", ""), inputParticipantStatistics.getStatisticsList().get(2).toString().replaceAll("\\s+", "")); // Fetch statistics using timestamp - getResponse = provider.fetchFilteredParticipantStatistics("name1", "1.001", 0, null, + getResponse = provider.fetchFilteredParticipantStatistics(ID_NAME1, ID_VERSION1, 0, null, Instant.parse("2021-01-10T15:00:00.000Z")); assertThat(getResponse.getStatisticsList()).hasSize(1); - getResponse = provider.fetchFilteredParticipantStatistics("name1", "1.001", 0, + getResponse = provider.fetchFilteredParticipantStatistics(ID_NAME1, ID_VERSION1, 0, Instant.parse("2021-01-11T12:00:00.000Z"), Instant.parse("2021-01-11T16:00:00.000Z")); assertThat(getResponse.getStatisticsList()).isEmpty(); @@ -156,21 +183,27 @@ class TestMonitoringProvider { @Test void testCreateClElementStatistics() throws Exception { + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); + when(clElementStatisticsProvider.createClElementStatistics(any())) + .thenReturn(inputClElementStatistics.getClElementStatistics()); + + when(clElementStatisticsProvider.createClElementStatistics(eq(null))) + .thenThrow(new PfModelRuntimeException(Response.Status.BAD_REQUEST, CL_LIST_IS_NULL)); + ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("createelemstat"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); clProvider = new ControlLoopProvider(parameters.getDatabaseProviderParameters()); + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); MonitoringProvider provider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider); // Creating statistics data in db with null input assertThatThrownBy(() -> { provider.createClElementStatistics(null); - }).hasMessageMatching(LIST_IS_NULL); + }).hasMessageMatching(STAT_LIST_IS_NULL); assertThatThrownBy(() -> { provider.createClElementStatistics(invalidClElementInput.getClElementStatistics()); - }).hasMessageMatching("clElementStatisticsList is marked .*null but is null"); + }).hasMessageMatching(CL_LIST_IS_NULL); // Creating clElement statistics data from input json ClElementStatisticsList createResponse = @@ -183,42 +216,46 @@ class TestMonitoringProvider { @Test void testGetClElementStatistics() throws Exception { + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("getelemstat"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); clProvider = new ControlLoopProvider(parameters.getDatabaseProviderParameters()); + when(clElementStatisticsProvider.getFilteredClElementStatistics(eq(ID_NAME1), any(), any(), any(), anyMap(), + eq(SORT_DESC), eq(0))) + .thenReturn(List.of(inputClElementStatistics.getClElementStatistics().get(0), + inputClElementStatistics.getClElementStatistics().get(1))); + MonitoringProvider provider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider); assertThatThrownBy(() -> { provider.fetchFilteredClElementStatistics(null, null, null, null, null, 0); - }).hasMessageMatching("name is marked .*null but is null"); + }).hasMessageMatching(NAME_IS_NULL); provider.createClElementStatistics(inputClElementStatistics.getClElementStatistics()); ClElementStatisticsList getResponse = - provider.fetchFilteredClElementStatistics("name1", null, null, null, null, 0); + provider.fetchFilteredClElementStatistics(ID_NAME1, null, null, null, null, 0); assertThat(getResponse.getClElementStatistics()).hasSize(2); assertEquals(getResponse.getClElementStatistics().get(0).toString().replaceAll("\\s+", ""), inputClElementStatistics.getClElementStatistics().get(0).toString().replaceAll("\\s+", "")); // Fetch specific statistics record with name, id and record count - getResponse = provider.fetchFilteredClElementStatistics("name1", "1.001", + getResponse = provider.fetchFilteredClElementStatistics(ID_NAME1, ID_VERSION1, "709c62b3-8918-41b9-a747-d21eb79c6c20", null, null, 0); assertThat(getResponse.getClElementStatistics()).hasSize(2); // Fetch statistics using timestamp - getResponse = provider.fetchFilteredClElementStatistics("name1", "1.001", null, + getResponse = provider.fetchFilteredClElementStatistics(ID_NAME1, ID_VERSION1, null, Instant.parse("2021-01-10T13:45:00.000Z"), null, 0); assertThat(getResponse.getClElementStatistics()).hasSize(2); } @Test void testGetParticipantStatsPerCL() throws Exception { - ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("getparStatCL"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); var mockClProvider = Mockito.mock(ControlLoopProvider.class); var provider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, mockClProvider); @@ -227,56 +264,63 @@ class TestMonitoringProvider { var controlLoop = new ControlLoop(); var element = new ControlLoopElement(); - element.setParticipantId(new ToscaConceptIdentifier("name1", "1.001")); + element.setParticipantId(new ToscaConceptIdentifier(ID_NAME1, ID_VERSION1)); controlLoop.setElements(Map.of(UUID.randomUUID(), element)); - when(mockClProvider.getControlLoop(new ToscaConceptIdentifier("testName", "1.001"))) - .thenReturn(controlLoop); + when(mockClProvider.getControlLoop(new ToscaConceptIdentifier(ID_NAME2, ID_VERSION1))).thenReturn(controlLoop); + + when(participantStatisticsProvider.getFilteredParticipantStatistics(eq(ID_NAME1), eq(ID_VERSION1), any(), any(), + eq(null), eq(SORT_DESC), eq(0))) + .thenReturn(List.of(inputParticipantStatistics.getStatisticsList().get(0), + inputParticipantStatistics.getStatisticsList().get(1))); - ParticipantStatisticsList getResponse = provider.fetchParticipantStatsPerControlLoop("testName", "1.001"); + ParticipantStatisticsList getResponse = provider.fetchParticipantStatsPerControlLoop(ID_NAME2, ID_VERSION1); assertThat(getResponse.getStatisticsList()).hasSize(2); assertEquals(getResponse.getStatisticsList().get(0).toString().replaceAll("\\s+", ""), inputParticipantStatistics.getStatisticsList().get(0).toString().replaceAll("\\s+", "")); - assertThat(provider.fetchParticipantStatsPerControlLoop("invalidCLName", "1.002").getStatisticsList()) + assertThat(provider.fetchParticipantStatsPerControlLoop(ID_INVALID_NAME, ID_VERSION2).getStatisticsList()) .isEmpty(); } @Test void testClElementStatsPerCL() throws Exception { // Setup a dummy Control loop data - ControlLoopElement mockClElement = new ControlLoopElement(); + var mockClElement = new ControlLoopElement(); mockClElement.setId(inputClElementStatistics.getClElementStatistics().get(0).getId()); mockClElement.setParticipantId(new ToscaConceptIdentifier( inputClElementStatistics.getClElementStatistics().get(0).getParticipantId().getName(), inputClElementStatistics.getClElementStatistics().get(0).getParticipantId().getVersion())); - ControlLoop mockCL = new ControlLoop(); + var mockCL = new ControlLoop(); mockCL.setElements(new LinkedHashMap<>()); mockCL.getElements().put(mockClElement.getId(), mockClElement); - ClRuntimeParameterGroup parameters = CommonTestData.geParameterGroup("getelemstatPerCL"); - participantStatisticsProvider = new ParticipantStatisticsProvider(parameters.getDatabaseProviderParameters()); - clElementStatisticsProvider = new ClElementStatisticsProvider(parameters.getDatabaseProviderParameters()); - ControlLoopProvider mockClProvider = Mockito.mock(ControlLoopProvider.class); + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); + var mockClProvider = Mockito.mock(ControlLoopProvider.class); var monitoringProvider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, mockClProvider); // Mock controlloop data to be returned for the given CL Id - when(mockClProvider.getControlLoop(new ToscaConceptIdentifier("testCLName", "1.001"))).thenReturn(mockCL); + when(mockClProvider.getControlLoop(new ToscaConceptIdentifier(ID_NAME3, ID_VERSION1))).thenReturn(mockCL); + + when(clElementStatisticsProvider.getFilteredClElementStatistics(eq(ID_NAME1), eq(ID_VERSION1), any(), any(), + anyMap(), eq(SORT_DESC), eq(0))) + .thenReturn(List.of(inputClElementStatistics.getClElementStatistics().get(0), + inputClElementStatistics.getClElementStatistics().get(1))); monitoringProvider.createClElementStatistics(inputClElementStatistics.getClElementStatistics()); ClElementStatisticsList getResponse = - monitoringProvider.fetchClElementStatsPerControlLoop("testCLName", "1.001"); + monitoringProvider.fetchClElementStatsPerControlLoop(ID_NAME3, ID_VERSION1); assertThat(getResponse.getClElementStatistics()).hasSize(2); assertEquals(getResponse.getClElementStatistics().get(1).toString().replaceAll("\\s+", ""), inputClElementStatistics.getClElementStatistics().get(1).toString().replaceAll("\\s+", "")); - assertThat( - monitoringProvider.fetchClElementStatsPerControlLoop("invalidCLName", "1.002").getClElementStatistics()) - .isEmpty(); + assertThat(monitoringProvider.fetchClElementStatsPerControlLoop(ID_INVALID_NAME, ID_VERSION2) + .getClElementStatistics()).isEmpty(); Map clElementIds = - monitoringProvider.getAllClElementsIdPerControlLoop("testCLName", "1.001"); + monitoringProvider.getAllClElementsIdPerControlLoop(ID_NAME3, ID_VERSION1); assertThat(clElementIds) .containsKey(inputClElementStatistics.getClElementStatistics().get(0).getId().toString()); } diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java index 77742aea9..eaf824623 100644 --- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java +++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/monitoring/rest/MonitoringQueryControllerTest.java @@ -141,7 +141,12 @@ class MonitoringQueryControllerTest extends CommonRestController { assertNotNull(result1); assertThat(result1.getClElementStatistics()).hasSize(2); - assertEquals(result1.getClElementStatistics().get(0), clElementStatisticsList.getClElementStatistics().get(0)); + + var clElementStat0 = clElementStatisticsList.getClElementStatistics().get(0); + for (var clElement : result1.getClElementStatistics()) { + assertEquals(clElement.getParticipantId().asConceptKey(), clElementStat0.getParticipantId().asConceptKey()); + assertEquals(clElement.getId(), clElementStat0.getId()); + } // Filter statistics based on timestamp Invocation.Builder invokeRequest2 = super.sendRequest(CLELEMENT_STATS_ENDPOINT + "?name=" @@ -155,7 +160,7 @@ class MonitoringQueryControllerTest extends CommonRestController { assertNotNull(result2); assertThat(result2.getClElementStatistics()).hasSize(1); - assertEquals(result1.getClElementStatistics().get(0), clElementStatisticsList.getClElementStatistics().get(0)); + assertEquals(result2.getClElementStatistics().get(0), clElementStat0); } @Test @@ -178,7 +183,7 @@ class MonitoringQueryControllerTest extends CommonRestController { assertNotNull(result1); assertThat(result1.getStatisticsList()).hasSize(2); - assertEquals(result1.getStatisticsList().get(0), participantStatisticsList.getStatisticsList().get(0)); + assertThat(result1.getStatisticsList()).contains(participantStatisticsList.getStatisticsList().get(0)); // Filter statistics based on timestamp Invocation.Builder invokeRequest2 = super.sendRequest(PARTICIPANT_STATS_ENDPOINT + "?name=" @@ -191,7 +196,7 @@ class MonitoringQueryControllerTest extends CommonRestController { assertNotNull(result2); assertThat(result2.getStatisticsList()).hasSize(1); - assertEquals(result1.getStatisticsList().get(0), participantStatisticsList.getStatisticsList().get(0)); + assertEquals(result2.getStatisticsList().get(0), participantStatisticsList.getStatisticsList().get(0)); } @Test diff --git a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/SupervisionMessagesTest.java b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/SupervisionMessagesTest.java index ade2723cb..93433f59c 100644 --- a/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/SupervisionMessagesTest.java +++ b/runtime-controlloop/src/test/java/org/onap/policy/clamp/controlloop/runtime/supervision/comm/SupervisionMessagesTest.java @@ -76,10 +76,8 @@ class SupervisionMessagesTest extends CommonRestController { clProvider = new ControlLoopProvider(controlLoopParameters.getDatabaseProviderParameters()); - var participantStatisticsProvider = - new ParticipantStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters()); - var clElementStatisticsProvider = - new ClElementStatisticsProvider(controlLoopParameters.getDatabaseProviderParameters()); + var participantStatisticsProvider = mock(ParticipantStatisticsProvider.class); + var clElementStatisticsProvider = mock(ClElementStatisticsProvider.class); var monitoringProvider = new MonitoringProvider(participantStatisticsProvider, clElementStatisticsProvider, clProvider); var participantProvider = new ParticipantProvider(controlLoopParameters.getDatabaseProviderParameters()); -- cgit 1.2.3-korg