c0d1ed0e72a773424f544adffa9c3c72915c1459
[policy/pap.git] / main / src / test / java / org / onap / policy / pap / main / comm / PdpStatisticsListenerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.policy.pap.main.comm;
22
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;
29
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;
52
53 @RunWith(MockitoJUnitRunner.class)
54 public class PdpStatisticsListenerTest {
55     private static final long MAX_MSG_AGE_MS = 5000;
56
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";
62
63     private static final long COUNT = 10;
64
65     @Mock
66     private PdpParameters params;
67
68     @Mock
69     private PolicyModelsProviderFactoryWrapper provFactory;
70
71     @Mock
72     private PolicyModelsProvider provider;
73
74     private PdpStatus msg;
75     private PdpStatistics stats;
76
77     private PdpStatisticsListener listener;
78
79
80     @AfterClass
81     public static void tearDownAfterClass() {
82         Registry.newRegistry();
83     }
84
85     /**
86      * Sets up.
87      */
88     @Before
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());
93
94         Registry.newRegistry();
95
96         Registry.register(PapConstants.REG_PAP_DAO_FACTORY, provFactory);
97         Registry.register(PapConstants.REG_PDP_MODIFY_LOCK, new Object());
98
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);
109
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());
116
117         listener = new PdpStatisticsListener(params);
118     }
119
120     @Test
121     public void testOnTopicEvent() throws PfModelException {
122         listener.onTopicEvent(INFRA, TOPIC, msg);
123         verify(provFactory).create();
124     }
125
126     @Test
127     public void testOnTopicEventOutOfDate() throws PfModelException {
128         msg.setTimestampMs(System.currentTimeMillis() - MAX_MSG_AGE_MS - 1);
129         listener.onTopicEvent(INFRA, TOPIC, msg);
130
131         verify(provFactory, never()).create();
132     }
133
134     @Test
135     public void testOnTopicEventDbException() throws PfModelException {
136         when(provFactory.create()).thenThrow(new RuntimeException("expected exception"));
137         assertThatCode(() -> listener.onTopicEvent(INFRA, TOPIC, msg)).doesNotThrowAnyException();
138     }
139
140     @Test
141     public void testHandleStatistics() throws PfModelException {
142         // no matching group
143         listener.onTopicEvent(INFRA, TOPIC, msg);
144         verify(provFactory).create();
145         verify(provider, never()).createPdpStatistics(any());
146
147         // matches
148         final Pdp pdp = new Pdp();
149         pdp.setInstanceId(MY_NAME);
150
151         // doesn't match
152         final Pdp pdp2 = new Pdp();
153         pdp2.setInstanceId(MY_NAME + "aaa");
154
155         // matches, but PDP doesn't match
156         final PdpSubGroup subgrp = new PdpSubGroup();
157         subgrp.setPdpType(PDP_TYPE);
158         subgrp.setPdpInstances(List.of(pdp2));
159
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));
164
165         // has matching subgroup
166         final PdpGroup group = new PdpGroup();
167         group.setPdpSubgroups(List.of(subgrp2, subgrp));
168
169         // no matching subgroup
170         final PdpGroup group2 = new PdpGroup();
171         group2.setPdpSubgroups(List.of(subgrp2));
172
173         when(provider.getFilteredPdpGroups(any())).thenReturn(List.of(group2, group));
174
175         // nothing matches, so nothing should be inserted
176         listener.onTopicEvent(INFRA, TOPIC, msg);
177         verify(provider, never()).createPdpStatistics(any());
178
179         // add a matching pdp to the matching subgroup
180         subgrp.setPdpInstances(List.of(pdp, pdp));
181
182         // now it should update the statistics
183         listener.onTopicEvent(INFRA, TOPIC, msg);
184         verify(provider).createPdpStatistics(eq(List.of(stats)));
185     }
186
187     @Test
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);
203
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);
209
210         msg.setStatistics(stats);
211
212         listener.onTopicEvent(INFRA, TOPIC, msg);
213         verify(provFactory).create();
214     }
215
216     /**
217      * Verifies that the provider is never created when one of the message's fields is set
218      * to an invalid value.
219      *
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
225      */
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);
229
230         listener.onTopicEvent(INFRA, TOPIC, msg);
231         verify(provFactory, never()).create();
232
233         setter.accept(saved);
234     }
235 }