Sonar Critical Fix
[dcaegen2/analytics/tca.git] / dcae-analytics-cdap-tca / src / test / java / org / openecomp / dcae / apod / analytics / cdap / tca / flowlet / TCAVESAlertsAbatementFlowletTest.java
1 /*\r
2  * ===============================LICENSE_START======================================\r
3  *  dcae-analytics\r
4  * ================================================================================\r
5  *    Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
6  * ================================================================================\r
7  *  Licensed under the Apache License, Version 2.0 (the "License");\r
8  *  you may not use this file except in compliance with the License.\r
9  *   You may obtain a copy of the License at\r
10  *\r
11  *          http://www.apache.org/licenses/LICENSE-2.0\r
12  *\r
13  *  Unless required by applicable law or agreed to in writing, software\r
14  *  distributed under the License is distributed on an "AS IS" BASIS,\r
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
16  *  See the License for the specific language governing permissions and\r
17  *  limitations under the License.\r
18  *  ============================LICENSE_END===========================================\r
19  */\r
20 \r
21 package org.openecomp.dcae.apod.analytics.cdap.tca.flowlet;\r
22 \r
23 import co.cask.cdap.api.dataset.lib.ObjectMappedTable;\r
24 import co.cask.cdap.api.flow.flowlet.FlowletContext;\r
25 import co.cask.cdap.api.flow.flowlet.OutputEmitter;\r
26 import com.google.common.collect.ImmutableList;\r
27 import org.junit.Test;\r
28 import org.openecomp.dcae.apod.analytics.cdap.common.CDAPComponentsConstants;\r
29 import org.openecomp.dcae.apod.analytics.cdap.common.domain.tca.ThresholdCalculatorOutput;\r
30 import org.openecomp.dcae.apod.analytics.cdap.common.exception.CDAPSettingsException;\r
31 import org.openecomp.dcae.apod.analytics.cdap.common.persistance.tca.TCAAlertsAbatementEntity;\r
32 import org.openecomp.dcae.apod.analytics.cdap.tca.BaseAnalyticsCDAPTCAUnitTest;\r
33 import org.openecomp.dcae.apod.analytics.cdap.tca.settings.TCAPolicyPreferences;\r
34 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.ClosedLoopEventStatus;\r
35 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.MetricsPerEventName;\r
36 import org.openecomp.dcae.apod.analytics.model.domain.policy.tca.Threshold;\r
37 import org.openecomp.dcae.apod.analytics.tca.utils.TCAUtils;\r
38 \r
39 import java.util.Date;\r
40 import java.util.List;\r
41 \r
42 import static org.mockito.ArgumentMatchers.any;\r
43 import static org.mockito.ArgumentMatchers.eq;\r
44 import static org.mockito.Mockito.doNothing;\r
45 import static org.mockito.Mockito.mock;\r
46 import static org.mockito.Mockito.times;\r
47 import static org.mockito.Mockito.verify;\r
48 import static org.mockito.Mockito.when;\r
49 \r
50 /**\r
51  * @author Rajiv Singla . Creation Date: 9/12/2017.\r
52  */\r
53 @SuppressWarnings("unchecked")\r
54 public class TCAVESAlertsAbatementFlowletTest extends BaseAnalyticsCDAPTCAUnitTest {\r
55 \r
56     private static final TCAPolicyPreferences sampleTCAPolicyPreferences = getSampleTCAPolicyPreferences();\r
57     private static final List<MetricsPerEventName> metricsPerEventNames = sampleTCAPolicyPreferences\r
58             .getMetricsPerEventName();\r
59     private final OutputEmitter<String> mockOutputEmitter = mock(OutputEmitter.class);\r
60 \r
61     private class TestTCAVESAlertsAbatementFlowlet extends TCAVESAlertsAbatementFlowlet {\r
62 \r
63         public TestTCAVESAlertsAbatementFlowlet(String tcaAlertsAbatementTableName) {\r
64             super(tcaAlertsAbatementTableName);\r
65             this.alertsAbatementOutputEmitter = mockOutputEmitter;\r
66             doNothing().when(mockOutputEmitter).emit(any(String.class));\r
67         }\r
68     }\r
69 \r
70     @Test\r
71     public void testConfigure() throws Exception {\r
72         final TCAVESAlertsAbatementFlowlet tcavesAlertsAbatementFlowlet =\r
73                 new TCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
74         assertFlowletNameAndDescription(CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_NAME_FLOWLET,\r
75                 CDAPComponentsConstants.TCA_FIXED_VES_ALERTS_ABATEMENT_DESCRIPTION_FLOWLET,\r
76                 tcavesAlertsAbatementFlowlet);\r
77     }\r
78 \r
79     @Test(expected = CDAPSettingsException.class)\r
80     public void testDetermineAbatementAlertsWhenViolatedMetricsEventNameIsBlank() throws Exception {\r
81 \r
82         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
83                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
84         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET);\r
85         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
86                 getMockThresholdCalculatorOutput(violatedThreshold);\r
87         when(mockThresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn("");\r
88 \r
89         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
90     }\r
91 \r
92     @Test\r
93     public void testDetermineAbatementAlertsWhenControlLoopTypeIsONSET() throws Exception {\r
94 \r
95         final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";\r
96         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
97                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
98 \r
99         final FlowletContext mockFlowletContext = mock(FlowletContext.class);\r
100         final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);\r
101         when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);\r
102         tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);\r
103 \r
104         doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
105 \r
106         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ONSET);\r
107         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
108                 getMockThresholdCalculatorOutput(violatedThreshold);\r
109 \r
110         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
111         verify(mockObjectMappedTable,\r
112                 times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
113         verify(mockOutputEmitter, times(1)).emit(any(String.class));\r
114 \r
115     }\r
116 \r
117 \r
118     @Test\r
119     public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousAlertWasSent() throws Exception {\r
120 \r
121         final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";\r
122         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
123                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
124 \r
125         final FlowletContext mockFlowletContext = mock(FlowletContext.class);\r
126         final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);\r
127         when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);\r
128         tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);\r
129 \r
130         doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
131         final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class);\r
132         when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity);\r
133         when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(null);\r
134 \r
135         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);\r
136         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
137                 getMockThresholdCalculatorOutput(violatedThreshold);\r
138 \r
139         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
140         verify(mockObjectMappedTable,\r
141                 times(1)).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
142         verify(mockOutputEmitter, times(1)).emit(any(String.class));\r
143 \r
144     }\r
145 \r
146     @Test\r
147     public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndPreviousAlertWasAlreadySent() throws\r
148             Exception {\r
149 \r
150         final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";\r
151         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
152                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
153 \r
154         final FlowletContext mockFlowletContext = mock(FlowletContext.class);\r
155         final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);\r
156         when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);\r
157         tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);\r
158 \r
159         doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
160         final TCAAlertsAbatementEntity tcaAlertsAbatementEntity = mock(TCAAlertsAbatementEntity.class);\r
161         when(mockObjectMappedTable.read(any(String.class))).thenReturn(tcaAlertsAbatementEntity);\r
162         final long time = new Date().getTime();\r
163         when(tcaAlertsAbatementEntity.getAbatementSentTS()).thenReturn(Long.toString(time));\r
164 \r
165         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);\r
166         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
167                 getMockThresholdCalculatorOutput(violatedThreshold);\r
168 \r
169         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
170         verify(mockObjectMappedTable,\r
171                 times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
172         verify(mockOutputEmitter, times(0)).emit(any(String.class));\r
173 \r
174     }\r
175 \r
176 \r
177     @Test\r
178     public void testDetermineAbatementAlertsWhenControlLoopTypeIsABATEDAndNoPreviousONSETEventFound() throws\r
179             Exception {\r
180 \r
181         final String testTCAAlertsAbatementTableName = "testTCAAlertsAbatementTableName";\r
182         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
183                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
184 \r
185         final FlowletContext mockFlowletContext = mock(FlowletContext.class);\r
186         final ObjectMappedTable<TCAAlertsAbatementEntity> mockObjectMappedTable = mock(ObjectMappedTable.class);\r
187         when(mockFlowletContext.getDataset(eq(testTCAAlertsAbatementTableName))).thenReturn(mockObjectMappedTable);\r
188         tcaAlertsAbatementFlowlet.initialize(mockFlowletContext);\r
189 \r
190         doNothing().when(mockObjectMappedTable).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
191         when(mockObjectMappedTable.read(any(String.class))).thenReturn(null);\r
192 \r
193         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.ABATED);\r
194         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
195                 getMockThresholdCalculatorOutput(violatedThreshold);\r
196 \r
197         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
198         verify(mockObjectMappedTable,\r
199                 times(0)).write(any(String.class), any(TCAAlertsAbatementEntity.class));\r
200         verify(mockOutputEmitter, times(0)).emit(any(String.class));\r
201 \r
202     }\r
203 \r
204     @Test(expected = CDAPSettingsException.class)\r
205     public void testDetermineAbatementAlertsWhenControlLoopTypeIsNotOnsetOrAbated() throws\r
206             Exception {\r
207         final TestTCAVESAlertsAbatementFlowlet tcaAlertsAbatementFlowlet =\r
208                 new TestTCAVESAlertsAbatementFlowlet("testTCAAlertsAbatementTableName");\r
209         final Threshold violatedThreshold = getViolatedThreshold(ClosedLoopEventStatus.CONTINUE);\r
210         final ThresholdCalculatorOutput mockThresholdCalculatorOutput =\r
211                 getMockThresholdCalculatorOutput(violatedThreshold);\r
212 \r
213         tcaAlertsAbatementFlowlet.determineAbatementAlerts(mockThresholdCalculatorOutput);\r
214 \r
215     }\r
216 \r
217     private static Threshold getViolatedThreshold(final ClosedLoopEventStatus closedLoopEventStatus) {\r
218         final Threshold violatedThreshold = Threshold.copy(metricsPerEventNames.get(0).getThresholds().get(0));\r
219         violatedThreshold.setClosedLoopEventStatus(closedLoopEventStatus);\r
220         return violatedThreshold;\r
221     }\r
222 \r
223 \r
224     private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final Threshold violatedThreshold) throws\r
225             Exception {\r
226 \r
227         final MetricsPerEventName violatedMetricsPerEventName =\r
228                 MetricsPerEventName.copy(metricsPerEventNames.get(0));\r
229         violatedMetricsPerEventName.setThresholds(ImmutableList.of(violatedThreshold));\r
230         return getMockThresholdCalculatorOutput(\r
231                 fromStream(CEF_MESSAGE_JSON_FILE_LOCATION),\r
232                 fromStream(TCA_POLICY_JSON_FILE_LOCATION),\r
233                 TCAUtils.writeValueAsString(violatedMetricsPerEventName),\r
234                 fromStream(TCA_ALERT_JSON_FILE_LOCATION)\r
235         );\r
236     }\r
237 \r
238 \r
239     private static ThresholdCalculatorOutput getMockThresholdCalculatorOutput(final String cefMessage,\r
240                                                                               final String tcaPolicy,\r
241                                                                               final String violatedMetricsPerEventName,\r
242                                                                               final String alertMessage) {\r
243         final ThresholdCalculatorOutput thresholdCalculatorOutput = mock(ThresholdCalculatorOutput.class);\r
244         when(thresholdCalculatorOutput.getCefMessage()).thenReturn(cefMessage);\r
245         when(thresholdCalculatorOutput.getTcaPolicy()).thenReturn(tcaPolicy);\r
246         when(thresholdCalculatorOutput.getViolatedMetricsPerEventName()).thenReturn(violatedMetricsPerEventName);\r
247         when(thresholdCalculatorOutput.getAlertMessage()).thenReturn(alertMessage);\r
248         return thresholdCalculatorOutput;\r
249     }\r
250 \r
251 }\r