2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018-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.drools.apps.controlloop.feature.trans;
23 import static org.awaitility.Awaitility.await;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertNotEquals;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
31 import java.nio.file.Path;
32 import java.util.UUID;
33 import java.util.concurrent.TimeUnit;
34 import org.junit.AfterClass;
35 import org.junit.Before;
36 import org.junit.BeforeClass;
37 import org.junit.Test;
38 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
39 import org.onap.policy.common.utils.resources.ResourceUtils;
40 import org.onap.policy.controlloop.ControlLoopNotificationType;
41 import org.onap.policy.controlloop.VirtualControlLoopNotification;
42 import org.onap.policy.controlloop.util.Serialization;
43 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
44 import org.onap.policy.drools.system.PolicyController;
45 import org.onap.policy.drools.system.PolicyEngineConstants;
48 * ControlLoopMetrics Tests.
50 public class ControlLoopMetricsFeatureTest {
52 private static final String POLICY_CL_MGT = "POLICY-CL-MGT";
53 private static final Path configPath = SystemPersistenceConstants.getManager().getConfigurationPath();
54 private static PolicyController testController;
56 private static void resetStats() {
57 PolicyEngineConstants.getManager().getStats().getGroupStat().setAverageExecutionTime(0d);
58 PolicyEngineConstants.getManager().getStats().getGroupStat().setLastExecutionTime(0L);
59 PolicyEngineConstants.getManager().getStats().getGroupStat().setLastStart(0L);
60 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedCount(0L);
61 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedFailCount(0L);
62 PolicyEngineConstants.getManager().getStats().getGroupStat().setPolicyExecutedSuccessCount(0L);
63 PolicyEngineConstants.getManager().getStats().getGroupStat().setTotalElapsedTime(0d);
70 public static void setUp() {
71 SystemPersistenceConstants.getManager().setConfigurationDir("src/test/resources");
72 testController = PolicyEngineConstants.getManager().createPolicyController("metrics",
73 SystemPersistenceConstants.getManager().getControllerProperties("metrics"));
77 public static void tearDown() {
78 SystemPersistenceConstants.getManager().setConfigurationDir(configPath.toString());
83 public void beforeTest() {
88 public void testCacheDefaults() {
89 assertEquals(3, ControlLoopMetricsManager.getManager().getCacheSize());
90 assertEquals(2, ControlLoopMetricsManager.getManager().getTransactionTimeout());
91 assertEquals(0, ControlLoopMetricsManager.getManager().getCacheOccupancy());
95 public void testInvalidNotifications() {
96 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
97 VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
98 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
99 this.testCacheDefaults();
101 UUID requestId = UUID.randomUUID();
102 notification.setRequestId(requestId);
104 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
105 assertNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
106 this.testCacheDefaults();
110 public void testValidActiveNotification() {
111 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
112 VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
113 UUID requestId = UUID.randomUUID();
114 notification.setRequestId(requestId);
115 notification.setNotification(ControlLoopNotificationType.ACTIVE);
117 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
118 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
119 assertTrue(ControlLoopMetricsManager.getManager().getTransaction(requestId).getFrom()
120 .contains(testController.getName()));
121 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId).getNotificationTime());
122 assertEquals(1, ControlLoopMetricsManager.getManager().getCacheOccupancy());
124 /* wait for the entries to expire */
125 await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
126 .until(() -> ControlLoopMetricsManager.getManager().getTransaction(requestId) == null);
128 this.testCacheDefaults();
132 public void testReset() {
133 VirtualControlLoopNotification notification = this.generateNotification();
134 new ControlLoopMetricsFeature().beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT,
137 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
139 ControlLoopMetricsManager.getManager().resetCache(ControlLoopMetricsManager.getManager().getCacheSize(),
140 ControlLoopMetricsManager.getManager().getTransactionTimeout());
141 assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
142 this.testCacheDefaults();
146 public void testRemoveTransaction() {
147 VirtualControlLoopNotification notification = this.generateNotification();
148 assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
149 ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
151 ControlLoopMetricsManager.getManager().transactionEvent(testController, notification);
152 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
153 ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
154 assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
158 public void testEviction() {
159 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
160 for (int i = 0; i < ControlLoopMetricsManager.getManager().getCacheSize(); i++) {
161 VirtualControlLoopNotification notification = generateNotification();
162 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
163 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
166 assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
167 ControlLoopMetricsManager.getManager().getCacheOccupancy());
169 VirtualControlLoopNotification overflowNotification = generateNotification();
170 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, overflowNotification);
171 assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
172 ControlLoopMetricsManager.getManager().getCacheOccupancy());
173 assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(overflowNotification.getRequestId()));
174 assertEquals(ControlLoopMetricsManager.getManager().getTransactionIds().size(),
175 ControlLoopMetricsManager.getManager().getCacheSize());
176 assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
177 ControlLoopMetricsManager.getManager().getCacheSize());
178 assertFalse(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
179 assertFalse(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
181 /* wait for the entries to expire */
182 await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
183 .until(() -> ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
185 ControlLoopMetricsManager.getManager().refresh();
186 assertEquals(ControlLoopMetricsManager.getManager().getTransactionIds().size(),
187 ControlLoopMetricsManager.getManager().getCacheOccupancy());
188 assertNotEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
189 ControlLoopMetricsManager.getManager().getCacheSize());
190 assertTrue(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
191 assertTrue(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
193 this.testCacheDefaults();
196 private VirtualControlLoopNotification generateNotification() {
197 VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
198 UUID requestId = UUID.randomUUID();
199 notification.setRequestId(requestId);
200 notification.setNotification(ControlLoopNotificationType.ACTIVE);
205 public void getSequenceNumber() {
206 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
207 assertEquals(ControlLoopMetricsFeature.FEATURE_SEQUENCE_PRIORITY, feature.getSequenceNumber());
211 public void testSuccessControlLoop() {
212 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
214 String activeNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-active.json");
215 VirtualControlLoopNotification active =
216 Serialization.gsonPretty.fromJson(activeNotification, VirtualControlLoopNotification.class);
217 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, active);
218 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
220 String opStartNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-operation.json");
221 VirtualControlLoopNotification opStart =
222 Serialization.gsonPretty.fromJson(opStartNotification, VirtualControlLoopNotification.class);
223 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, opStart);
224 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
226 String permitNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-permit.json");
227 VirtualControlLoopNotification permit =
228 Serialization.gsonPretty.fromJson(permitNotification, VirtualControlLoopNotification.class);
229 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, permit);
230 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
232 String restartNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-restart.json");
233 VirtualControlLoopNotification restart =
234 Serialization.gsonPretty.fromJson(restartNotification, VirtualControlLoopNotification.class);
235 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, restart);
236 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
238 String restartSuccessNotification =
239 ResourceUtils.getResourceAsString("policy-cl-mgt-restart-success.json");
240 VirtualControlLoopNotification restartSuccess =
241 Serialization.gsonPretty.fromJson(restartSuccessNotification, VirtualControlLoopNotification.class);
242 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, restartSuccess);
243 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
245 String finalSuccessNotification =
246 ResourceUtils.getResourceAsString("policy-cl-mgt-final-success.json");
247 VirtualControlLoopNotification finalSuccess =
248 Serialization.gsonPretty.fromJson(finalSuccessNotification, VirtualControlLoopNotification.class);
249 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, finalSuccess);
250 assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
252 PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedSuccessCount());
254 PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedFailCount());
255 assertEquals(1, PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedCount());
256 assertEquals(1587409937684L,
257 PolicyEngineConstants.getManager().getStats().getGroupStat().getLastExecutionTime());
259 PolicyEngineConstants.getManager().getStats().getGroupStat().getAverageExecutionTime(), 0.0d);
260 assertEquals(1587409937223L,
261 PolicyEngineConstants.getManager().getStats().getGroupStat().getLastStart());
263 PolicyEngineConstants.getManager().getStats().getGroupStat().getTotalElapsedTime(), 0.0d);
267 public void testUntrackedNotifications() throws InterruptedException {
268 ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
270 String finalSuccessNotification =
271 ResourceUtils.getResourceAsString("policy-cl-mgt-final-success.json");
272 VirtualControlLoopNotification finalSuccess =
273 Serialization.gsonPretty.fromJson(finalSuccessNotification, VirtualControlLoopNotification.class);
274 finalSuccess.setRequestId(UUID.randomUUID());
275 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, finalSuccess);
276 assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
278 String opStartNotification =
279 ResourceUtils.getResourceAsString("policy-cl-mgt-operation.json");
280 VirtualControlLoopNotification opStart =
281 Serialization.gsonPretty.fromJson(opStartNotification, VirtualControlLoopNotification.class);
282 feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, opStart);
283 assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
285 Thread.sleep((ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1) * 1000L); // NOSONAR
286 assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());