Fix test and restructure
authorFengLiang <feng.liang1@zte.com.cn>
Wed, 15 Mar 2017 04:06:57 +0000 (12:06 +0800)
committerFengLiang <feng.liang1@zte.com.cn>
Wed, 15 Mar 2017 04:06:57 +0000 (12:06 +0800)
Change-Id: Ia971f87d86f5b849aca68ac96606beec6091e2fb
Issue-ID: HOLMES-47
Signed-off-by: FengLiang <feng.liang1@zte.com.cn>
engine-d/src/main/java/org/openo/holmes/engine/manager/DroolsEngine.java
engine-d/src/test/java/org/openo/holmes/engine/manager/DroolsEngineTest.java

index ad1b4e5..a97cae9 100644 (file)
@@ -18,8 +18,10 @@ package org.openo.holmes.engine.manager;
 \r
 import java.io.Serializable;\r
 import java.io.StringReader;\r
+import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Locale;\r
+import java.util.Set;\r
 import javax.annotation.PostConstruct;\r
 import javax.inject.Inject;\r
 import javax.jms.Connection;\r
@@ -62,21 +64,14 @@ import org.openo.holmes.engine.wrapper.RuleMgtWrapper;
 public class DroolsEngine {\r
 \r
     private final static int ENABLE = 1;\r
-\r
+    private final Set<String> packageNames = new HashSet<String>();\r
     @Inject\r
     private RuleMgtWrapper ruleMgtWrapper;\r
-\r
     private KnowledgeBase kbase;\r
-\r
     private KnowledgeBaseConfiguration kconf;\r
-\r
     private StatefulKnowledgeSession ksession;\r
-\r
-    private KnowledgeBuilder kbuilder;\r
-\r
     @Inject\r
     private IterableProvider<MQConfig> mqConfigProvider;\r
-\r
     private ConnectionFactory connectionFactory;\r
 \r
     @PostConstruct\r
@@ -94,9 +89,9 @@ public class DroolsEngine {
 \r
     private void registerAlarmTopicListener() {\r
         String brokerURL =\r
-                "tcp://" + mqConfigProvider.get().brokerIp + ":" + mqConfigProvider.get().brokerPort;\r
+            "tcp://" + mqConfigProvider.get().brokerIp + ":" + mqConfigProvider.get().brokerPort;\r
         connectionFactory = new ActiveMQConnectionFactory(mqConfigProvider.get().brokerUsername,\r
-                mqConfigProvider.get().brokerPassword, brokerURL);\r
+            mqConfigProvider.get().brokerPassword, brokerURL);\r
 \r
         AlarmMqMessageListener listener = new AlarmMqMessageListener();\r
         listener.receive();\r
@@ -123,8 +118,6 @@ public class DroolsEngine {
 \r
         this.kconf.setProperty("drools.assertBehaviour", "equality");\r
 \r
-        this.kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
-\r
         this.kbase = KnowledgeBaseFactory.newKnowledgeBase("D-ENGINE", this.kconf);\r
 \r
         this.ksession = kbase.newStatefulKnowledgeSession();\r
@@ -147,7 +140,7 @@ public class DroolsEngine {
         StringReader reader = new StringReader(ruleContent);\r
         Resource res = ResourceFactory.newReaderResource(reader);\r
 \r
-        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
 \r
         kbuilder.add(res, ResourceType.DRL);\r
 \r
@@ -161,55 +154,40 @@ public class DroolsEngine {
     }\r
 \r
     public synchronized String deployRule(DeployRuleRequest rule, Locale locale)\r
-            throws CorrelationException {\r
+        throws CorrelationException {\r
         StringReader reader = new StringReader(rule.getContent());\r
         Resource res = ResourceFactory.newReaderResource(reader);\r
 \r
-        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
 \r
         kbuilder.add(res, ResourceType.DRL);\r
 \r
-        if (kbuilder.hasErrors()) {\r
-\r
-            String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
-                    I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
-                    new String[]{kbuilder.getErrors().toString()});\r
-            throw new CorrelationException(errorMsg);\r
-        }\r
-\r
-        KnowledgePackage kpackage = kbuilder.getKnowledgePackages().iterator().next();\r
+        judgeRuleContent(locale, kbuilder);\r
 \r
-        if (kbase.getKnowledgePackages().contains(kpackage)) {\r
-\r
-            String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
-                    I18nProxy.ENGINE_CONTENT_ILLEGALITY, new String[]{\r
-                            I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_CONTAINS_PACKAGE)});\r
-\r
-            throw new CorrelationException(errorMsg);\r
-        }\r
+        String packageName = kbuilder.getKnowledgePackages().iterator().next().getName();\r
         try {\r
-\r
+            packageNames.add(packageName);\r
             kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());\r
         } catch (Exception e) {\r
 \r
             String errorMsg =\r
-                    I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_DEPLOY_RULE_FAILED);\r
+                I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_DEPLOY_RULE_FAILED);\r
             throw new CorrelationException(errorMsg, e);\r
         }\r
 \r
         ksession.fireAllRules();\r
