Optimized Rule Deployment Logic
[holmes/engine-management.git] / engine-d / src / test / java / org / onap / holmes / engine / manager / DroolsEngineTest.java
index 71ef172..4ad9107 100644 (file)
@@ -1,12 +1,12 @@
 /**\r
  * Copyright 2017 ZTE Corporation.\r
- *\r
+ * <p>\r
  * Licensed under the Apache License, Version 2.0 (the "License");\r
  * you may not use this file except in compliance with the License.\r
  * You may obtain a copy of the License at\r
- *\r
+ * <p>\r
  * http://www.apache.org/licenses/LICENSE-2.0\r
- *\r
+ * <p>\r
  * Unless required by applicable law or agreed to in writing, software\r
  * distributed under the License is distributed on an "AS IS" BASIS,\r
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
 \r
 package org.onap.holmes.engine.manager;\r
 \r
-import org.easymock.EasyMock;\r
 import org.junit.Before;\r
+import org.junit.BeforeClass;\r
 import org.junit.Rule;\r
 import org.junit.Test;\r
 import org.junit.rules.ExpectedException;\r
-import org.kie.api.KieBase;\r
-import org.kie.api.KieServices;\r
-import org.kie.api.builder.KieBuilder;\r
-import org.kie.api.builder.KieFileSystem;\r
-import org.kie.api.builder.KieRepository;\r
-import org.kie.api.io.KieResources;\r
-import org.kie.api.runtime.KieContainer;\r
-import org.kie.api.runtime.KieSession;\r
 import org.onap.holmes.common.api.entity.AlarmInfo;\r
 import org.onap.holmes.common.api.entity.CorrelationRule;\r
 import org.onap.holmes.common.api.stat.VesAlarm;\r
-import org.onap.holmes.common.constant.AlarmConst;\r
 import org.onap.holmes.common.exception.CorrelationException;\r
 import org.onap.holmes.common.utils.DbDaoUtil;\r
 import org.onap.holmes.engine.db.AlarmInfoDao;\r
@@ -41,10 +32,12 @@ import org.onap.holmes.engine.wrapper.RuleMgtWrapper;
 import org.powermock.api.easymock.PowerMock;\r
 import org.powermock.reflect.Whitebox;\r
 \r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Locale;\r
+import java.lang.reflect.InvocationTargetException;\r
+import java.lang.reflect.Method;\r
+import java.util.*;\r
+import java.util.stream.Collectors;\r
 \r
+import static org.easymock.EasyMock.anyObject;\r
 import static org.hamcrest.CoreMatchers.is;\r
 import static org.hamcrest.core.IsEqual.equalTo;\r
 import static org.junit.Assert.assertThat;\r
@@ -56,135 +49,108 @@ public class DroolsEngineTest {
 \r
     private RuleMgtWrapper ruleMgtWrapper;\r
 \r
-    private KieBase kieBase;\r
-    private KieSession kieSession;\r
-    private KieContainer kieContainer;\r
-    private KieFileSystem kfs;\r
-    private KieServices ks;\r
-    private KieBuilder kieBuilder;\r
-    private KieResources resources;\r
-    private KieRepository kieRepository;\r
-\r
     private AlarmInfoDao alarmInfoDaoMock;\r
 \r
     private DroolsEngine droolsEngine;\r
 \r
-    private DbDaoUtil dbDaoUtilMock;\r
+    private DbDaoUtil dbDaoUtilStub;\r
 \r
-    @Before\r
-    public void setUp() throws Exception {\r
+    public DroolsEngineTest() throws Exception {\r
         droolsEngine = new DroolsEngine();\r
+        ruleMgtWrapper = new RuleMgtWrapperStub();\r
+        dbDaoUtilStub = new DbDaoUtilStub();\r
+        Whitebox.setInternalState(droolsEngine, "daoUtil", dbDaoUtilStub);\r
+        Whitebox.setInternalState(droolsEngine, "ruleMgtWrapper", ruleMgtWrapper);\r
+        Whitebox.invokeMethod(droolsEngine, "init");\r
+    }\r
 \r
-        ks = KieServices.Factory.get();\r
-        resources = ks.getResources();\r
-        kieRepository = ks.getRepository();\r
-        kfs = Whitebox.invokeMethod(droolsEngine, "createKieFileSystemWithKProject", ks);\r
-        kieBuilder = ks.newKieBuilder(kfs).buildAll();\r
-        kieContainer = ks.newKieContainer(kieRepository.getDefaultReleaseId());\r
-        kieBase = kieContainer.getKieBase();\r
-        kieSession = kieContainer.newKieSession();\r
-\r
-        alarmInfoDaoMock = PowerMock.createMock(AlarmInfoDao.class);\r
-        dbDaoUtilMock = PowerMock.createMock(DbDaoUtil.class);\r
-\r
-\r
-        Whitebox.setInternalState(droolsEngine, "kieBase", kieBase);\r
-        Whitebox.setInternalState(droolsEngine, "kieSession", kieSession);\r
-        Whitebox.setInternalState(droolsEngine, "kieContainer", kieContainer);\r
-        Whitebox.setInternalState(droolsEngine, "kfs", kfs);\r
-        Whitebox.setInternalState(droolsEngine, "ks", ks);\r
-        Whitebox.setInternalState(droolsEngine, "kieBuilder", kieBuilder);\r
-        Whitebox.setInternalState(droolsEngine, "resources", resources);\r
-        Whitebox.setInternalState(droolsEngine, "kieRepository", kieRepository);\r
-\r
-        Whitebox.setInternalState(droolsEngine, "daoUtil", dbDaoUtilMock);\r
-        Whitebox.setInternalState(droolsEngine, "alarmInfoDao", alarmInfoDaoMock);\r
-\r
+    @Before\r
+    public void setUp() throws Exception {\r
         PowerMock.resetAll();\r
     }\r
 \r
     @Test\r
-    public void init() throws Exception {\r
-\r
-        List<CorrelationRule> rules = new ArrayList<CorrelationRule>();\r
-        CorrelationRule rule = new CorrelationRule();\r
-        rule.setContent("package content");\r
-        rule.setClosedControlLoopName("test");\r
-        rule.setPackageName("org.onap.holmes");\r
-        rules.add(rule);\r
-\r
-//        expect(ruleMgtWrapper.queryRuleByEnable(anyInt())).andReturn(rules);\r
-        List<AlarmInfo> alarmInfoList = new ArrayList<AlarmInfo>();\r
-        EasyMock.expect(dbDaoUtilMock.getJdbiDaoByOnDemand(AlarmInfoDao.class)).andReturn(alarmInfoDaoMock).anyTimes();\r
-        EasyMock.expect(alarmInfoDaoMock.queryAllAlarm()).andReturn(alarmInfoList).anyTimes();\r
-        PowerMock.replayAll();\r
-\r
-        PowerMock.verifyAll();\r
+    public void deployRule_rule_is_null() throws CorrelationException {\r
+        thrown.expect(NullPointerException.class);\r
+        droolsEngine.deployRule(null);\r
     }\r
 \r
     @Test\r
-    public void deployRule_rule_is_null() throws CorrelationException {\r
-        Locale locale = PowerMock.createMock(Locale.class);\r
-\r
-        thrown.expect(NullPointerException.class);\r
+    public void deployRule_invalid_rule_no_pkg_name() throws CorrelationException {\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent("rule123;");\r
+        thrown.expect(CorrelationException.class);\r
+        thrown.expectMessage("The package name can not be empty.");\r
 \r
-        droolsEngine.deployRule(null, locale);\r
+        droolsEngine.deployRule(rule);\r
     }\r
 \r
     @Test\r
-    public void deployRule_kbuilder_has_errors() throws CorrelationException {\r
+    public void deployRule_invalid_rule_illegal_contents() throws CorrelationException {\r
         DeployRuleRequest rule = new DeployRuleRequest();\r
-        rule.setContent("rule123");\r
-        Locale locale = new Locale(AlarmConst.I18N_EN);\r
-\r
+        rule.setContent("package rule123; a random string");\r
         thrown.expect(CorrelationException.class);\r
 \r
-        droolsEngine.deployRule(rule, locale);\r
+        droolsEngine.deployRule(rule);\r
     }\r
 \r
     @Test\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
-        droolsEngine.deployRule(rule, locale);\r
-        droolsEngine.deployRule(rule, locale);\r
+        thrown.expectMessage("A rule with the same package name already exists in the system.");\r
+        droolsEngine.deployRule(rule);\r
+        droolsEngine.deployRule(rule);\r
     }\r
 \r
     @Test\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
+        thrown.expectMessage("The package name should not be null.");\r
 \r
-        droolsEngine.undeployRule(packageName, locale);\r
+        droolsEngine.undeployRule(packageName);\r
     }\r
 \r
     @Test\r
     public void undeployRule_normal() throws CorrelationException {\r
-        Locale locale = new Locale(AlarmConst.I18N_EN);\r
-\r
         DeployRuleRequest rule = new DeployRuleRequest();\r
         rule.setContent("package rule123");\r
-        droolsEngine.deployRule(rule, locale);\r
+        droolsEngine.deployRule(rule);\r
+        droolsEngine.undeployRule("rule123");\r
+    }\r
 \r
-        String packageName = "rule123";\r
+    @Test\r
+    public void compileRule_compilation_failure() throws CorrelationException {\r
+        String content = "invalid contents";\r
 \r
-        droolsEngine.undeployRule(packageName, locale);\r
+        thrown.expect(CorrelationException.class);\r
+\r
+        droolsEngine.compileRule(content);\r
     }\r
 \r
     @Test\r
-    public void compileRule_kbuilder_has_errors() throws CorrelationException {\r
-        String content = "have error content";\r
-        Locale locale = new Locale(AlarmConst.I18N_EN);\r
-\r
+    public void compileRule_compilation_deployed_rule() throws CorrelationException {\r
+        String content = "package deployed;";\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent(content);\r
+        rule.setLoopControlName(UUID.randomUUID().toString());\r
         thrown.expect(CorrelationException.class);\r
 \r
-        droolsEngine.compileRule(content, locale);\r
+        droolsEngine.deployRule(rule);\r
+        droolsEngine.compileRule(content);\r
+    }\r
+\r
+    @Test\r
+    public void compileRule_compilation_normal() throws CorrelationException {\r
+        String content = "package deployed;";\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent(content);\r
+        rule.setLoopControlName(UUID.randomUUID().toString());\r
+\r
+        droolsEngine.compileRule(content);\r
     }\r
 \r
     @Test\r
@@ -221,9 +187,7 @@ public class DroolsEngineTest {
         alarmInfo.setRootFlag(0);\r
         alarmInfo.setAlarmIsCleared(1);\r
 \r
-        PowerMock.replayAll();\r
-        VesAlarm vesAlarm = Whitebox.invokeMethod(droolsEngine,"convertAlarmInfo2VesAlarm",alarmInfo);\r
-        PowerMock.verifyAll();\r
+        VesAlarm vesAlarm = Whitebox.invokeMethod(droolsEngine, "convertAlarmInfo2VesAlarm", alarmInfo);\r
 \r
         assertThat(vesAlarm.getAlarmIsCleared(), is(1));\r
         assertThat(vesAlarm.getSourceName(), equalTo("sourceName"));\r
@@ -234,4 +198,114 @@ public class DroolsEngineTest {
         assertThat(vesAlarm.getEventId(), equalTo("eventId"));\r
         assertThat(vesAlarm.getRootFlag(), is(0));\r
     }\r
+\r
+    @Test\r
+    public void testConvertVesAlarm2AlarmInfo() throws Exception {\r
+        VesAlarm vesAlarm = new VesAlarm();\r
+        vesAlarm.setEventId("eventId");\r
+        vesAlarm.setEventName("eventName");\r
+        vesAlarm.setStartEpochMicrosec(1L);\r
+        vesAlarm.setLastEpochMicrosec(1L);\r
+        vesAlarm.setSourceId("sourceId");\r
+        vesAlarm.setSourceName("sourceName");\r
+        vesAlarm.setRootFlag(0);\r
+        vesAlarm.setAlarmIsCleared(1);\r
+\r
+        AlarmInfo alarmInfo = Whitebox.invokeMethod(droolsEngine, "convertVesAlarm2AlarmInfo", vesAlarm);\r
+\r
+        assertThat(alarmInfo.getAlarmIsCleared(), is(1));\r
+        assertThat(alarmInfo.getSourceName(), equalTo("sourceName"));\r
+        assertThat(alarmInfo.getSourceId(), equalTo("sourceId"));\r
+        assertThat(alarmInfo.getStartEpochMicroSec(), is(1L));\r
+        assertThat(alarmInfo.getLastEpochMicroSec(), is(1L));\r
+        assertThat(alarmInfo.getEventName(), equalTo("eventName"));\r
+        assertThat(alarmInfo.getEventId(), equalTo("eventId"));\r
+        assertThat(alarmInfo.getRootFlag(), is(0));\r
+    }\r
+\r
+    @Test\r
+    public void testQueryPackagesFromEngine() throws CorrelationException {\r
+\r
+        DeployRuleRequest rule = new DeployRuleRequest();\r
+        rule.setContent("package packageCheck; rule \"test\" when eval(1==1) then System.out.println(1); end");\r
+        rule.setLoopControlName(UUID.randomUUID().toString());\r
+\r
+        droolsEngine.deployRule(rule);\r
+\r
+        List<String> packages = droolsEngine.queryPackagesFromEngine();\r
+\r
+        assertThat(packages.contains("packageCheck"), is(true));\r
+    }\r
+}\r
+\r
+class RuleMgtWrapperStub extends RuleMgtWrapper {\r
+    private List<CorrelationRule> rules;\r
+\r
+    public RuleMgtWrapperStub() {\r
+        rules = new ArrayList<>();\r
+        CorrelationRule rule = new CorrelationRule();\r
+        rule.setEnabled(1);\r
+        rule.setContent("package org.onap.holmes;");\r
+        rule.setPackageName("UT");\r
+        rule.setClosedControlLoopName(UUID.randomUUID().toString());\r
+        rules.add(rule);\r
+    }\r
+\r
+    public List<CorrelationRule> getRules() {\r
+        return rules;\r
+    }\r
+\r
+    public void setRules(List<CorrelationRule> rules) {\r
+        this.rules = rules;\r
+    }\r
+\r
+    @Override\r
+    public List<CorrelationRule> queryRuleByEnable(int enabled) throws CorrelationException {\r
+        return rules.stream().filter(rule -> rule.getEnabled() == enabled).collect(Collectors.toList());\r
+    }\r
+}\r
+\r
+class AlarmInfoDaoStub extends AlarmInfoDao {\r
+\r
+    private List<AlarmInfo> alarms;\r
+\r
+    public AlarmInfoDaoStub() {\r
+        alarms = new ArrayList<>();\r
+        AlarmInfo info = new AlarmInfo();\r
+        info.setEventId("eventId");\r
+        info.setEventName("eventName");\r
+        info.setStartEpochMicroSec(1L);\r
+        info.setLastEpochMicroSec(1L);\r
+        info.setSourceId("sourceId");\r
+        info.setSourceName("sourceName");\r
+        info.setRootFlag(0);\r
+        info.setAlarmIsCleared(1);\r
+        alarms.add(info);\r
+    }\r
+\r
+    @Override\r
+    protected String addAlarm(AlarmInfo alarmInfo) {\r
+        alarms.add(alarmInfo);\r
+        return null;\r
+    }\r
+\r
+    @Override\r
+    protected List<AlarmInfo> queryAlarm() {\r
+        return alarms;\r
+    }\r
+\r
+    @Override\r
+    protected int deleteAlarmByAlarmIsCleared(int alarmIsCleared) {\r
+        return 1;\r
+    }\r
+}\r
+\r
+class DbDaoUtilStub extends DbDaoUtil {\r
+    private AlarmInfoDao dao = new AlarmInfoDaoStub();\r
+    @Override\r
+    public <T> T getJdbiDaoByOnDemand(Class<T> daoClazz) {\r
+\r
+        return (T)dao;\r
+\r
+    }\r
 }\r