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