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