bugfix - rule sync issues when engine redeployed
[holmes/rule-management.git] / rulemgt / src / test / java / org / onap / holmes / rulemgt / wrapper / RuleMgtWrapperTest.java
1 /**
2  * Copyright 2017 ZTE Corporation.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.holmes.rulemgt.wrapper;
18
19
20 import org.easymock.EasyMock;
21 import org.junit.Before;
22 import org.junit.Rule;
23 import org.junit.Test;
24 import org.junit.rules.ExpectedException;
25 import org.junit.runner.RunWith;
26 import org.onap.holmes.common.api.entity.CorrelationRule;
27 import org.onap.holmes.common.exception.CorrelationException;
28 import org.onap.holmes.common.utils.DbDaoUtil;
29 import org.onap.holmes.rulemgt.bean.request.*;
30 import org.onap.holmes.rulemgt.bean.response.RuleAddAndUpdateResponse;
31 import org.onap.holmes.rulemgt.bean.response.RuleQueryListResponse;
32 import org.onap.holmes.rulemgt.bolt.enginebolt.EngineWrapper;
33 import org.onap.holmes.rulemgt.db.CorrelationRuleDao;
34 import org.onap.holmes.rulemgt.db.CorrelationRuleQueryDao;
35 import org.onap.holmes.rulemgt.tools.EngineTools;
36 import org.powermock.api.easymock.PowerMock;
37 import org.powermock.modules.junit4.PowerMockRunner;
38 import org.powermock.reflect.Whitebox;
39
40 import java.util.ArrayList;
41 import java.util.Arrays;
42 import java.util.Date;
43 import java.util.List;
44
45 import static org.hamcrest.MatcherAssert.assertThat;
46 import static org.hamcrest.Matchers.equalTo;
47 import static org.hamcrest.Matchers.is;
48
49 @RunWith(PowerMockRunner.class)
50 public class RuleMgtWrapperTest {
51
52     @Rule
53     public ExpectedException thrown = ExpectedException.none();
54
55     private RuleMgtWrapper ruleMgtWrapper;
56
57     private EngineWrapper engineWrapperMock;
58
59     private DbDaoUtil dbDaoUtilMock;
60
61     private CorrelationRuleQueryDao correlationRuleQueryDaoMock;
62
63     private CorrelationRuleDao correlationRuleDaoMock;
64
65     private EngineTools engineToolsMock;
66
67     private static final String USER_NAME = "admin";
68
69     @Before
70     public void setUp() throws Exception {
71
72         ruleMgtWrapper = new RuleMgtWrapper();
73
74         engineWrapperMock = PowerMock.createMock(EngineWrapper.class);
75         correlationRuleQueryDaoMock = PowerMock.createMock(CorrelationRuleQueryDao.class);
76         dbDaoUtilMock = PowerMock.createMock(DbDaoUtil.class);
77         correlationRuleDaoMock = PowerMock.createMock(CorrelationRuleDao.class);
78         engineToolsMock = PowerMock.createMock(EngineTools.class);
79
80         Whitebox.setInternalState(ruleMgtWrapper, "daoUtil", dbDaoUtilMock);
81         Whitebox.setInternalState(ruleMgtWrapper, "correlationRuleQueryDao", correlationRuleQueryDaoMock);
82         Whitebox.setInternalState(ruleMgtWrapper, "engineWarpper", engineWrapperMock);
83         Whitebox.setInternalState(ruleMgtWrapper, "correlationRuleDao", correlationRuleDaoMock);
84         Whitebox.setInternalState(ruleMgtWrapper,"engineTools", engineToolsMock);
85
86         PowerMock.resetAll();
87     }
88
89     @Test
90     public void initDaoUtil_normal() {
91         ruleMgtWrapper.initDaoUtil();
92     }
93
94     @Test
95     public void addCorrelationRule_name_is_null() throws Exception {
96         thrown.expect(CorrelationException.class);
97         thrown.expectMessage("The name of the rule can not be empty.");
98
99         ruleMgtWrapper.addCorrelationRule(USER_NAME, createRuleCreateRequest(null, "This is a rule for testing.",
100                 "Mocked contents.", 0));
101     }
102
103     @Test
104     public void addCorrelationRule_request_null() throws Exception {
105         thrown.expect(CorrelationException.class);
106         thrown.expectMessage("The request object can not be empty!");
107
108         ruleMgtWrapper.addCorrelationRule(USER_NAME, null);
109     }
110
111     @Test
112     public void addCorrelationRule_name_is_empty() throws Exception {
113         thrown.expect(CorrelationException.class);
114         thrown.expectMessage("The name of the rule can not be empty.");
115
116         ruleMgtWrapper.addCorrelationRule("admin", createRuleCreateRequest("", "This is a rule for testing.",
117                 "Mocked contents.", 0));
118     }
119
120     @Test
121     public void addCorrelationRule_content_is_empty() throws Exception {
122         thrown.expect(CorrelationException.class);
123         thrown.expectMessage("The contents of the rule can not be empty!");
124
125         ruleMgtWrapper.addCorrelationRule("admin", createRuleCreateRequest("test", "This is a rule for testing.",
126                 "", 0));
127     }
128
129     @Test
130     public void addCorrelationRule_enabled_is_off_limit() throws Exception {
131         thrown.expect(CorrelationException.class);
132         thrown.expectMessage("Invalid rule status. Only 0 (disabled) and 1 (enabled) are allowed.");
133
134         ruleMgtWrapper.addCorrelationRule("admin", createRuleCreateRequest("test", "This is a rule for testing.",
135                 "Mocked contents.", 3));
136     }
137
138     @Test
139     public void addCorrelationRule_duplicated_rule() throws Exception {
140
141         final String ruleName = "Rule-001";
142
143         RuleCreateRequest ruleCreateRequest = createRuleCreateRequest(ruleName, "This is a rule for testing.",
144                 "Mocked contents.", 0);
145         CorrelationRule correlationRule = convertCreateRequest2CorrelationRule(ruleCreateRequest);
146
147         thrown.expect(CorrelationException.class);
148         thrown.expectMessage("A rule with the same name already exists.");
149
150         EasyMock.expect(correlationRuleDaoMock.queryRuleByRuleName(ruleName)).andReturn(correlationRule);
151         PowerMock.replayAll();
152
153         ruleMgtWrapper.addCorrelationRule("admin", ruleCreateRequest);
154
155         PowerMock.verifyAll();
156     }
157
158     @Test
159     public void addCorrelationRule_normal() throws Exception {
160         final String ruleName = "Rule-001";
161
162         RuleCreateRequest ruleCreateRequest = createRuleCreateRequest(ruleName, "This is a rule for testing.",
163                 "Mocked contents.", 1);
164         ruleCreateRequest.setLoopControlName("loopName");
165
166         CorrelationRule correlationRuleRet = new CorrelationRule();
167         correlationRuleRet.setRid("rule_" + System.currentTimeMillis());
168
169         EasyMock.expect(correlationRuleDaoMock.queryRuleByRuleName(ruleName)).andReturn(null);
170         EasyMock.expect(engineToolsMock.getEngineWithLeastRules()).andReturn("127.0.0.1");
171         EasyMock.expect(engineWrapperMock.checkRuleFromEngine(EasyMock.anyObject(CorrelationCheckRule4Engine.class)
172                 , EasyMock.anyObject(String.class)))
173                 .andReturn(true);
174         EasyMock.expect(engineWrapperMock.deployEngine(EasyMock.anyObject(CorrelationDeployRule4Engine.class)
175                 , EasyMock.anyObject(String.class)))
176                 .andReturn("package-001");
177         EasyMock.expect(correlationRuleDaoMock.saveRule(EasyMock.anyObject(CorrelationRule.class)))
178                 .andReturn(correlationRuleRet);
179
180         PowerMock.replayAll();
181
182         RuleAddAndUpdateResponse response = ruleMgtWrapper.addCorrelationRule("admin", ruleCreateRequest);
183         PowerMock.verifyAll();
184
185         assertThat(response.getRuleId(), equalTo(correlationRuleRet.getRid()));
186     }
187
188     @Test
189     public void updateCorrelationRule_param_null() throws Exception {
190         thrown.expect(CorrelationException.class);
191         thrown.expectMessage("The request object can not be empty!");
192
193         ruleMgtWrapper.updateCorrelationRule(USER_NAME, null);
194     }
195
196     @Test
197     public void updateCorrelationRule_normal() throws Exception {
198         CorrelationRule oldCorrelationRule = new CorrelationRule();
199         oldCorrelationRule.setRid("rule_1");
200         oldCorrelationRule.setName("name");
201         oldCorrelationRule.setDescription("des1");
202         oldCorrelationRule.setContent("content");
203         oldCorrelationRule.setPackageName("testName");
204         oldCorrelationRule.setEnabled(1);
205         oldCorrelationRule.setClosedControlLoopName("cl-name");
206         oldCorrelationRule.setEngineInstance("127.0.0.1");
207         RuleUpdateRequest ruleUpdateRequest = createRuleUpdateRequest("rule_1", "cl-name", "des2", "contetnt2", 1);
208
209         EasyMock.expect(correlationRuleDaoMock.queryRuleByRid("rule_1")).andReturn(oldCorrelationRule);
210         EasyMock.expect(engineToolsMock.getInstanceList()).andReturn(Arrays.asList("127.0.0.1", "127.0.0.2")).times(2);
211         EasyMock.expect(engineWrapperMock.deleteRuleFromEngine("testName", "127.0.0.1")).andReturn(true);
212         correlationRuleDaoMock.updateRule(EasyMock.anyObject(CorrelationRule.class));
213         EasyMock.expectLastCall();
214         EasyMock.expect(engineWrapperMock.checkRuleFromEngine(EasyMock.anyObject(CorrelationCheckRule4Engine.class)
215                 , EasyMock.anyObject(String.class)))
216                 .andReturn(true);
217         EasyMock.expect(engineWrapperMock.deployEngine(EasyMock.anyObject(CorrelationDeployRule4Engine.class)
218                 , EasyMock.anyObject(String.class)))
219                 .andReturn("packageName1");
220         PowerMock.replayAll();
221
222         ruleMgtWrapper.updateCorrelationRule(USER_NAME, ruleUpdateRequest);
223
224         PowerMock.verifyAll();
225
226         assertThat(oldCorrelationRule.getRid(), equalTo(ruleUpdateRequest.getRuleId()));
227     }
228
229     @Test
230     public void updateCorrelationRule_param_no_change() throws Exception {
231         CorrelationRule oldCorrelationRule = new CorrelationRule();
232         oldCorrelationRule.setRid("rule_1");
233         oldCorrelationRule.setName("name");
234         oldCorrelationRule.setDescription("des1");
235         oldCorrelationRule.setContent("content");
236         oldCorrelationRule.setPackageName("testName");
237         oldCorrelationRule.setEnabled(1);
238         oldCorrelationRule.setClosedControlLoopName("cl-name");
239         oldCorrelationRule.setEngineInstance("127.0.0.1");
240         RuleUpdateRequest ruleUpdateRequest = createRuleUpdateRequest("rule_1", "cl-name", "des1", "content", 1);
241
242         EasyMock.expect(correlationRuleDaoMock.queryRuleByRid("rule_1")).andReturn(oldCorrelationRule);
243         EasyMock.expect(engineToolsMock.getInstanceList()).andReturn(Arrays.asList("127.0.0.1", "127.0.0.2"));
244
245         PowerMock.replayAll();
246
247         ruleMgtWrapper.updateCorrelationRule(USER_NAME, ruleUpdateRequest);
248
249         PowerMock.verifyAll();
250
251         assertThat(oldCorrelationRule.getRid(), equalTo(ruleUpdateRequest.getRuleId()));
252     }
253
254     @Test
255     public void updateCorrelationRule_rule_not_exist() throws Exception {
256         thrown.expect(CorrelationException.class);
257         thrown.expectMessage("You're trying to update a rule which does not exist in the system.");
258
259         EasyMock.expect(correlationRuleDaoMock.queryRuleByRid(EasyMock.anyObject(String.class))).andReturn(null);
260
261         PowerMock.replayAll();
262
263         ruleMgtWrapper.updateCorrelationRule(USER_NAME, new RuleUpdateRequest());
264
265         PowerMock.verifyAll();
266     }
267
268     @Test
269     public void deleteCorrelationRule_request_null() throws Exception {
270         thrown.expect(CorrelationException.class);
271         thrown.expectMessage("The request object can not be empty!");
272
273         ruleMgtWrapper.deleteCorrelationRule(null);
274     }
275
276     @Test
277     public void deleteCorrelationRule_rule_not_exit() throws Exception {
278         thrown.expect(CorrelationException.class);
279         thrown.expectMessage("You're trying to delete a rule which does not exist in the system.");
280
281         RuleDeleteRequest ruleDeleteRequest = createRuleDeleteRequest("rule_" + System.currentTimeMillis());
282
283         EasyMock.expect(dbDaoUtilMock.getJdbiDaoByOnDemand(CorrelationRuleDao.class)).andReturn(
284                 correlationRuleDaoMock).anyTimes();
285         EasyMock.expect(correlationRuleDaoMock.queryRuleByRid(ruleDeleteRequest.getRuleId()))
286                 .andReturn(null);
287
288         PowerMock.replayAll();
289
290         ruleMgtWrapper.deleteCorrelationRule(ruleDeleteRequest);
291
292         PowerMock.verifyAll();
293     }
294
295     @Test
296     public void deleteCorrelationRule_normal() throws Exception {
297         RuleDeleteRequest ruleDeleteRequest = createRuleDeleteRequest("rule_" + System.currentTimeMillis());
298         CorrelationRule correlationRule = new CorrelationRule();
299         correlationRule.setEnabled(1);
300         EasyMock.expect(correlationRuleDaoMock.queryRuleByRid(ruleDeleteRequest.getRuleId()))
301                 .andReturn(correlationRule);
302         EasyMock.expect(engineWrapperMock.deleteRuleFromEngine(EasyMock.anyObject(String.class)
303                 , EasyMock.anyObject(String.class))).andReturn(true);
304         correlationRuleDaoMock.deleteRule(EasyMock.anyObject(CorrelationRule.class));
305         EasyMock.expectLastCall();
306         PowerMock.replayAll();
307
308         ruleMgtWrapper.deleteCorrelationRule(ruleDeleteRequest);
309
310         PowerMock.verifyAll();
311     }
312
313     @Test
314     public void getCorrelationRuleByCondition_data_format_exception() throws Exception {
315         thrown.expect(CorrelationException.class);
316         thrown.expectMessage("An error occurred while building the query SQL.");
317
318         EasyMock.expect(correlationRuleQueryDaoMock.getCorrelationRulesByCondition(EasyMock.anyObject(
319                 RuleQueryCondition.class)))
320                 .andThrow(new CorrelationException("An error occurred while building the query SQL."));
321
322         PowerMock.replay(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
323
324         ruleMgtWrapper.getCorrelationRuleByCondition(new RuleQueryCondition());
325
326         PowerMock.verify(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
327     }
328
329     @Test
330     public void getCorrelationRuleByCondition_db_exception() throws Exception {
331         thrown.expect(CorrelationException.class);
332         thrown.expectMessage("Failed to query the rule.");
333
334         EasyMock.expect(correlationRuleQueryDaoMock.getCorrelationRulesByCondition(EasyMock.anyObject(
335                 RuleQueryCondition.class)))
336                 .andThrow(new CorrelationException("Failed to query the rule."));
337
338         PowerMock.replay(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
339
340         ruleMgtWrapper.getCorrelationRuleByCondition(new RuleQueryCondition());
341
342         PowerMock.verify(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
343     }
344
345     @Test
346     public void getCorrelationRuleByCondition_normal() throws Exception {
347         List<CorrelationRule> correlationRuleList = new ArrayList<CorrelationRule>(10);
348         for (int i = 0; i < 10; ++i) {
349             CorrelationRule correlationRule = new CorrelationRule();
350             correlationRule.setContent("content" + i);
351             correlationRule.setName("name" + i);
352             correlationRule.setRid("rule_" + i);
353             correlationRule.setEngineType("engineType" + (i % 2 + 1));
354             correlationRule.setEngineID("engineId" + i);
355             correlationRule.setCreateTime(new Date());
356             correlationRule.setCreator(USER_NAME);
357             correlationRule.setDescription("description" + i);
358             correlationRule.setPackageName("package" + i);
359             correlationRuleList.add(correlationRule);
360         }
361
362         EasyMock.expect(correlationRuleQueryDaoMock.getCorrelationRulesByCondition(EasyMock.anyObject(
363                 RuleQueryCondition.class))).andReturn(correlationRuleList);
364
365         PowerMock.replay(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
366
367         RuleQueryListResponse response = ruleMgtWrapper.getCorrelationRuleByCondition(new RuleQueryCondition());
368
369         PowerMock.verify(correlationRuleQueryDaoMock, CorrelationRuleQueryDao.class);
370
371         assertThat(response.getTotalCount(), is(10));
372
373         for (int i = 0; i < 10; ++i) {
374             assertThat(response.getCorrelationRules().get(i).getRuleId(),
375                     equalTo(correlationRuleList.get(i).getRid()));
376         }
377     }
378
379     private RuleCreateRequest createRuleCreateRequest(String ruleName, String description, String content,
380             int enabled) {
381         RuleCreateRequest rcr;
382         rcr = new RuleCreateRequest();
383         rcr.setRuleName(ruleName);
384         rcr.setDescription(description);
385         rcr.setContent(content);
386         rcr.setEnabled(enabled);
387         return rcr;
388     }
389
390     private RuleUpdateRequest createRuleUpdateRequest(String ruleId, String clName, String description,
391             String content, int enabled) {
392         RuleUpdateRequest ruleUpdateRequest = new RuleUpdateRequest();
393         ruleUpdateRequest.setRuleId(ruleId);
394         ruleUpdateRequest.setDescription(description);
395         ruleUpdateRequest.setContent(content);
396         ruleUpdateRequest.setEnabled(enabled);
397         ruleUpdateRequest.setLoopControlName(clName);
398         return ruleUpdateRequest;
399     }
400
401     private RuleDeleteRequest createRuleDeleteRequest(String ruleId) {
402         RuleDeleteRequest ruleDeleteRequest = new RuleDeleteRequest();
403         ruleDeleteRequest.setRuleId(ruleId);
404         return ruleDeleteRequest;
405     }
406
407     private CorrelationRule convertCreateRequest2CorrelationRule(RuleCreateRequest ruleCreateRequest) {
408         CorrelationRule correlationRule = new CorrelationRule();
409         correlationRule.setContent(ruleCreateRequest.getContent());
410         correlationRule.setDescription(ruleCreateRequest.getDescription());
411         correlationRule.setName(ruleCreateRequest.getRuleName());
412         correlationRule.setCreator(USER_NAME);
413         correlationRule.setModifier(USER_NAME);
414         correlationRule.setEnabled(ruleCreateRequest.getEnabled());
415         return correlationRule;
416     }
417
418     private CorrelationRule convertUpdateRequest2CorrelationRule(RuleUpdateRequest ruleUpdateRequest) {
419         CorrelationRule correlationRule = new CorrelationRule();
420         correlationRule.setRid(ruleUpdateRequest.getRuleId());
421         correlationRule.setContent(ruleUpdateRequest.getContent());
422         correlationRule.setDescription(ruleUpdateRequest.getDescription());
423         correlationRule.setEnabled(ruleUpdateRequest.getEnabled());
424         correlationRule.setUpdateTime(new Date());
425         correlationRule.setModifier(USER_NAME);
426         return correlationRule;
427     }
428 }