ba39b2799651ddaa950b9d4e5989791b7d8d5973
[policy/drools-applications.git] / controlloop / common / feature-controlloop-trans / src / test / java / org / onap / policy / drools / apps / controlloop / feature / trans / ControlLoopMetricsFeatureTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
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
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.drools.apps.controlloop.feature.trans;
22
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;
30
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;
46
47 /**
48  * ControlLoopMetrics Tests.
49  */
50 public class ControlLoopMetricsFeatureTest {
51
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;
55
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);
64     }
65
66     /**
67      * Setup method.
68      */
69     @BeforeClass
70     public static void setUp() {
71         SystemPersistenceConstants.getManager().setConfigurationDir("src/test/resources");
72         testController = PolicyEngineConstants.getManager().createPolicyController("metrics",
73                 SystemPersistenceConstants.getManager().getControllerProperties("metrics"));
74     }
75
76     @AfterClass
77     public static void tearDown() {
78         SystemPersistenceConstants.getManager().setConfigurationDir(configPath.toString());
79         resetStats();
80     }
81
82     @Before
83     public void beforeTest() {
84         resetStats();
85     }
86
87     @Test
88     public void testCacheDefaults() {
89         assertEquals(3, ControlLoopMetricsManager.getManager().getCacheSize());
90         assertEquals(2, ControlLoopMetricsManager.getManager().getTransactionTimeout());
91         assertEquals(0, ControlLoopMetricsManager.getManager().getCacheOccupancy());
92     }
93
94     @Test
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();
100
101         UUID requestId = UUID.randomUUID();
102         notification.setRequestId(requestId);
103
104         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
105         assertNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
106         this.testCacheDefaults();
107     }
108
109     @Test
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);
116
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());
123
124         /* wait for the entries to expire */
125         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
126                         .until(() -> ControlLoopMetricsManager.getManager().getTransaction(requestId) == null);
127
128         this.testCacheDefaults();
129     }
130
131     @Test
132     public void testReset() {
133         VirtualControlLoopNotification notification = this.generateNotification();
134         new ControlLoopMetricsFeature().beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT,
135                 notification);
136
137         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
138
139         ControlLoopMetricsManager.getManager().resetCache(ControlLoopMetricsManager.getManager().getCacheSize(),
140                 ControlLoopMetricsManager.getManager().getTransactionTimeout());
141         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
142         this.testCacheDefaults();
143     }
144
145     @Test
146     public void testRemoveTransaction() {
147         VirtualControlLoopNotification notification = this.generateNotification();
148         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
149         ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
150
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()));
155     }
156
157     @Test
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()));
164         }
165
166         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
167                         ControlLoopMetricsManager.getManager().getCacheOccupancy());
168
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());
180
181         /* wait for the entries to expire */
182         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
183                         .until(() -> ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
184
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());
192
193         this.testCacheDefaults();
194     }
195
196     private VirtualControlLoopNotification generateNotification() {
197         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
198         UUID requestId = UUID.randomUUID();
199         notification.setRequestId(requestId);
200         notification.setNotification(ControlLoopNotificationType.ACTIVE);
201         return notification;
202     }
203
204     @Test
205     public void getSequenceNumber() {
206         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
207         assertEquals(ControlLoopMetricsFeature.FEATURE_SEQUENCE_PRIORITY, feature.getSequenceNumber());
208     }
209
210     @Test
211     public void testSuccessControlLoop() {
212         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
213
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());
219
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());
225
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());
231
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());
237
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());
244
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());
251         assertEquals(1,
252                 PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedSuccessCount());
253         assertEquals(0,
254                 PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedFailCount());
255         assertEquals(1, PolicyEngineConstants.getManager().getStats().getGroupStat().getPolicyExecutedCount());
256         assertEquals(1587409937684L,
257                 PolicyEngineConstants.getManager().getStats().getGroupStat().getLastExecutionTime());
258         assertEquals(461d,
259                 PolicyEngineConstants.getManager().getStats().getGroupStat().getAverageExecutionTime(), 0.0d);
260         assertEquals(1587409937223L,
261                 PolicyEngineConstants.getManager().getStats().getGroupStat().getLastStart());
262         assertEquals(461d,
263                 PolicyEngineConstants.getManager().getStats().getGroupStat().getTotalElapsedTime(), 0.0d);
264     }
265
266     @Test
267     public void testUntrackedNotifications() throws InterruptedException {
268         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
269
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());
277
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());
284
285         Thread.sleep((ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1) * 1000L);  // NOSONAR
286         assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
287     }
288
289 }