b713e8e8f15e9e8b0ebfcab08f2986d18ef4bd39
[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.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertTrue;
29
30 import java.nio.file.Path;
31 import java.util.UUID;
32 import java.util.concurrent.TimeUnit;
33 import org.junit.AfterClass;
34 import org.junit.BeforeClass;
35 import org.junit.Test;
36 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
37 import org.onap.policy.controlloop.ControlLoopNotificationType;
38 import org.onap.policy.controlloop.VirtualControlLoopNotification;
39 import org.onap.policy.drools.persistence.SystemPersistenceConstants;
40 import org.onap.policy.drools.system.PolicyController;
41 import org.onap.policy.drools.system.PolicyEngineConstants;
42
43 /**
44  * ControlLoopMetrics Tests.
45  */
46 public class ControlLoopMetricsFeatureTest {
47
48     private static final String POLICY_CL_MGT = "POLICY-CL-MGT";
49     private static final Path configPath = SystemPersistenceConstants.getManager().getConfigurationPath();
50     private static PolicyController testController;
51
52     /**
53      * Setup method.
54      */
55     @BeforeClass
56     public static void setUp() {
57         SystemPersistenceConstants.getManager().setConfigurationDir("src/test/resources");
58         testController = PolicyEngineConstants.getManager().createPolicyController("metrics",
59                 SystemPersistenceConstants.getManager().getControllerProperties("metrics"));
60     }
61
62     @AfterClass
63     public static void tearDown() {
64         SystemPersistenceConstants.getManager().setConfigurationDir(configPath.toString());
65     }
66
67     @Test
68     public void testCacheDefaults() {
69         assertEquals(3, ControlLoopMetricsManager.getManager().getCacheSize());
70         assertEquals(2, ControlLoopMetricsManager.getManager().getTransactionTimeout());
71         assertEquals(0, ControlLoopMetricsManager.getManager().getCacheOccupancy());
72     }
73
74     @Test
75     public void testInvalidNotifications() {
76         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
77         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
78         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
79         this.testCacheDefaults();
80
81         UUID requestId = UUID.randomUUID();
82         notification.setRequestId(requestId);
83
84         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
85         assertNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
86         this.testCacheDefaults();
87     }
88
89     @Test
90     public void testValidActiveNotification() throws InterruptedException {
91         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
92         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
93         UUID requestId = UUID.randomUUID();
94         notification.setRequestId(requestId);
95         notification.setNotification(ControlLoopNotificationType.ACTIVE);
96
97         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
98         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId));
99         assertTrue(ControlLoopMetricsManager.getManager().getTransaction(requestId).getFrom()
100                         .contains(testController.getName()));
101         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(requestId).getNotificationTime());
102         assertTrue(ControlLoopMetricsManager.getManager().getCacheOccupancy() == 1);
103
104         /* wait for the entries to expire */
105         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
106                         .until(() -> ControlLoopMetricsManager.getManager().getTransaction(requestId) == null);
107
108         this.testCacheDefaults();
109     }
110
111     @Test
112     public void testReset() {
113         VirtualControlLoopNotification notification = this.generateNotification();
114         new ControlLoopMetricsFeature().beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT,
115                 notification);
116
117         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
118
119         ControlLoopMetricsManager.getManager().resetCache(ControlLoopMetricsManager.getManager().getCacheSize(),
120                 ControlLoopMetricsManager.getManager().getTransactionTimeout());
121         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
122         this.testCacheDefaults();
123     }
124
125     @Test
126     public void testRemoveTransaction() {
127         VirtualControlLoopNotification notification = this.generateNotification();
128         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
129         ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
130
131         ControlLoopMetricsManager.getManager().transactionEvent(testController, notification);
132         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
133         ControlLoopMetricsManager.getManager().removeTransaction(notification.getRequestId());
134         assertNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
135     }
136
137     @Test
138     public void testEviction() throws InterruptedException {
139         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
140         for (int i = 0; i < ControlLoopMetricsManager.getManager().getCacheSize(); i++) {
141             VirtualControlLoopNotification notification = generateNotification();
142             feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, notification);
143             assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(notification.getRequestId()));
144         }
145
146         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
147                         ControlLoopMetricsManager.getManager().getCacheOccupancy());
148
149         VirtualControlLoopNotification overflowNotification = generateNotification();
150         feature.beforeDeliver(testController, CommInfrastructure.DMAAP, POLICY_CL_MGT, overflowNotification);
151         assertEquals(ControlLoopMetricsManager.getManager().getCacheOccupancy(),
152                         ControlLoopMetricsManager.getManager().getCacheOccupancy());
153         assertNotNull(ControlLoopMetricsManager.getManager().getTransaction(overflowNotification.getRequestId()));
154         assertTrue(ControlLoopMetricsManager.getManager().getTransactionIds().size() == ControlLoopMetricsManager
155                         .getManager().getCacheSize());
156         assertTrue(ControlLoopMetricsManager.getManager().getCacheOccupancy() == ControlLoopMetricsManager.getManager()
157                         .getCacheSize());
158         assertFalse(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
159         assertFalse(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
160
161         /* wait for the entries to expire */
162         await().atMost(ControlLoopMetricsManager.getManager().getTransactionTimeout() + 1, TimeUnit.SECONDS)
163                         .until(() -> ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
164
165         ControlLoopMetricsManager.getManager().refresh();
166         assertTrue(ControlLoopMetricsManager.getManager().getTransactionIds().size() == ControlLoopMetricsManager
167                         .getManager().getCacheOccupancy());
168         assertFalse(ControlLoopMetricsManager.getManager().getCacheOccupancy() == ControlLoopMetricsManager.getManager()
169                         .getCacheSize());
170         assertTrue(ControlLoopMetricsManager.getManager().getTransactionIds().isEmpty());
171         assertTrue(ControlLoopMetricsManager.getManager().getTransactions().isEmpty());
172
173         this.testCacheDefaults();
174     }
175
176     private VirtualControlLoopNotification generateNotification() {
177         VirtualControlLoopNotification notification = new VirtualControlLoopNotification();
178         UUID requestId = UUID.randomUUID();
179         notification.setRequestId(requestId);
180         notification.setNotification(ControlLoopNotificationType.ACTIVE);
181         return notification;
182     }
183
184     @Test
185     public void getSequenceNumber() {
186         ControlLoopMetricsFeature feature = new ControlLoopMetricsFeature();
187         assertTrue(feature.getSequenceNumber() == ControlLoopMetricsFeature.FEATURE_SEQUENCE_PRIORITY);
188     }
189 }