/**\r
- * Copyright 2017 ZTE Corporation.\r
- *\r
+ * Copyright 2017-2021 ZTE Corporation.\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 static org.easymock.EasyMock.anyInt;\r
-import static org.easymock.EasyMock.expect;\r
-\r
-import java.lang.reflect.Method;\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.Locale;\r
-import org.drools.KnowledgeBase;\r
-import org.drools.KnowledgeBaseConfiguration;\r
-import org.drools.KnowledgeBaseFactory;\r
-import org.drools.conf.EventProcessingOption;\r
-import org.drools.runtime.StatefulKnowledgeSession;\r
-import org.junit.Before;\r
import org.junit.Rule;\r
import org.junit.Test;\r
import org.junit.rules.ExpectedException;\r
-import org.onap.holmes.common.api.stat.VesAlarm;\r
-import org.onap.holmes.engine.request.DeployRuleRequest;\r
+import org.onap.holmes.common.api.entity.AlarmInfo;\r
import org.onap.holmes.common.api.entity.CorrelationRule;\r
-import org.onap.holmes.common.constant.AlarmConst;\r
+import org.onap.holmes.common.api.stat.VesAlarm;\r
+import org.onap.holmes.common.config.MicroServiceConfig;\r
+import org.onap.holmes.common.dmaap.store.ClosedLoopControlNameCache;\r
import org.onap.holmes.common.exception.CorrelationException;\r
+import org.onap.holmes.engine.db.AlarmInfoDaoService;\r
+import org.onap.holmes.engine.db.CorrelationRuleDaoService;\r
+import org.onap.holmes.engine.request.DeployRuleRequest;\r
import org.onap.holmes.engine.wrapper.RuleMgtWrapper;\r
-import org.powermock.api.easymock.PowerMock;\r
-import org.powermock.modules.junit4.rule.PowerMockRule;\r
import org.powermock.reflect.Whitebox;\r
\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.UUID;\r
+import java.util.stream.Collectors;\r
+\r
+import static org.hamcrest.CoreMatchers.is;\r
+import static org.hamcrest.core.IsEqual.equalTo;\r
+import static org.junit.Assert.assertThat;\r
+\r
public class DroolsEngineTest {\r
\r
@Rule\r
public ExpectedException thrown = ExpectedException.none();\r
\r
- @Rule\r
- public PowerMockRule powerMockRule = new PowerMockRule();\r
-\r
- private RuleMgtWrapper ruleMgtWrapper;\r
-\r
- private KnowledgeBase kbase;\r
-\r
- private KnowledgeBaseConfiguration kconf;\r
-\r
- private StatefulKnowledgeSession ksession;\r
-\r
+ private RuleMgtWrapper ruleMgtWrapperMock;\r
\r
private DroolsEngine droolsEngine;\r
\r
- @Before\r
- public void setUp() {\r
- droolsEngine = new DroolsEngine();\r
+ private AlarmInfoDaoService alarmInfoDaoServiceStub;\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
+ private CorrelationRuleDaoService correlationRuleDaoServiceStub;\r
\r
- ruleMgtWrapper = PowerMock.createMock(RuleMgtWrapper.class);\r
+ private ClosedLoopControlNameCache closedLoopControlNameCache;\r
\r
- Whitebox.setInternalState(droolsEngine, "ruleMgtWrapper", ruleMgtWrapper);\r
-\r
- Whitebox.setInternalState(droolsEngine, "kconf", kconf);\r
- Whitebox.setInternalState(droolsEngine, "kbase", kbase);\r
- Whitebox.setInternalState(droolsEngine, "ksession", ksession);\r
-\r
- PowerMock.resetAll();\r
+ public DroolsEngineTest() throws Exception {\r
+ System.setProperty(MicroServiceConfig.HOSTNAME, "127.0.0.1:80");\r
+ droolsEngine = new DroolsEngine();\r
+ alarmInfoDaoServiceStub = new AlarmInfoDaoServiceStub();\r
+ droolsEngine.setAlarmInfoDaoService(alarmInfoDaoServiceStub);\r
+ correlationRuleDaoServiceStub = new CorrelationRuleDaoServiceStub();\r
+ ruleMgtWrapperMock = new RuleMgtWrapperStub(correlationRuleDaoServiceStub);\r
+ closedLoopControlNameCache = new ClosedLoopControlNameCache();\r
+ droolsEngine.setClosedLoopControlNameCache(closedLoopControlNameCache);\r
+ droolsEngine.setRuleMgtWrapper(ruleMgtWrapperMock);\r
+\r
+ Whitebox.invokeMethod(droolsEngine, "run", null);\r
+ System.clearProperty(MicroServiceConfig.HOSTNAME);\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("content");\r
- rules.add(rule);\r
-\r
- expect(ruleMgtWrapper.queryRuleByEnable(anyInt())).andReturn(rules);\r
- PowerMock.replayAll();\r
-\r
- Method method = DroolsEngine.class.getDeclaredMethod("init");\r
- method.setAccessible(true);\r
- method.invoke(droolsEngine);\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
+ thrown.expect(CorrelationException.class);\r
\r
- droolsEngine.undeployRule(packageName, locale);\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
- public void putRaisedIntoStream_facthandle_is_null() {\r
+ public void putRaisedIntoStream_facthandle_is_not_null() {\r
VesAlarm raiseAlarm = new VesAlarm();\r
- raiseAlarm.setVersion((long) 245235);\r
+ raiseAlarm.setSourceId("11111");\r
+ raiseAlarm.setEventName("alarm");\r
droolsEngine.putRaisedIntoStream(raiseAlarm);\r
droolsEngine.putRaisedIntoStream(raiseAlarm);\r
}\r
\r
@Test\r
- public void putRaisedIntoStream_factHandle_is_not_null() {\r
+ public void putRaisedIntoStream_factHandle_is_null() {\r
VesAlarm raiseAlarm = new VesAlarm();\r
- raiseAlarm.setVersion((long) 245235);\r
+ raiseAlarm.setSourceId("11111");\r
+ raiseAlarm.setEventName("alarm");\r
droolsEngine.putRaisedIntoStream(raiseAlarm);\r
}\r
\r
public void stop() throws Exception {\r
droolsEngine.stop();\r
}\r
+\r
+ @Test\r
+ public void testConvertAlarmInfo2VesAlarm() throws Exception {\r
+ AlarmInfo alarmInfo = new AlarmInfo();\r
+ alarmInfo.setEventId("eventId");\r
+ alarmInfo.setEventName("eventName");\r
+ alarmInfo.setStartEpochMicroSec(1L);\r
+ alarmInfo.setLastEpochMicroSec(1L);\r
+ alarmInfo.setSourceId("sourceId");\r
+ alarmInfo.setSourceName("sourceName");\r
+ alarmInfo.setRootFlag(0);\r
+ alarmInfo.setAlarmIsCleared(1);\r
+\r
+ VesAlarm vesAlarm = Whitebox.invokeMethod(droolsEngine, "convertAlarmInfo2VesAlarm", alarmInfo);\r
+\r
+ assertThat(vesAlarm.getAlarmIsCleared(), is(1));\r
+ assertThat(vesAlarm.getSourceName(), equalTo("sourceName"));\r
+ assertThat(vesAlarm.getSourceId(), equalTo("sourceId"));\r
+ assertThat(vesAlarm.getStartEpochMicrosec(), is(1L));\r
+ assertThat(vesAlarm.getLastEpochMicrosec(), is(1L));\r
+ assertThat(vesAlarm.getEventName(), equalTo("eventName"));\r
+ 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
+ class RuleMgtWrapperStub extends RuleMgtWrapper {\r
+ private List<CorrelationRule> rules;\r
+\r
+ public RuleMgtWrapperStub(CorrelationRuleDaoService correlationRuleDaoService) {\r
+ super(correlationRuleDaoService);\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
+ rule.setEngineInstance("127.0.0.1");\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 AlarmInfoDaoServiceStub extends AlarmInfoDaoService {\r
+\r
+ private List<AlarmInfo> alarms;\r
+\r
+ public AlarmInfoDaoServiceStub() {\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
+ public AlarmInfo saveAlarm(AlarmInfo alarmInfo) {\r
+ alarms.add(alarmInfo);\r
+ return alarmInfo;\r
+ }\r
+\r
+ @Override\r
+ public List<AlarmInfo> queryAllAlarm() {\r
+ return alarms;\r
+ }\r
+\r
+ @Override\r
+ public void deleteAlarm(AlarmInfo alarmInfo) {\r
+\r
+ }\r
+ }\r
+\r
+ class CorrelationRuleDaoServiceStub extends CorrelationRuleDaoService {\r
+\r
+ }\r
}\r
+\r
+\r