-        return kpackage.getName();\r
+        return packageName;\r
     }\r
 \r
     public synchronized void undeployRule(String packageName, Locale locale)\r
-            throws CorrelationException {\r
+        throws CorrelationException {\r
 \r
         KnowledgePackage pkg = kbase.getKnowledgePackage(packageName);\r
 \r
         if (null == pkg) {\r
             String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
-                    I18nProxy.ENGINE_DELETE_RULE_NULL,\r
-                    new String[]{packageName});\r
+                I18nProxy.ENGINE_DELETE_RULE_NULL,\r
+                new String[]{packageName});\r
             throw new CorrelationException(errorMsg);\r
         }\r
 \r
@@ -218,27 +196,42 @@ public class DroolsEngine {
             kbase.removeKnowledgePackage(pkg.getName());\r
         } catch (Exception e) {\r
             String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
-                    I18nProxy.ENGINE_DELETE_RULE_FAILED, new String[]{packageName});\r
+                I18nProxy.ENGINE_DELETE_RULE_FAILED, new String[]{packageName});\r
             throw new CorrelationException(errorMsg, e);\r
         }\r
     }\r
 \r
     public void compileRule(String content, Locale locale)\r
-            throws CorrelationException {\r
+        throws CorrelationException {\r
         StringReader reader = new StringReader(content);\r
         Resource res = ResourceFactory.newReaderResource(reader);\r
 \r
-        kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
+        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();\r
 \r
         kbuilder.add(res, ResourceType.DRL);\r
 \r
+        judgeRuleContent(locale, kbuilder);\r
+    }\r
+\r
+    private void judgeRuleContent(Locale locale, KnowledgeBuilder kbuilder)\r
+        throws CorrelationException {\r
         if (kbuilder.hasErrors()) {\r
             String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
-                    I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
-                    new String[]{kbuilder.getErrors().toString()});\r
+                I18nProxy.ENGINE_CONTENT_ILLEGALITY,\r
+                new String[]{kbuilder.getErrors().toString()});\r
             log.error(errorMsg);\r
             throw new CorrelationException(errorMsg);\r
         }\r
