eeb382ae1eaabac196f24d968eb9ebce87a4ee64
[policy/drools-applications.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2018-2020 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.BeforeClass;
36 import org.junit.Test;
37 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
38 import org.onap.policy.common.utils.resources.ResourceUtils;
39 import org.onap.policy.controlloop.ControlLoopNotificationType;
40 import org.onap.policy.controlloop.VirtualControlLoopNotification;
41 import org.onap.policy.controlloop.util.Serialization;
42 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
43 import org.onap.policy.drools.system.PolicyController;
44 import org.onap.policy.drools.system.PolicyEngineConstants;
45
46 /**
47  * ControlLoopMetrics Tests.
48  */
49 public class ControlLoopMetricsFeatureTest {
50
51     private static final String POLICY_CL_MGT = "POLICY-CL-MGT";
52     private static final Path configPath = SystemPersistenceConstants.getManager().getConfigurationPath();
53     private static PolicyController testController;
54
55     /**
56      * Setup method.
57      */
58     @BeforeClass
59     public static void setUp() {
60         SystemPersistenceConstants.getManager().setConfigurationDir("src/test/resources");
61         testController = PolicyEngineConstants.getManager().createPolicyController("metrics",
62                 SystemPersistenceConstants.getManager().getControllerProperties("metrics"));
63     }
64
65     @AfterClass
66     public static void tearDown() {
67         SystemPersistenceConstants.getManager().setConfigurationDir(configPath.toString());
68     }
69
70     @Test
71     public void testCacheDefaults() {
72         assertEquals(3, ControlLoopMetricsManager.getManager().getCacheSize());
73         assertEquals(2, ControlLoopMetricsManager.getManager().getTransactionTimeout());
74         assertEquals(0, ControlLoopMetricsManager.getManager().getCacheOccupancy());
75     }
76
77     @Test
78     public void testInvalidNotifications() {
79         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
80         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
81         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
82         this.testCacheDefaults();
83
84         UUID requestId = UUID.randomUUID();
85         notification.setRequestId(requestId);
86
87         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
88         assertNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
89         this.testCacheDefaults();
90     }
91
92     @Test
93     public void testValidActiveNotification() {
94         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
95         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
96         UUID requestId = UUID.randomUUID();
97         notification.setRequestId(requestId);
98         notification.setNotification(ControlLoopNotificationType.ACTIVE);
99
100         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
101         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
102         assertTrue(ControlLoopMetricsManager.getManager().getTransaction(requestId).getFrom()
103                         .contains(testController.getName()));
104         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId).getNotificationTime());
105         assertEquals(1, ControlLoopMetricsManager.getManager().getCacheOccupancy());
106
107         /* wait for the entries to expire */
108         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
109                         .until(() -> ControlLoopMetricsManager.getManager().getTransaction(requestId) == null);
110
111         this.testCacheDefaults();
112     }
113
114     @Test
115     public void testReset() {
116         VirtualControlLoopNotification notification = this.generateNotification();
117         new ControlLoopMetricsFeature().beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT,
118                 notification);
119
120         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
121
122         ControlLoopMetricsManager.getManager().resetCache(ControlLoopMetricsManager.getManager().getCacheSize(),
123                 ControlLoopMetricsManager.getManager().getTransactionTimeout());
124         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
125         this.testCacheDefaults();
126     }
127
128     @Test
129     public void testRemoveTransaction() {
130         VirtualControlLoopNotification notification = this.generateNotification();
131         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
132         ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
133
134         ControlLoopMetricsManager.getManager().transactionEvent(testController, notification);
135         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
136         ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
137         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
138     }
139
140     @Test
141     public void testEviction() {
142         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
143         for (int i = 0; i < ControlLoopMetricsManager.getManager().getCacheSize(); i++) {
144             VirtualControlLoopNotification notification = generateNotification();
145             feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
146             assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
147         }
148
149         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
150                         ControlLoopMetricsManager.getManager().getCacheOccupancy());
151
152         VirtualControlLoopNotification overflowNotification = generateNotification();
153         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, overflowNotification);
154         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
155                         ControlLoopMetricsManager.getManager().getCacheOccupancy());
156         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(overflowNotification.getRequestId()));
157         assertEquals(ControlLoopMetricsManager.getManager().getTransactionIds().size(),
158                 ControlLoopMetricsManager.getManager().getCacheSize());
159         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
160                 ControlLoopMetricsManager.getManager().getCacheSize());
161         assertFalse(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
162         assertFalse(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
163
164         /* wait for the entries to expire */
165         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
166                         .until(() -> ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
167
168         ControlLoopMetricsManager.getManager().refresh();
169         assertEquals(ControlLoopMetricsManager.getManager().getTransactionIds().size(),
170                 ControlLoopMetricsManager.getManager().getCacheOccupancy());
171         assertNotEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
172                 ControlLoopMetricsManager.getManager().getCacheSize());
173         assertTrue(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
174         assertTrue(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
175
176         this.testCacheDefaults();
177     }
178
179     private VirtualControlLoopNotification generateNotification() {
180         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
181         UUID requestId = UUID.randomUUID();
182         notification.setRequestId(requestId);
183         notification.setNotification(ControlLoopNotificationType.ACTIVE);
184         return notification;
185     }
186
187     @Test
188     public void getSequenceNumber() {
189         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
190         assertEquals(feature.getSequenceNumber(), ControlLoopMetricsFeature.FEATURE_SEQUENCE_PRIORITY);
191     }
192
193     @Test
194     public void testSuccessControlLoop() {
195         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
196
197         String activeNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-active.json");
198         VirtualControlLoopNotification active =
199                 Serialization.gsonPretty.fromJson(activeNotification, VirtualControlLoopNotification.class);
200         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, active);
201         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
202
203         String opStartNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-operation.json");
204         VirtualControlLoopNotification opStart =
205                 Serialization.gsonPretty.fromJson(opStartNotification, VirtualControlLoopNotification.class);
206         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, opStart);
207         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
208
209         String permitNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-permit.json");
210         VirtualControlLoopNotification permit =
211                 Serialization.gsonPretty.fromJson(permitNotification, VirtualControlLoopNotification.class);
212         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, permit);
213         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
214
215         String restartNotification = ResourceUtils.getResourceAsString("policy-cl-mgt-restart.json");
216         VirtualControlLoopNotification restart =
217                 Serialization.gsonPretty.fromJson(restartNotification, VirtualControlLoopNotification.class);
218         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, restart);
219         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
220
221         String restartSuccessNotification =
222                 ResourceUtils.getResourceAsString("policy-cl-mgt-restart-success.json");
223         VirtualControlLoopNotification restartSuccess =
224                 Serialization.gsonPretty.fromJson(restartSuccessNotification, VirtualControlLoopNotification.class);
225         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, restartSuccess);
226         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
227
228         String finalSuccessNotification =
229                 ResourceUtils.getResourceAsString("policy-cl-mgt-final-success.json");
230         VirtualControlLoopNotification finalSuccess =
231                 Serialization.gsonPretty.fromJson(finalSuccessNotification, VirtualControlLoopNotification.class);
232         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, finalSuccess);
233         assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
234     }
235
236     @Test
237     public void testUntrackedNotifications() throws InterruptedException {
238         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
239
240         String finalSuccessNotification =
241                 ResourceUtils.getResourceAsString("policy-cl-mgt-final-success.json");
242         VirtualControlLoopNotification finalSuccess =
243                 Serialization.gsonPretty.fromJson(finalSuccessNotification, VirtualControlLoopNotification.class);
244         finalSuccess.setRequestId(UUID.randomUUID());
245         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, finalSuccess);
246         assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
247
248         String opStartNotification =
249                 ResourceUtils.getResourceAsString("policy-cl-mgt-operation.json");
250         VirtualControlLoopNotification opStart =
251                 Serialization.gsonPretty.fromJson(opStartNotification, VirtualControlLoopNotification.class);
252         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, opStart);
253         assertEquals(1, ControlLoopMetricsManager.getManager().getTransactionIds().size());
254
255         Thread.sleep((ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1) * 1000L);  // NOSONAR
256         assertEquals(0, ControlLoopMetricsManager.getManager().getTransactionIds().size());
257     }
258 }