Solve the Compitability with JaCoco
[holmes/engine-management.git] / engine-d / src / test / java / org / openo / holmes / engine / manager / DroolsEngineTest.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.openo.holmes.engine.manager;\r
18 \r
19 import static org.easymock.EasyMock.anyBoolean;\r
20 import static org.easymock.EasyMock.anyInt;\r
21 import static org.easymock.EasyMock.anyLong;\r
22 import static org.easymock.EasyMock.anyObject;\r
23 import static org.easymock.EasyMock.expect;\r
24 \r
25 import java.lang.reflect.Method;\r
26 import java.util.ArrayList;\r
27 import java.util.Collection;\r
28 import java.util.Iterator;\r
29 import java.util.List;\r
30 import java.util.Locale;\r
31 import javax.jms.Connection;\r
32 import javax.jms.ConnectionFactory;\r
33 import javax.jms.Destination;\r
34 import javax.jms.JMSException;\r
35 import javax.jms.MessageConsumer;\r
36 import javax.jms.ObjectMessage;\r
37 import javax.jms.Session;\r
38 import javax.jms.Topic;\r
39 import org.drools.KnowledgeBase;\r
40 import org.drools.KnowledgeBaseConfiguration;\r
41 import org.drools.builder.KnowledgeBuilder;\r
42 import org.drools.builder.KnowledgeBuilderErrors;\r
43 import org.drools.builder.ResourceType;\r
44 import org.drools.definition.KnowledgePackage;\r
45 import org.drools.io.Resource;\r
46 import org.drools.runtime.StatefulKnowledgeSession;\r
47 import org.drools.runtime.rule.FactHandle;\r
48 import org.easymock.EasyMock;\r
49 import org.glassfish.hk2.api.IterableProvider;\r
50 import org.hamcrest.core.IsEqual;\r
51 import org.junit.Assert;\r
52 import org.junit.Before;\r
53 import org.junit.Rule;\r
54 import org.junit.Test;\r
55 import org.junit.rules.ExpectedException;\r
56 import org.openo.holmes.common.api.entity.CorrelationRule;\r
57 import org.openo.holmes.common.api.stat.Alarm;\r
58 import org.openo.holmes.common.config.MQConfig;\r
59 import org.openo.holmes.common.exception.CorrelationException;\r
60 import org.openo.holmes.engine.request.DeployRuleRequest;\r
61 import org.openo.holmes.engine.wrapper.RuleMgtWrapper;\r
62 import org.powermock.api.easymock.PowerMock;\r
63 import org.powermock.modules.junit4.rule.PowerMockRule;\r
64 import org.powermock.reflect.Whitebox;\r
65 \r
66 public class DroolsEngineTest {\r
67 \r
68     @Rule\r
69     public ExpectedException thrown = ExpectedException.none();\r
70 \r
71     @Rule\r
72     public PowerMockRule powerMockRule = new PowerMockRule();\r
73 \r
74     private RuleMgtWrapper ruleMgtWrapper;\r
75 \r
76     private KnowledgeBase kbase;\r
77 \r
78     private KnowledgeBaseConfiguration kconf;\r
79 \r
80     private StatefulKnowledgeSession ksession;\r
81 \r
82     private KnowledgeBuilder kbuilder;\r
83 \r
84     private IterableProvider<MQConfig> mqConfigProvider;\r
85 \r
86     private ConnectionFactory connectionFactory;\r
87 \r
88     private DroolsEngine droolsEngine;\r
89 \r
90     @Before\r
91     public void setUp() {\r
92         droolsEngine = new DroolsEngine();\r
93 \r
94         ruleMgtWrapper = PowerMock.createMock(RuleMgtWrapper.class);\r
95         kbase = PowerMock.createMock(KnowledgeBase.class);\r
96         kconf = PowerMock.createMock(KnowledgeBaseConfiguration.class);\r
97         ksession = PowerMock.createMock(StatefulKnowledgeSession.class);\r
98         kbuilder = PowerMock.createMock(KnowledgeBuilder.class);\r
99         mqConfigProvider = PowerMock.createMock(IterableProvider.class);\r
100         connectionFactory = PowerMock.createMock(ConnectionFactory.class);\r
101 \r
102         Whitebox.setInternalState(droolsEngine, "ruleMgtWrapper", ruleMgtWrapper);\r
103         Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
104         Whitebox.setInternalState(droolsEngine, "kconf", kconf);\r
105         Whitebox.setInternalState(droolsEngine, "ksession", ksession);\r
106         Whitebox.setInternalState(droolsEngine, "kbuilder", kbuilder);\r
107         Whitebox.setInternalState(droolsEngine, "mqConfigProvider", mqConfigProvider);\r
108         Whitebox.setInternalState(droolsEngine, "connectionFactory", connectionFactory);\r
109 \r
110         PowerMock.resetAll();\r
111     }\r
112 \r
113     @Test\r
114     public void init() throws Exception {\r
115         MQConfig mqConfig = new MQConfig();\r
116         mqConfig.brokerIp = "127.0.0.1";\r
117         mqConfig.brokerPort = 4567;\r
118         mqConfig.brokerUsername = "admin";\r
119         mqConfig.brokerPassword = "admin";\r
120         List<CorrelationRule> rules = new ArrayList<CorrelationRule>();\r
121         CorrelationRule rule = new CorrelationRule();\r
122         rule.setContent("content");\r
123         rules.add(rule);\r
124 \r
125         expect(mqConfigProvider.get()).andReturn(mqConfig).anyTimes();\r
126         expect(ruleMgtWrapper.queryRuleByEnable(anyInt())).andReturn(rules);\r
127         PowerMock.replayAll();\r
128 \r
129         Method method = DroolsEngine.class.getDeclaredMethod("init");\r
130         method.setAccessible(true);\r
131         method.invoke(droolsEngine);\r
132 \r
133         PowerMock.verifyAll();\r
134     }\r
135 \r
136     @Test\r
137     public void deployRule_rule_is_null() throws CorrelationException {\r
138         Locale locale = PowerMock.createMock(Locale.class);\r
139 \r
140         thrown.expect(NullPointerException.class);\r
141 \r
142         droolsEngine.deployRule(null, locale);\r
143     }\r
144 \r
145     @Test\r
146     public void deployRule_kbuilder_has_errors() throws CorrelationException {\r
147         DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
148         Locale locale = PowerMock.createMock(Locale.class);\r
149 \r
150         thrown.expect(CorrelationException.class);\r
151 \r
152         KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
153         expect(rule.getContent()).andReturn("rule");\r
154         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
155         expect(kbuilder.hasErrors()).andReturn(true);\r
156         expect(kbuilder.getErrors()).andReturn(errors);\r
157 \r
158         PowerMock.replayAll();\r
159 \r
160         droolsEngine.deployRule(rule, locale);\r
161 \r
162         PowerMock.verifyAll();\r
163     }\r
164 \r
165     @Test\r
166     public void deployRule_kbase_knowledgePackages_contains_package() throws CorrelationException {\r
167         DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
168         Locale locale = PowerMock.createMock(Locale.class);\r
169 \r
170         thrown.expect(CorrelationException.class);\r
171 \r
172         KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
173         Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
174         Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
175         Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
176         baseColl.add(kPackage);\r
177         expect(rule.getContent()).andReturn("rule");\r
178         expect(kbuilder.hasErrors()).andReturn(false);\r
179         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
180         expect(kbuilder.getKnowledgePackages()).andReturn(builderColl);\r
181         expect(builderColl.iterator()).andReturn(iterator);\r
182         expect(iterator.next()).andReturn(kPackage);\r
183         expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
184 \r
185         PowerMock.replayAll();\r
186 \r
187         droolsEngine.deployRule(rule, locale);\r
188 \r
189         PowerMock.verifyAll();\r
190     }\r
191 \r
192     @Test\r
193     public void deployRule_add_knowledge_packages_exception() throws CorrelationException {\r
194         DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
195         Locale locale = PowerMock.createMock(Locale.class);\r
196 \r
197         thrown.expect(CorrelationException.class);\r
198 \r
199         KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
200         Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
201         Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
202         Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
203         expect(rule.getContent()).andReturn("rule");\r
204         expect(kbuilder.hasErrors()).andReturn(false);\r
205         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
206         expect(kbuilder.getKnowledgePackages()).andReturn(builderColl).times(2);\r
207         expect(builderColl.iterator()).andReturn(iterator);\r
208         expect(iterator.next()).andReturn(kPackage);\r
209         expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
210         kbase.addKnowledgePackages(anyObject(Collection.class));\r
211         EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
212 \r
213         PowerMock.replayAll();\r
214 \r
215         droolsEngine.deployRule(rule, locale);\r
216 \r
217         PowerMock.verifyAll();\r
218     }\r
219 \r
220     @Test\r
221     public void deployRule_normal() throws CorrelationException {\r
222         DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
223         Locale locale = PowerMock.createMock(Locale.class);\r
224 \r
225         final String pkgName = "pkgName";\r
226         KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
227         Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
228         Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
229         Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
230         expect(rule.getContent()).andReturn("rule");\r
231         expect(kbuilder.hasErrors()).andReturn(false);\r
232         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
233         expect(kbuilder.getKnowledgePackages()).andReturn(builderColl).times(2);\r
234         expect(builderColl.iterator()).andReturn(iterator);\r
235         expect(iterator.next()).andReturn(kPackage);\r
236         expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
237         kbase.addKnowledgePackages(anyObject(Collection.class));\r
238         expect(ksession.fireAllRules()).andReturn(1);\r
239         expect(kPackage.getName()).andReturn(pkgName);\r
240 \r
241         PowerMock.replayAll();\r
242 \r
243         String resultPkgName = droolsEngine.deployRule(rule, locale);\r
244         Assert.assertThat(resultPkgName, IsEqual.equalTo(pkgName));\r
245 \r
246         PowerMock.verifyAll();\r
247 \r
248     }\r
249 \r
250     @Test\r
251     public void undeployRule_knowledgepackage_is_null() throws CorrelationException {\r
252         String packageName = "packageName";\r
253         Locale locale = PowerMock.createMock(Locale.class);\r
254 \r
255         thrown.expect(CorrelationException.class);\r
256 \r
257         expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(null);\r
258 \r
259         PowerMock.replayAll();\r
260 \r
261         droolsEngine.undeployRule(packageName, locale);\r
262 \r
263         PowerMock.verifyAll();\r
264     }\r
265 \r
266     @Test\r
267     public void undeployRule_remove_knowledge_package_exception() throws CorrelationException {\r
268         String packageName = "packageName";\r
269         Locale locale = PowerMock.createMock(Locale.class);\r
270 \r
271         thrown.expect(CorrelationException.class);\r
272 \r
273         KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
274         expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
275         expect(pkg.getName()).andReturn("");\r
276         kbase.removeKnowledgePackage(anyObject(String.class));\r
277         EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
278 \r
279         PowerMock.replayAll();\r
280 \r
281         droolsEngine.undeployRule(packageName, locale);\r
282 \r
283         PowerMock.verifyAll();\r
284     }\r
285 \r
286     @Test\r
287     public void undeployRule_normal() throws CorrelationException {\r
288         String packageName = "packageName";\r
289         Locale locale = PowerMock.createMock(Locale.class);\r
290 \r
291         KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
292         expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
293         expect(pkg.getName()).andReturn("");\r
294         kbase.removeKnowledgePackage(anyObject(String.class));\r
295 \r
296         PowerMock.replayAll();\r
297 \r
298         droolsEngine.undeployRule(packageName, locale);\r
299 \r
300         PowerMock.verifyAll();\r
301     }\r
302 \r
303     @Test\r
304     public void compileRule_kbuilder_has_errors() throws CorrelationException {\r
305         String content = "content";\r
306         Locale locale = PowerMock.createMock(Locale.class);\r
307 \r
308         thrown.expect(CorrelationException.class);\r
309 \r
310         KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
311         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
312         expect(kbuilder.hasErrors()).andReturn(true);\r
313         expect(kbuilder.getErrors()).andReturn(errors);\r
314 \r
315         PowerMock.replayAll();\r
316 \r
317         droolsEngine.compileRule(content, locale);\r
318 \r
319         PowerMock.verifyAll();\r
320     }\r
321 \r
322     @Test\r
323     public void compileRule_normal() throws CorrelationException {\r
324         String content = "content";\r
325         Locale locale = PowerMock.createMock(Locale.class);\r
326 \r
327         kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
328         expect(kbuilder.hasErrors()).andReturn(false);\r
329 \r
330         PowerMock.replayAll();\r
331 \r
332         droolsEngine.compileRule(content, locale);\r
333 \r
334         PowerMock.verifyAll();\r
335     }\r
336 \r
337     @Test\r
338     public void putRaisedIntoStream_facthandle_is_null() {\r
339         expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(null);\r
340         expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
341         expect(ksession.fireAllRules()).andReturn(0);\r
342 \r
343         PowerMock.replayAll();\r
344 \r
345         droolsEngine.putRaisedIntoStream(new Alarm());\r
346 \r
347         PowerMock.verifyAll();\r
348     }\r
349 \r
350     @Test\r
351     public void putRaisedIntoStream_factHandle_is_not_null() {\r
352         FactHandle factHandle = PowerMock.createMock(FactHandle.class);\r
353         expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(factHandle);\r
354         ksession.retract(anyObject(FactHandle.class));\r
355         expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
356         expect(ksession.fireAllRules()).andReturn(0);\r
357 \r
358         PowerMock.replayAll();\r
359 \r
360         droolsEngine.putRaisedIntoStream(new Alarm());\r
361 \r
362         PowerMock.verifyAll();\r
363     }\r
364 \r
365     @Test\r
366     public void listener_run_objmessage_is_null() throws JMSException {\r
367         DroolsEngine.AlarmMqMessageListener listener = droolsEngine.new AlarmMqMessageListener();\r
368 \r
369         Connection connection = PowerMock.createMock(Connection.class);\r
370         Session session = PowerMock.createMock(Session.class);\r
371         Destination destination = PowerMock.createMock(Topic.class);\r
372         MessageConsumer messageConsumer = PowerMock.createMock(MessageConsumer.class);\r
373 \r
374         expect(connectionFactory.createConnection()).andReturn(connection);\r
375         connection.start();\r
376         expect(connection.createSession(anyBoolean(), anyInt())).andReturn(session);\r
377         expect(session.createTopic(anyObject(String.class))).andReturn((Topic) destination);\r
378         expect(session.createConsumer(anyObject(Destination.class))).andReturn(messageConsumer);\r
379         expect(messageConsumer.receive(anyLong())).andReturn(null);\r
380 \r
381         PowerMock.replayAll();\r
382 \r
383         listener.run();\r
384 \r
385         PowerMock.verifyAll();\r
386     }\r
387 \r
388     @Test\r
389     public void listener_run_objmessage_is_not_null() throws JMSException {\r
390         DroolsEngine.AlarmMqMessageListener listener = droolsEngine.new AlarmMqMessageListener();\r
391 \r
392         Connection connection = PowerMock.createMock(Connection.class);\r
393         Session session = PowerMock.createMock(Session.class);\r
394         Destination destination = PowerMock.createMock(Topic.class);\r
395         MessageConsumer messageConsumer = PowerMock.createMock(MessageConsumer.class);\r
396         ObjectMessage objMessage = PowerMock.createMock(ObjectMessage.class);\r
397 \r
398         FactHandle factHandle = PowerMock.createMock(FactHandle.class);\r
399 \r
400         expect(connectionFactory.createConnection()).andReturn(connection);\r
401         connection.start();\r
402         expect(connection.createSession(anyBoolean(), anyInt())).andReturn(session);\r
403         expect(session.createTopic(anyObject(String.class))).andReturn((Topic) destination);\r
404         expect(session.createConsumer(anyObject(Destination.class))).andReturn(messageConsumer);\r
405         expect(messageConsumer.receive(anyLong())).andReturn(objMessage);\r
406         expect(objMessage.getObject()).andReturn(new Alarm());\r
407 \r
408         expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(factHandle);\r
409         ksession.retract(anyObject(FactHandle.class));\r
410         expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
411         expect(ksession.fireAllRules()).andReturn(0);\r
412 \r
413         expect(messageConsumer.receive(anyLong())).andReturn(null);\r
414 \r
415         PowerMock.replayAll();\r
416 \r
417         listener.run();\r
418 \r
419         PowerMock.verifyAll();\r
420     }\r
421 \r
422     @Test\r
423     public void stop() throws Exception {\r
424         droolsEngine.stop();\r
425     }\r
426 }\r