[jboss-svn-commits] JBL Code SVN: r36399 - labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Dec 13 17:40:46 EST 2010
Author: eaa
Date: 2010-12-13 17:40:46 -0500 (Mon, 13 Dec 2010)
New Revision: 36399
Modified:
labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java
Log:
JBRULES-2817: Make the KnowledgeAgent Tests more robust and faster
- KnowledgeAgentDSLTest was migrated to the new test approach
Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java 2010-12-13 17:14:59 UTC (rev 36398)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/agent/KnowledgeAgentDSLTest.java 2010-12-13 22:40:46 UTC (rev 36399)
@@ -1,124 +1,48 @@
package org.drools.agent;
-import java.io.BufferedWriter;
import java.io.File;
-import java.io.FileWriter;
-import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
-import junit.framework.TestCase;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.Person;
-import org.drools.core.util.FileManager;
-import org.drools.event.knowledgeagent.AfterChangeSetAppliedEvent;
-import org.drools.event.knowledgeagent.AfterChangeSetProcessedEvent;
-import org.drools.event.knowledgeagent.AfterResourceProcessedEvent;
-import org.drools.event.knowledgeagent.BeforeChangeSetAppliedEvent;
-import org.drools.event.knowledgeagent.BeforeChangeSetProcessedEvent;
-import org.drools.event.knowledgeagent.BeforeResourceProcessedEvent;
-import org.drools.event.knowledgeagent.KnowledgeAgentEventListener;
-import org.drools.event.knowledgeagent.KnowledgeBaseUpdatedEvent;
-import org.drools.event.knowledgeagent.ResourceCompilationFailedEvent;
-import org.drools.io.ResourceChangeScannerConfiguration;
import org.drools.io.ResourceFactory;
-import org.drools.io.impl.ResourceChangeNotifierImpl;
-import org.drools.io.impl.ResourceChangeScannerImpl;
import org.drools.runtime.StatefulKnowledgeSession;
-import org.mortbay.jetty.Server;
-import org.mortbay.jetty.handler.ResourceHandler;
-public class KnowledgeAgentDSLTest extends TestCase {
+public class KnowledgeAgentDSLTest extends BaseKnowledgeAgentTest {
- FileManager fileManager;
- private Server server;
- private final Object lock = new Object();
- private volatile boolean kbaseUpdated;
- private boolean compilationErrors;
-
-
- @Override
- protected void setUp() throws Exception {
- fileManager = new FileManager();
- fileManager.setUp();
- ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
-
- ResourceFactory.getResourceChangeNotifierService().start();
- ResourceFactory.getResourceChangeScannerService().start();
-
- this.server = new Server(0);
- ResourceHandler resourceHandler = new ResourceHandler();
- resourceHandler.setResourceBase(fileManager.getRootDirectory().getPath());
-
- server.setHandler(resourceHandler);
-
- server.start();
-
- this.kbaseUpdated = false;
- }
-
- private int getPort() {
- return this.server.getConnectors()[0].getLocalPort();
- }
-
- @Override
- protected void tearDown() throws Exception {
- fileManager.tearDown();
- ResourceFactory.getResourceChangeNotifierService().stop();
- ResourceFactory.getResourceChangeScannerService().stop();
- ((ResourceChangeNotifierImpl) ResourceFactory.getResourceChangeNotifierService()).reset();
- ((ResourceChangeScannerImpl) ResourceFactory.getResourceChangeScannerService()).reset();
-
- server.stop();
- }
-
public void testDSLAndIncrementalChangeSet() throws Exception {
- String header = "";
- header += "package org.drools.test\n";
- header += "import org.drools.Person\n\n";
- header += "global java.util.List list\n\n";
-
//create a basic dsl file
- File f1 = fileManager.newFile("myExpander.dsl");
- Writer output = new BufferedWriter(new FileWriter(f1));
- output.write(this.createCommonDSL(null));
- output.close();
+ this.fileManager.write("myExpander.dsl", this.createCommonDSL(null));
//create a basic dslr file
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule1"));
String xml = "";
xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
xml += " xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
xml += " xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >";
xml += " <add> ";
- xml += " <resource source='http://localhost:" + this.getPort() + "/rules.drl' type='DSLR' />";
+ xml += " <resource source='http://localhost:" + this.getPort() + "/rules.dslr' type='DSLR' />";
xml += " <resource source='http://localhost:" + this.getPort() + "/myExpander.dsl' type='DSL' />";
xml += " </add> ";
xml += "</change-set>";
- File fxml = fileManager.newFile("changeset.xml");
- output = new BufferedWriter(new FileWriter(fxml));
- output.write(xml);
- output.close();
+ File fxml = fileManager.write( "changeset.xml",
+ xml );
List<String> list = new ArrayList<String>();
//Create a new Agent with newInstace=true
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
- KnowledgeAgent kagent = this.createKAgent(kbase, false);
+ KnowledgeAgent kagent = this.createKAgent( kbase, false );
//Agent: take care of them!
- kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
+ this.applyChangeSet(kagent, ResourceFactory.newUrlResource(fxml.toURI().toURL()));
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
-
ksession.setGlobal("list", list);
ksession.insert(new Person());
ksession.fireAllRules();
@@ -128,26 +52,16 @@
assertTrue(list.contains("Rule1"));
list.clear();
- kbaseUpdated = false;
-
- Thread.sleep(2000);
+
//the dsl is now modified.
- f1 = fileManager.newFile("myExpander.dsl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(this.createCommonDSL("name == \"John\""));
- output.close();
+ File expander = this.fileManager.write("myExpander.dsl", this.createCommonDSL("name == \"John\""));
//We also need to mark the dslr file as modified, so the rules could
//be regenerated
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule1"));
-
- this.waitUntilKBaseUpdate();
-
+ this.scan(kagent);
+
ksession.insert(new Person());
ksession.fireAllRules();
@@ -165,14 +79,9 @@
assertTrue(list.contains("Rule1"));
//let's add a new rule
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.write(this.createCommonDSLRRule("Rule2"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule(new String[]{"Rule1","Rule2"}));
- this.waitUntilKBaseUpdate();
+ this.scan(kagent);
list.clear();
ksession.fireAllRules();
@@ -182,16 +91,11 @@
assertTrue(list.contains("Rule2"));
//let's remove Rule1 and Rule2 and add a new rule: Rule3
- Thread.sleep(2000);
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule3"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule3"));
- this.waitUntilKBaseUpdate();
-
- //we don't want to use a new ksession.
+ this.scan(kagent);
+
+ //we want to use a new ksession.
ksession.dispose();
ksession = kbase.newStatefulKnowledgeSession();
@@ -206,75 +110,51 @@
assertTrue(list.contains("Rule3"));
//let's delete the dsl file (errors are expected)
- Thread.sleep(2000);
- f1 = fileManager.newFile("myExpander.dsl");
- f1.delete();
+ this.fileManager.deleteFile(expander);
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule1"));
+
+ try {
+ this.scan(kagent);
+ fail( "Knowledge should fail to compile" );
+ } catch (Exception e) {
+
+ }
- this.waitUntilKBaseUpdate();
-
- //Compilation errors should occurred
- assertTrue(this.compilationErrors);
- this.compilationErrors=false;
-
ksession.dispose();
- kagent.monitorResourceChangeEvents(false);
+ kagent.dispose();
}
public void testDSLAndNewInstance() throws Exception {
- System.out.println("\n\ntestDSLAndNewInstance\n\n");
-
- String header = "";
- header += "package org.drools.test\n";
- header += "import org.drools.Person\n\n";
- header += "global java.util.List list\n\n";
-
//create a basic dsl file
- File f1 = fileManager.newFile("myExpander.dsl");
- Writer output = new BufferedWriter(new FileWriter(f1));
- output.write(this.createCommonDSL(null));
- output.close();
+ this.fileManager.write("myExpander.dsl", this.createCommonDSL(null));
//create a basic dslr file
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
+ this.fileManager.write("rules.dslr",this.createCommonDSLRRule("Rule1"));
String xml = "";
xml += "<change-set xmlns='http://drools.org/drools-5.0/change-set'";
xml += " xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'";
xml += " xs:schemaLocation='http://drools.org/drools-5.0/change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-api/src/main/resources/change-set-1.0.0.xsd' >";
xml += " <add> ";
- xml += " <resource source='http://localhost:" + this.getPort() + "/rules.drl' type='DSLR' />";
+ xml += " <resource source='http://localhost:" + this.getPort() + "/rules.dslr' type='DSLR' />";
xml += " <resource source='http://localhost:" + this.getPort() + "/myExpander.dsl' type='DSL' />";
xml += " </add> ";
xml += "</change-set>";
- File fxml = fileManager.newFile("changeset.xml");
- output = new BufferedWriter(new FileWriter(fxml));
- output.write(xml);
- output.close();
+ File fxml = fileManager.write( "changeset.xml",
+ xml );
List<String> list = new ArrayList<String>();
- KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
-
//Create a new Agent with newInstace=true
+ KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
KnowledgeAgent kagent = this.createKAgent(kbase,true);
//Agent: take care of them!
- kagent.applyChangeSet(ResourceFactory.newUrlResource(fxml.toURI().toURL()));
- this.kbaseUpdated = false;
+ this.applyChangeSet(kagent,ResourceFactory.newUrlResource(fxml.toURI().toURL()));
StatefulKnowledgeSession ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
-
ksession.setGlobal("list", list);
ksession.insert(new Person());
ksession.fireAllRules();
@@ -286,22 +166,14 @@
ksession.dispose();
- Thread.sleep(2000);
//Let's modify the dsl file
- f1 = fileManager.newFile("myExpander.dsl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(this.createCommonDSL("name == \"John\""));
- output.close();
+ File expander = this.fileManager.write("myExpander.dsl", this.createCommonDSL("name == \"John\""));
- //We need to mark the dslr file as modified (even when it was not) so
- //the agent could recreate the rules it contains using the new dsl.
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
+ //We also need to mark the dslr file as modified, so the rules could
+ //be regenerated
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule1"));
- this.waitUntilKBaseUpdate();
+ this.scan(kagent);
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
@@ -325,17 +197,11 @@
ksession.dispose();
- Thread.sleep(2000);
//Let's add a new Rule
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.write(this.createCommonDSLRRule("Rule2"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule(new String[]{"Rule1","Rule2"}));
- this.waitUntilKBaseUpdate();
-
+ this.scan(kagent);
+
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
@@ -353,14 +219,10 @@
Thread.sleep(2000);
//Let's remove both rules and add a new one: Rule3
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule3"));
- output.close();
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule3"));
- this.waitUntilKBaseUpdate();
-
+ this.scan(kagent);
+
//get a new ksession
ksession = kagent.getKnowledgeBase().newStatefulKnowledgeSession();
@@ -377,116 +239,19 @@
Thread.sleep(2000);
//let's delete the dsl file (errors are expected)
- f1 = fileManager.newFile("myExpander.dsl");
- f1.delete();
+ fileManager.deleteFile(expander);
- f1 = fileManager.newFile("rules.drl");
- output = new BufferedWriter(new FileWriter(f1));
+ this.fileManager.write("rules.dslr", this.createCommonDSLRRule("Rule1"));
- output.write(header);
- output.write(this.createCommonDSLRRule("Rule1"));
- output.close();
-
- this.waitUntilKBaseUpdate();
-
- //Compilation errors should occurred
- assertTrue(this.compilationErrors);
- this.compilationErrors=false;
-
-
- kagent.monitorResourceChangeEvents(false);
- }
-
- private KnowledgeAgent createKAgent(KnowledgeBase kbase, boolean newInstance) {
- ResourceChangeScannerConfiguration sconf = ResourceFactory.getResourceChangeScannerService().newResourceChangeScannerConfiguration();
- sconf.setProperty("drools.resource.scanner.interval", "2");
- ResourceFactory.getResourceChangeScannerService().configure(sconf);
-
- //System.setProperty(KnowledgeAgentFactory.PROVIDER_CLASS_NAME_PROPERTY_NAME, "org.drools.agent.impl.KnowledgeAgentProviderImpl");
-
- KnowledgeAgentConfiguration aconf = KnowledgeAgentFactory.newKnowledgeAgentConfiguration();
- aconf.setProperty("drools.agent.scanDirectories", "true");
- aconf.setProperty("drools.agent.scanResources", "true");
- // Testing incremental build here
- aconf.setProperty("drools.agent.newInstance", "" + newInstance);
-
- KnowledgeAgent kagent = KnowledgeAgentFactory.newKnowledgeAgent(
- "test agent", kbase, aconf);
-
- final KnowledgeAgentDSLTest test = this;
- kagent.addEventListener(new KnowledgeAgentEventListener() {
-
- public void beforeChangeSetApplied(BeforeChangeSetAppliedEvent event) {
- }
-
- public void afterChangeSetApplied(AfterChangeSetAppliedEvent event) {
- }
-
- public void beforeChangeSetProcessed(BeforeChangeSetProcessedEvent event) {
- }
-
- public void afterChangeSetProcessed(AfterChangeSetProcessedEvent event) {
- }
-
- public void beforeResourceProcessed(BeforeResourceProcessedEvent event) {
- }
-
- public void afterResourceProcessed(AfterResourceProcessedEvent event) {
- }
-
- public void knowledgeBaseUpdated(KnowledgeBaseUpdatedEvent event) {
- System.out.println("KBase was updated");
- synchronized (lock) {
- kbaseUpdated = true;
- lock.notifyAll();
- }
- }
-
- public void resourceCompilationFailed(ResourceCompilationFailedEvent event) {
- compilationErrors = true;
- }
- });
-
- assertEquals("test agent", kagent.getName());
-
- return kagent;
- }
-
- private String createCommonDSLRRule(String ruleName) {
- StringBuilder sb = new StringBuilder();
- sb.append("rule ");
- sb.append(ruleName);
- sb.append("\n");
- sb.append("when\n");
- sb.append("There is a Person\n");
- sb.append("then\n");
- sb.append("add rule's name to list;\n");
- sb.append("end\n");
-
- return sb.toString();
- }
-
- private String createCommonDSL(String restriction) {
- StringBuilder sb = new StringBuilder();
- sb.append("[condition][]There is a Person = Person(");
- if (restriction != null) {
- sb.append(restriction);
+ try {
+ this.scan(kagent);
+ //Compilation errors should occurred
+ fail( "Knowledge should fail to compile" );
+ } catch (Exception e) {
+
}
- sb.append(")\n");
- sb.append("[consequence][]add rule's name to list = list.add( drools.getRule().getName() );\n");
- return sb.toString();
- }
- private void waitUntilKBaseUpdate() {
- synchronized (lock) {
- while (!kbaseUpdated) {
- try {
- lock.wait();
- } catch (InterruptedException e) {
- }
- System.out.println("Waking up!");
- }
- kbaseUpdated = false;
- }
+
+ kagent.dispose();
}
}
More information about the jboss-svn-commits
mailing list