package rocks.inspectit.server.diagnosis.engine.rule; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; import java.util.Arrays; import java.util.Collections; import org.mockito.InjectMocks; import org.mockito.Mock; import org.testng.annotations.Test; import rocks.inspectit.server.diagnosis.engine.rule.RuleDefinition.RuleDefinitionBuilder; import rocks.inspectit.server.diagnosis.engine.rule.exception.RuleDefinitionException; import rocks.inspectit.server.diagnosis.engine.rule.exception.RuleExecutionException; import rocks.inspectit.server.diagnosis.engine.rule.factory.Rules; import rocks.inspectit.server.diagnosis.engine.tag.Tag; import rocks.inspectit.server.diagnosis.engine.tag.Tags; import rocks.inspectit.server.diagnosis.engine.testrules.RuleA; import rocks.inspectit.server.diagnosis.engine.testrules.RuleF; import rocks.inspectit.server.diagnosis.engine.testrules.RuleG; import rocks.inspectit.server.diagnosis.engine.testrules.RuleWithSessionVariable; import rocks.inspectit.shared.all.testbase.TestBase; /** * Tests the {@link RuleDefinition} class. * * @author Alexander Wert * */ public class RuleDefinitionTest extends TestBase { /** * Tests the {@link RuleDefinition#execute(RuleInput, java.util.Map)} and * {@link RuleDefinition#execute(java.util.Collection, java.util.Map)} methods. * * @author Alexander Wert * */ public class Execute extends RuleDefinitionTest { @Test public void simpleRuleExecution() throws RuleDefinitionException, RuleExecutionException { RuleDefinition ruleDefinition = Rules.define(RuleA.class); String inputStr = "hallo"; RuleInput input = new RuleInput(Tags.tag(Tags.ROOT_TAG, inputStr)); RuleOutput output = ruleDefinition.execute(input, Collections.<String, Object> emptyMap()); assertThat(output.getRuleName(), equalTo(ruleDefinition.getName())); assertThat(output.getTags(), hasSize(1)); assertThat(output.getTags().iterator().next().getValue(), equalTo((Object) (inputStr + inputStr))); } @Test public void ruleWithSessionVariableExecution() throws RuleDefinitionException, RuleExecutionException { RuleDefinition ruleDefinition = Rules.define(RuleWithSessionVariable.class); String inputStr = "hallo"; String sessionVar = "sessionVar"; RuleInput input = new RuleInput(Tags.tag(Tags.ROOT_TAG, inputStr)); RuleOutput output = ruleDefinition.execute(input, Collections.singletonMap(sessionVar, (Object) sessionVar)); assertThat(output.getRuleName(), equalTo(ruleDefinition.getName())); assertThat(output.getTags(), hasSize(1)); assertThat(output.getTags().iterator().next().getValue(), equalTo((Object) (inputStr + sessionVar))); } @Test public void ruleWithConditionSuccessExecution() throws RuleDefinitionException, RuleExecutionException { RuleDefinition ruleDefinition = Rules.define(RuleF.class); String inputStrA = "hallo"; String inputStrE = "again"; Tag tagA = Tags.tag("A", inputStrA); Tag tagE = Tags.tag("E", inputStrE); RuleInput inputE = new RuleInput(tagE, Arrays.asList(tagA, tagE)); RuleOutput output = ruleDefinition.execute(inputE, Collections.<String, Object> emptyMap()); assertThat(output.getRuleName(), equalTo(ruleDefinition.getName())); assertThat(output.getTags(), hasSize(1)); assertThat(output.getTags().iterator().next().getValue(), equalTo((Object) (inputStrA + inputStrE))); } @Test public void ruleWithConditionFailureExecution() throws RuleDefinitionException, RuleExecutionException { RuleDefinition ruleDefinition = Rules.define(RuleG.class); String inputStr = "hallo"; RuleInput input = new RuleInput(Tags.tag("A", inputStr)); RuleOutput output = ruleDefinition.execute(input, Collections.<String, Object> emptyMap()); assertThat(output.getRuleName(), equalTo(ruleDefinition.getName())); assertThat(output.getConditionFailures(), hasSize(1)); assertThat(output.getTags(), empty()); } } /** * Tests the {@link RuleDefinition.RuleDefinitionBuilder#build()} method. * * @author Alexander Wert * */ public class RuleDefinitionBuilder_Build extends RuleDefinitionTest { @InjectMocks RuleDefinitionBuilder builder; @Mock ActionMethod actionMethod; @Mock ConditionMethod conditionMethod; @Mock FireCondition fireCondition; @Mock SessionVariableInjection sessionVariableInjection; @Mock TagInjection tagInjection; @Test @SuppressWarnings("rawtypes") public void valid() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); RuleDefinition ruleDefinition = builder.build(); assertThat(ruleDefinition.getActionMethod(), equalTo(actionMethod)); assertThat(ruleDefinition.getConditionMethods(), equalTo(Arrays.asList(conditionMethod))); assertThat(ruleDefinition.getDescription(), equalTo("Some Description")); assertThat(ruleDefinition.getFireCondition(), equalTo(fireCondition)); assertThat((Class) ruleDefinition.getImplementation(), equalTo((Class) RuleA.class)); assertThat(ruleDefinition.getName(), equalTo("SomeName")); assertThat(ruleDefinition.getSessionVariableInjections(), equalTo(Arrays.asList(sessionVariableInjection))); assertThat(ruleDefinition.getTagInjections(), equalTo(Arrays.asList(tagInjection))); } @Test @SuppressWarnings("rawtypes") public void emptyConditionMethods() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Collections.<ConditionMethod> emptyList()); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); RuleDefinition ruleDefinition = builder.build(); assertThat(ruleDefinition.getActionMethod(), equalTo(actionMethod)); assertThat(ruleDefinition.getConditionMethods(), empty()); assertThat(ruleDefinition.getDescription(), equalTo("Some Description")); assertThat(ruleDefinition.getFireCondition(), equalTo(fireCondition)); assertThat((Class) ruleDefinition.getImplementation(), equalTo((Class) RuleA.class)); assertThat(ruleDefinition.getName(), equalTo("SomeName")); assertThat(ruleDefinition.getSessionVariableInjections(), equalTo(Arrays.asList(sessionVariableInjection))); assertThat(ruleDefinition.getTagInjections(), equalTo(Arrays.asList(tagInjection))); } @Test @SuppressWarnings("rawtypes") public void emptySessionVariables() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Collections.<SessionVariableInjection> emptyList()); builder.setTagInjections(Arrays.asList(tagInjection)); RuleDefinition ruleDefinition = builder.build(); assertThat(ruleDefinition.getActionMethod(), equalTo(actionMethod)); assertThat(ruleDefinition.getConditionMethods(), equalTo(Arrays.asList(conditionMethod))); assertThat(ruleDefinition.getDescription(), equalTo("Some Description")); assertThat(ruleDefinition.getFireCondition(), equalTo(fireCondition)); assertThat((Class) ruleDefinition.getImplementation(), equalTo((Class) RuleA.class)); assertThat(ruleDefinition.getName(), equalTo("SomeName")); assertThat(ruleDefinition.getSessionVariableInjections(), empty()); assertThat(ruleDefinition.getTagInjections(), equalTo(Arrays.asList(tagInjection))); } @Test @SuppressWarnings("rawtypes") public void missingDescription() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); RuleDefinition ruleDefinition = builder.build(); assertThat(ruleDefinition.getActionMethod(), equalTo(actionMethod)); assertThat(ruleDefinition.getConditionMethods(), equalTo(Arrays.asList(conditionMethod))); assertThat(ruleDefinition.getDescription(), equalTo(RuleDefinition.EMPTY_DESCRIPTION)); assertThat(ruleDefinition.getFireCondition(), equalTo(fireCondition)); assertThat((Class) ruleDefinition.getImplementation(), equalTo((Class) RuleA.class)); assertThat(ruleDefinition.getName(), equalTo("SomeName")); assertThat(ruleDefinition.getSessionVariableInjections(), equalTo(Arrays.asList(sessionVariableInjection))); assertThat(ruleDefinition.getTagInjections(), equalTo(Arrays.asList(tagInjection))); } @Test @SuppressWarnings("rawtypes") public void missingName() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); RuleDefinition ruleDefinition = builder.build(); assertThat(ruleDefinition.getActionMethod(), equalTo(actionMethod)); assertThat(ruleDefinition.getConditionMethods(), equalTo(Arrays.asList(conditionMethod))); assertThat(ruleDefinition.getDescription(), equalTo("Some Description")); assertThat(ruleDefinition.getFireCondition(), equalTo(fireCondition)); assertThat((Class) ruleDefinition.getImplementation(), equalTo((Class) RuleA.class)); assertThat(ruleDefinition.getName(), equalTo(RuleA.class.getCanonicalName())); assertThat(ruleDefinition.getSessionVariableInjections(), equalTo(Arrays.asList(sessionVariableInjection))); assertThat(ruleDefinition.getTagInjections(), equalTo(Arrays.asList(tagInjection))); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingActionMethod() { builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingConditionMethods() { builder.setActionMethod(actionMethod); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingFireCondition() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingImplementation() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Arrays.asList(tagInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingSessionVariables() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setTagInjections(Arrays.asList(tagInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void missingTagInjections() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.build(); } @Test(expectedExceptions = { IllegalStateException.class }) public void emptyTagInjections() { builder.setActionMethod(actionMethod); builder.setConditionMethods(Arrays.asList(conditionMethod)); builder.setDescription("Some Description"); builder.setFireCondition(fireCondition); builder.setImplementation(RuleA.class); builder.setName("SomeName"); builder.setSessionVariableInjections(Arrays.asList(sessionVariableInjection)); builder.setTagInjections(Collections.<TagInjection> emptyList()); builder.build(); } } }