2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.pap.main.comm;
23 import static org.assertj.core.api.Assertions.assertThatCode;
24 import static org.mockito.ArgumentMatchers.any;
25 import static org.mockito.ArgumentMatchers.eq;
26 import static org.mockito.Mockito.never;
27 import static org.mockito.Mockito.verify;
28 import static org.mockito.Mockito.when;
30 import java.util.List;
31 import java.util.function.Consumer;
32 import java.util.function.Supplier;
33 import org.junit.AfterClass;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.mockito.Mock;
38 import org.mockito.junit.MockitoJUnitRunner;
39 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
40 import org.onap.policy.common.utils.services.Registry;
41 import org.onap.policy.models.base.PfModelException;
42 import org.onap.policy.models.pdp.concepts.Pdp;
43 import org.onap.policy.models.pdp.concepts.PdpGroup;
44 import org.onap.policy.models.pdp.concepts.PdpStatistics;
45 import org.onap.policy.models.pdp.concepts.PdpStatus;
46 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
47 import org.onap.policy.models.pdp.enums.PdpState;
48 import org.onap.policy.models.provider.PolicyModelsProvider;
49 import org.onap.policy.pap.main.PapConstants;
50 import org.onap.policy.pap.main.PolicyModelsProviderFactoryWrapper;
51 import org.onap.policy.pap.main.parameters.PdpParameters;
53 @RunWith(MockitoJUnitRunner.class)
54 public class PdpStatisticsListenerTest {
55 private static final long MAX_MSG_AGE_MS = 5000;
57 private static final String GROUP = "myGroup";
58 private static final String PDP_TYPE = "mySubgroup";
59 private static final String MY_NAME = "myName";
60 private static final CommInfrastructure INFRA = CommInfrastructure.DMAAP;
61 private static final String TOPIC = "MyTopic";
63 private static final long COUNT = 10;
66 private PdpParameters params;
69 private PolicyModelsProviderFactoryWrapper provFactory;
72 private PolicyModelsProvider provider;
74 private PdpStatus msg;
75 private PdpStatistics stats;
77 private PdpStatisticsListener listener;
81 public static void tearDownAfterClass() {
82 Registry.newRegistry();
89 public void setUp() throws PfModelException {
90 when(params.getMaxMessageAgeMs()).thenReturn(MAX_MSG_AGE_MS);
91 when(provFactory.create()).thenReturn(provider);
92 when(provider.getFilteredPdpGroups(any())).thenReturn(List.of());
94 Registry.newRegistry();
96 Registry.register(PapConstants.REG_PAP_DAO_FACTORY, provFactory);
97 Registry.register(PapConstants.REG_PDP_MODIFY_LOCK, new Object());
99 stats = new PdpStatistics();
100 stats.setPdpGroupName(GROUP);
101 stats.setPdpSubGroupName(PDP_TYPE);
102 stats.setPdpInstanceId(MY_NAME);
103 stats.setPolicyDeployCount(COUNT);
104 stats.setPolicyDeployFailCount(COUNT);
105 stats.setPolicyDeploySuccessCount(COUNT);
106 stats.setPolicyExecutedCount(COUNT);
107 stats.setPolicyExecutedFailCount(COUNT);
108 stats.setPolicyExecutedSuccessCount(COUNT);
110 msg = new PdpStatus();
111 msg.setPdpGroup(GROUP);
112 msg.setPdpType(PDP_TYPE);
113 msg.setName(MY_NAME);
114 msg.setStatistics(stats);
115 msg.setTimestampMs(System.currentTimeMillis());
117 listener = new PdpStatisticsListener(params);
121 public void testOnTopicEvent() throws PfModelException {
122 listener.onTopicEvent(INFRA, TOPIC, msg);
123 verify(provFactory).create();
127 public void testOnTopicEventOutOfDate() throws PfModelException {
128 msg.setTimestampMs(System.currentTimeMillis() - MAX_MSG_AGE_MS - 1);
129 listener.onTopicEvent(INFRA, TOPIC, msg);
131 verify(provFactory, never()).create();
135 public void testOnTopicEventDbException() throws PfModelException {
136 when(provFactory.create()).thenThrow(new RuntimeException("expected exception"));
137 assertThatCode(() -> listener.onTopicEvent(INFRA, TOPIC, msg)).doesNotThrowAnyException();
141 public void testHandleStatistics() throws PfModelException {
143 listener.onTopicEvent(INFRA, TOPIC, msg);
144 verify(provFactory).create();
145 verify(provider, never()).createPdpStatistics(any());
148 final Pdp pdp = new Pdp();
149 pdp.setInstanceId(MY_NAME);
152 final Pdp pdp2 = new Pdp();
153 pdp2.setInstanceId(MY_NAME + "aaa");
155 // matches, but PDP doesn't match
156 final PdpSubGroup subgrp = new PdpSubGroup();
157 subgrp.setPdpType(PDP_TYPE);
158 subgrp.setPdpInstances(List.of(pdp2));
160 // doesn't match, but has matching PDP
161 final PdpSubGroup subgrp2 = new PdpSubGroup();
162 subgrp2.setPdpType(PDP_TYPE + "bbb");
163 subgrp2.setPdpInstances(List.of(pdp));
165 // has matching subgroup
166 final PdpGroup group = new PdpGroup();
167 group.setPdpSubgroups(List.of(subgrp2, subgrp));
169 // no matching subgroup
170 final PdpGroup group2 = new PdpGroup();
171 group2.setPdpSubgroups(List.of(subgrp2));
173 when(provider.getFilteredPdpGroups(any())).thenReturn(List.of(group2, group));
175 // nothing matches, so nothing should be inserted
176 listener.onTopicEvent(INFRA, TOPIC, msg);
177 verify(provider, never()).createPdpStatistics(any());
179 // add a matching pdp to the matching subgroup
180 subgrp.setPdpInstances(List.of(pdp, pdp));
182 // now it should update the statistics
183 listener.onTopicEvent(INFRA, TOPIC, msg);
184 verify(provider).createPdpStatistics(eq(List.of(stats)));
188 public void testValidStatistics() throws PfModelException {
189 validateStats(msg::getState, msg::setState, PdpState.TERMINATED);
190 validateStats(msg::getStatistics, msg::setStatistics, null);
191 validateStats(msg::getPdpGroup, msg::setPdpGroup, null);
192 validateStats(msg::getPdpType, msg::setPdpType, null);
193 validateStats(msg::getName, msg::setName, null);
194 validateStats(stats::getPdpGroupName, stats::setPdpGroupName, GROUP + "ccc");
195 validateStats(stats::getPdpSubGroupName, stats::setPdpSubGroupName, PDP_TYPE + "ddd");
196 validateStats(stats::getPdpInstanceId, stats::setPdpInstanceId, MY_NAME + "eee");
197 validateStats(stats::getPolicyDeployCount, stats::setPolicyDeployCount, -1L);
198 validateStats(stats::getPolicyDeployFailCount, stats::setPolicyDeployFailCount, -1L);
199 validateStats(stats::getPolicyDeploySuccessCount, stats::setPolicyDeploySuccessCount, -1L);
200 validateStats(stats::getPolicyExecutedCount, stats::setPolicyExecutedCount, -1L);
201 validateStats(stats::getPolicyExecutedFailCount, stats::setPolicyExecutedFailCount, -1L);
202 validateStats(stats::getPolicyExecutedSuccessCount, stats::setPolicyExecutedSuccessCount, -1L);
204 // verify that all zeroes are OK
205 stats = new PdpStatistics();
206 stats.setPdpGroupName(GROUP);
207 stats.setPdpSubGroupName(PDP_TYPE);
208 stats.setPdpInstanceId(MY_NAME);
210 msg.setStatistics(stats);
212 listener.onTopicEvent(INFRA, TOPIC, msg);
213 verify(provFactory).create();
217 * Verifies that the provider is never created when one of the message's fields is set
218 * to an invalid value.
220 * @param <T> value type
221 * @param getter method to get the current value of the field
222 * @param setter method to change the field
223 * @param invalidValue invalid value for the field
224 * @throws PfModelException if an error occurs
226 private <T> void validateStats(Supplier<T> getter, Consumer<T> setter, T invalidValue) throws PfModelException {
227 final T saved = getter.get();
228 setter.accept(invalidValue);
230 listener.onTopicEvent(INFRA, TOPIC, msg);
231 verify(provFactory, never()).create();
233 setter.accept(saved);