Skip to content

Commit

Permalink
Merge pull request #6 from mariofusco/d1025mf
Browse files Browse the repository at this point in the history
[DROOLS-1025] fixed NPE + new test cases
  • Loading branch information
mdproctor committed Feb 10, 2016
2 parents f73ccbe + 857c109 commit 15fb9a8
Show file tree
Hide file tree
Showing 7 changed files with 1,307 additions and 966 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,13 @@
import org.kie.internal.runtime.StatefulKnowledgeSession;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

/**
Expand All @@ -38,6 +41,9 @@
public abstract class AbstractAddRemoveRulesTest {

protected static final String PKG_NAME_TEST = "com.rules";
protected static final String RULE1_NAME = "R1";
protected static final String RULE2_NAME = "R2";
protected static final String RULE3_NAME = "R3";

protected KnowledgeBuilder createKnowledgeBuilder(final KnowledgeBase kbase, final String drl) {
final KnowledgeBuilder kbuilder;
Expand All @@ -54,81 +60,120 @@ protected KnowledgeBuilder createKnowledgeBuilder(final KnowledgeBase kbase, fin
return kbuilder;
}

protected StatefulKnowledgeSession buildSessionInTwoSteps(final String... drls) {

String drl = drls[0];
final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl);
final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession();
kSession.fireAllRules();

for ( int i = 1; i < drls.length; i++) {
drl = drls[i];
final KnowledgeBuilder kbuilder2 = createKnowledgeBuilder(null, drl);
kSession.getKieBase().addKnowledgePackages(kbuilder2.getKnowledgePackages());
protected StatefulKnowledgeSession buildSessionInSteps(final String... drls) {
if (drls == null || drls.length == 0) {
return KnowledgeBaseFactory.newKnowledgeBase().newStatefulKnowledgeSession();
} else {
String drl = drls[0];
final KnowledgeBuilder kbuilder = createKnowledgeBuilder(null, drl);
final KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());

final StatefulKnowledgeSession kSession = kbase.newStatefulKnowledgeSession();
kSession.fireAllRules();

for (int i = 1; i < drls.length; i++) {
drl = drls[i];
final KnowledgeBuilder kbuilder2 = createKnowledgeBuilder(kSession.getKieBase(), drl);
kSession.getKieBase().addKnowledgePackages(kbuilder2.getKnowledgePackages());
}
return kSession;
}

return kSession;
}

protected void testRemoveWithSplitStartBasicTestSet(final String rule1, final String rule2,
final List<Object> facts,
final Map<String, Object> additionalGlobals) {
// delete before first fireAllRules
testRemoveWithSplitStartGeneral(rule1, rule2, facts, false, "[R1]", additionalGlobals);
protected void runAddRemoveTests(final String rule1, final String rule2, final String rule1Name,
final String rule2Name, final Object[] facts, final Map<String, Object> additionalGlobals) {
final List<List<TestOperation>> testPlan = AddRemoveTestBuilder.getTestPlan(rule1, rule2, rule1Name, rule2Name,
facts);
for (List<TestOperation> test : testPlan) {
runAddRemoveTest(test, additionalGlobals);
}
}

// repeat but reverse the rule order
testRemoveWithSplitStartGeneral(rule2, rule1, facts, false, "[R1]", additionalGlobals);
protected void runAddRemoveTest(final List<TestOperation> testOperations,
final Map<String, Object> additionalGlobals) {

// delete after first fireAllRules
testRemoveWithSplitStartGeneral(rule1, rule2, facts, true, "[R1, R2]", additionalGlobals);
StatefulKnowledgeSession session = null;
final List resultsList = new ArrayList();

// repeat but reverse the rule order
testRemoveWithSplitStartGeneral(rule2, rule1, facts, true, "[R1, R2]", additionalGlobals);
int index = 1;
for (TestOperation testOperation : testOperations) {
final TestOperationType testOperationType = testOperation.getType();
final Object testOperationParameter = testOperation.getParameter();
if (testOperationType != TestOperationType.CREATE_SESSION) {
checkSessionInitialized(session);
}
switch (testOperationType) {
case CREATE_SESSION:
session = createNewSession((String[]) testOperationParameter, resultsList, additionalGlobals);
break;
case ADD_RULES:
addRulesToSession(session, (String[]) testOperationParameter);
break;
case REMOVE_RULES:
removeRulesFromSession(session, (String[]) testOperationParameter);
break;
case FIRE_RULES:
session.fireAllRules();
break;
case CHECK_RESULTS:
final Set<String> expectedResultsSet = new HashSet<String>();
expectedResultsSet.addAll(Arrays.asList((String[])testOperationParameter));
if (expectedResultsSet.size() > 0) {
assertTrue(createTestFailMessage(testOperations, index), resultsList.size() > 0);
}
assertTrue(createTestFailMessage(testOperations, index), expectedResultsSet.containsAll(resultsList));
resultsList.clear();
break;
case INSERT_FACTS:
insertFactsIntoSession(session, (Object[]) testOperationParameter);
break;
default:
throw new IllegalArgumentException("Unsupported test operation: " + testOperationType + "!");
}
index++;
}
}

protected void testRemoveWithSplitStartGeneral(final String rule1, final String rule2,
final List<Object> facts,
final boolean deleteAfterFirstFire,
final String expectedResult,
final Map<String, Object> additionalGlobals) {
protected int getRulesCount(final KnowledgeBase kBase) {
int result = 0;
for (KiePackage kiePackage : kBase.getKiePackages()) {
result += kiePackage.getRules().size();
}
return result;
}

final List resultsList = new ArrayList();
private void checkSessionInitialized(final StatefulKnowledgeSession session) {
if (session == null) {
throw new IllegalStateException("Session is not initialized! Please, initialize session first.");
}
}

final StatefulKnowledgeSession session = buildSessionInTwoSteps(rule1, rule2);
private StatefulKnowledgeSession createNewSession(final String[] drls, final List resultsList,
final Map<String, Object> additionalGlobals) {
final StatefulKnowledgeSession session = buildSessionInSteps(drls);
session.setGlobal("list", resultsList);
if (additionalGlobals != null) {
insertGlobalsIntoSession(session, additionalGlobals);
}
insertFactsIntoSession(session, facts);
return session;
}

final KieBase base = session.getKieBase();
if (deleteAfterFirstFire) {
session.fireAllRules();
base.removeRule(PKG_NAME_TEST, "R2");
} else {
base.removeRule(PKG_NAME_TEST, "R2");
session.fireAllRules();
private void addRulesToSession(final StatefulKnowledgeSession session, final String[] drls) {
for (String drl : drls) {
final KnowledgeBuilder kbuilder2 = createKnowledgeBuilder(session.getKieBase(), drl);
session.getKieBase().addKnowledgePackages(kbuilder2.getKnowledgePackages());
}
System.out.println( resultsList.toString() );

base.removeRule(PKG_NAME_TEST, "R1");
session.fireAllRules();
assertEquals(expectedResult, resultsList.toString());
resultsList.clear();
}

protected int getRulesCount(final KnowledgeBase kBase) {
int result = 0;
for (KiePackage kiePackage : kBase.getKiePackages()) {
result += kiePackage.getRules().size();
private void removeRulesFromSession(final StatefulKnowledgeSession session, final String[] ruleNames) {
final KieBase kieBase = session.getKieBase();
for (String ruleName : ruleNames) {
kieBase.removeRule(PKG_NAME_TEST, ruleName);
}
return result;
}

private void insertFactsIntoSession(final StatefulKnowledgeSession session, final List<Object> facts) {
private void insertFactsIntoSession(final StatefulKnowledgeSession session, final Object[] facts) {
for (Object fact: facts) {
session.insert(fact);
}
Expand All @@ -139,4 +184,15 @@ private void insertGlobalsIntoSession(final StatefulKnowledgeSession session, fi
session.setGlobal(globalEntry.getKey(), globalEntry.getValue());
}
}

private String createTestFailMessage(final List<TestOperation> testOperations, final int operationIndex) {
final StringBuilder messageBuilder = new StringBuilder();
final String lineSeparator = System.getProperty("line.separator");
messageBuilder.append("Test failed on " + operationIndex + "th operation! Operations:" + lineSeparator);
for (TestOperation testOperation : testOperations) {
messageBuilder.append(testOperation.toString());
messageBuilder.append(lineSeparator);
}
return messageBuilder.toString();
}
}
Loading

0 comments on commit 15fb9a8

Please sign in to comment.