+\r
+        String packageName = kbuilder.getKnowledgePackages().iterator().next().getName();\r
+\r
+        if (packageNames.contains(packageName)) {\r
+            String errorMsg = I18nProxy.getInstance().getValueByArgs(locale,\r
+                I18nProxy.ENGINE_CONTENT_ILLEGALITY, new String[]{\r
+                    I18nProxy.getInstance().getValue(locale, I18nProxy.ENGINE_CONTAINS_PACKAGE)});\r
+\r
+            throw new CorrelationException(errorMsg);\r
+        }\r
     }\r
 \r
     public void putRaisedIntoStream(Alarm raiseAlarm) {\r
index 44de609..54d9bf5 100644 (file)
@@ -23,8 +23,6 @@ import static org.easymock.EasyMock.expect;
 \r
 import java.lang.reflect.Method;\r
 import java.util.ArrayList;\r
-import java.util.Collection;\r
-import java.util.Iterator;\r
 import java.util.List;\r
 import java.util.Locale;\r
 import javax.jms.Connection;\r
@@ -37,13 +35,9 @@ import javax.jms.Topic;
 import org.apache.activemq.command.ActiveMQObjectMessage;\r
 import org.drools.KnowledgeBase;\r
 import org.drools.KnowledgeBaseConfiguration;\r
-import org.drools.builder.KnowledgeBuilder;\r
-import org.drools.builder.KnowledgeBuilderErrors;\r
-import org.drools.builder.ResourceType;\r
-import org.drools.definition.KnowledgePackage;\r
-import org.drools.io.Resource;\r
+import org.drools.KnowledgeBaseFactory;\r
+import org.drools.conf.EventProcessingOption;\r
 import org.drools.runtime.StatefulKnowledgeSession;\r
-import org.drools.runtime.rule.FactHandle;\r
 import org.easymock.EasyMock;\r
 import org.glassfish.hk2.api.IterableProvider;\r
 import org.junit.Before;\r
@@ -53,6 +47,7 @@ import org.junit.rules.ExpectedException;
 import org.openo.holmes.common.api.entity.CorrelationRule;\r
 import org.openo.holmes.common.api.stat.Alarm;\r
 import org.openo.holmes.common.config.MQConfig;\r
+import org.openo.holmes.common.constant.AlarmConst;\r
 import org.openo.holmes.common.exception.CorrelationException;\r
 import org.openo.holmes.engine.request.DeployRuleRequest;\r
 import org.openo.holmes.engine.wrapper.RuleMgtWrapper;\r
@@ -76,8 +71,6 @@ public class DroolsEngineTest {
 \r
     private StatefulKnowledgeSession ksession;\r
 \r
-    private KnowledgeBuilder kbuilder;\r
-\r
     private IterableProvider<MQConfig> mqConfigProvider;\r
 \r
     private ConnectionFactory connectionFactory;\r
@@ -88,20 +81,21 @@ public class DroolsEngineTest {
     public void setUp() {\r
         droolsEngine = new DroolsEngine();\r
 \r
+        this.kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();\r
+        this.kconf.setOption(EventProcessingOption.STREAM);\r
+        this.kconf.setProperty("drools.assertBehaviour", "equality");\r
+        this.kbase = KnowledgeBaseFactory.newKnowledgeBase("D-ENGINE", this.kconf);\r
+        this.ksession = kbase.newStatefulKnowledgeSession();\r
+\r
         ruleMgtWrapper = PowerMock.createMock(RuleMgtWrapper.class);\r
-        kbase = PowerMock.createMock(KnowledgeBase.class);\r
-        kconf = PowerMock.createMock(KnowledgeBaseConfiguration.class);\r
-        ksession = PowerMock.createMock(StatefulKnowledgeSession.class);\r
-        kbuilder = PowerMock.createMock(KnowledgeBuilder.class);\r
         mqConfigProvider = PowerMock.createMock(IterableProvider.class);\r
         connectionFactory = PowerMock.createMock(ConnectionFactory.class);\r
 \r
         Whitebox.setInternalState(droolsEngine, "ruleMgtWrapper", ruleMgtWrapper);\r
-        Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
+        Whitebox.setInternalState(droolsEngine, "mqConfigProvider", mqConfigProvider);\r
         Whitebox.setInternalState(droolsEngine, "kconf", kconf);\r
+        Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
         Whitebox.setInternalState(droolsEngine, "ksession", ksession);\r
-        Whitebox.setInternalState(droolsEngine, "kbuilder", kbuilder);\r
-        Whitebox.setInternalState(droolsEngine, "mqConfigProvider", mqConfigProvider);\r
         Whitebox.setInternalState(droolsEngine, "connectionFactory", connectionFactory);\r
 \r
         PowerMock.resetAll();\r
@@ -141,177 +135,71 @@ public class DroolsEngineTest {
 \r
     @Test\r
     public void deployRule_kbuilder_has_errors() throws CorrelationException {\r
-        DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent("rule123");\r
+        Locale locale = new Locale(AlarmConst.I18N_EN);\r
 \r
         thrown.expect(CorrelationException.class);\r
 \r
-        KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
-        expect(rule.getContent()).andReturn("rule");\r
-        kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
-        expect(kbuilder.hasErrors()).andReturn(true);\r
-        expect(kbuilder.getErrors()).andReturn(errors);\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.deployRule(rule, locale);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
     @Test\r
-    public void deployRule_kbase_knowledgePackages_contains_package() throws CorrelationException {\r
-        DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
+    public void deployRule_package_name_repeat() throws CorrelationException {\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent("package rule123");\r
+        Locale locale = new Locale(AlarmConst.I18N_EN);\r
 \r
         thrown.expect(CorrelationException.class);\r
 \r
-        KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
-        Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
-        Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
-        Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
-        baseColl.add(kPackage);\r
-        expect(rule.getContent()).andReturn("rule");\r
-        expect(kbuilder.hasErrors()).andReturn(false);\r
-        kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
-        expect(kbuilder.getKnowledgePackages()).andReturn(builderColl);\r
-        expect(builderColl.iterator()).andReturn(iterator);\r
-        expect(iterator.next()).andReturn(kPackage);\r
-        expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.deployRule(rule, locale);\r
-\r
-        PowerMock.verifyAll();\r
-    }\r
-\r
-    @Test\r
-    public void deployRule_add_knowledge_packages_exception() throws CorrelationException {\r
-        DeployRuleRequest rule = PowerMock.createMock(DeployRuleRequest.class);\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
-\r
-        thrown.expect(CorrelationException.class);\r
-\r
-        KnowledgePackage kPackage = PowerMock.createMock(KnowledgePackage.class);\r
-        Collection<KnowledgePackage> builderColl = PowerMock.createMock(Collection.class);\r
-        Iterator<KnowledgePackage> iterator = PowerMock.createMock(Iterator.class);\r
-        Collection<KnowledgePackage> baseColl = new ArrayList<KnowledgePackage>();\r
-        expect(rule.getContent()).andReturn("rule");\r
-        expect(kbuilder.hasErrors()).andReturn(false);\r
-        kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
-        expect(kbuilder.getKnowledgePackages()).andReturn(builderColl).times(2);\r
-        expect(builderColl.iterator()).andReturn(iterator);\r
-        expect(iterator.next()).andReturn(kPackage);\r
-        expect(kbase.getKnowledgePackages()).andReturn(baseColl);\r
-        kbase.addKnowledgePackages(anyObject(Collection.class));\r
-        EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.deployRule(rule, locale);\r
-\r
-        PowerMock.verifyAll();\r
-    }\r
-\r
-    @Test\r
-    public void undeployRule_knowledgepackage_is_null() throws CorrelationException {\r
-        String packageName = "packageName";\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
-\r
-        thrown.expect(CorrelationException.class);\r
-\r
-        expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(null);\r
-\r
-        PowerMock.replayAll();\r
-\r
-        droolsEngine.undeployRule(packageName, locale);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
     @Test\r
-    public void undeployRule_remove_knowledge_package_exception() throws CorrelationException {\r
-        String packageName = "packageName";\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
+    public void undeployRule_package_name_is_null() throws CorrelationException {\r
+        String packageName = null;\r
+        Locale locale = new Locale(AlarmConst.I18N_EN);\r
 \r
         thrown.expect(CorrelationException.class);\r
 \r
-        KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
-        expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
-        expect(pkg.getName()).andReturn("");\r
-        kbase.removeKnowledgePackage(anyObject(String.class));\r
-        EasyMock.expectLastCall().andThrow(new RuntimeException(""));\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.undeployRule(packageName, locale);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
     @Test\r
     public void undeployRule_normal() throws CorrelationException {\r
-        String packageName = "packageName";\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
+        Locale locale = new Locale(AlarmConst.I18N_EN);\r
 \r
-        KnowledgePackage pkg = PowerMock.createMock(KnowledgePackage.class);\r
-        expect(kbase.getKnowledgePackage(anyObject(String.class))).andReturn(pkg);\r
-        expect(pkg.getName()).andReturn("");\r
-        kbase.removeKnowledgePackage(anyObject(String.class));\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent("package rule123");\r
+        droolsEngine.deployRule(rule, locale);\r
 \r
-        PowerMock.replayAll();\r
+        String packageName = "rule123";\r
 \r
         droolsEngine.undeployRule(packageName, locale);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
     @Test\r
     public void compileRule_kbuilder_has_errors() throws CorrelationException {\r
-        String content = "content";\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
+        String content = "have error content";\r
+        Locale locale = new Locale(AlarmConst.I18N_EN);\r
 \r
         thrown.expect(CorrelationException.class);\r
 \r
-        KnowledgeBuilderErrors errors = PowerMock.createMock(KnowledgeBuilderErrors.class);\r
-        kbuilder.add(anyObject(Resource.class), anyObject(ResourceType.class));\r
-        expect(kbuilder.hasErrors()).andReturn(true);\r
-        expect(kbuilder.getErrors()).andReturn(errors);\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.compileRule(content, locale);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
+\r
     @Test\r
     public void putRaisedIntoStream_facthandle_is_null() {\r
-        expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(null);\r
-        expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
-        expect(ksession.fireAllRules()).andReturn(0);\r
-\r
-        PowerMock.replayAll();\r
-\r
-        droolsEngine.putRaisedIntoStream(new Alarm());\r
-\r
-        PowerMock.verifyAll();\r
+        Alarm raiseAlarm = new Alarm();\r
+        droolsEngine.putRaisedIntoStream(raiseAlarm);\r
+        droolsEngine.putRaisedIntoStream(raiseAlarm);\r
     }\r
 \r
     @Test\r
     public void putRaisedIntoStream_factHandle_is_not_null() {\r
-        FactHandle factHandle = PowerMock.createMock(FactHandle.class);\r
-        expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(factHandle);\r
-        ksession.retract(anyObject(FactHandle.class));\r
-        expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
-        expect(ksession.fireAllRules()).andReturn(0);\r
-\r
-        PowerMock.replayAll();\r
-\r
         droolsEngine.putRaisedIntoStream(new Alarm());\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
 \r
@@ -422,16 +310,7 @@ public class DroolsEngineTest {
         ActiveMQObjectMessage objectMessage = new ActiveMQObjectMessage();\r
         objectMessage.setObject(alarm);\r
 \r
-        expect(ksession.getFactHandle(anyObject(Alarm.class))).andReturn(null);\r
-\r
-        expect(ksession.insert(anyObject(Alarm.class))).andReturn(null);\r
-        expect(ksession.fireAllRules()).andReturn(1);\r
-\r
-        PowerMock.replayAll();\r
-\r
         listener.onMessage(objectMessage);\r
-\r
-        PowerMock.verifyAll();\r
     }\r
 \r
     @Test\r