001: package org.drools.integrationtests;
002:
003: import java.util.ArrayList;
004: import java.util.List;
005:
006: import junit.framework.TestCase;
007:
008: import org.drools.compiler.PackageBuilderConfiguration;
009: import org.drools.lang.descr.FunctionDescr;
010: import org.drools.lang.descr.ImportDescr;
011: import org.drools.lang.descr.PackageDescr;
012:
013: public class PackageBuilderThreadSafetyTest extends TestCase {
014:
015: private static final int _NUMBER_OF_THREADS = 100;
016: private static final int _SLEEP_TIME_MS = 100;
017:
018: protected void setUp() throws Exception {
019: super .setUp();
020: }
021:
022: public void testDummy() {
023: }
024:
025: public void FIXME_testThreadSafety() {
026: final List errors = new ArrayList();
027: final List exceptions = new ArrayList();
028: Thread[] threads = new Thread[_NUMBER_OF_THREADS];
029: for (int i = 0; i < _NUMBER_OF_THREADS; i++) {
030: final int ID = i;
031: Thread testThread = new Thread() {
032: public void run() {
033: try {
034: this .setName("Thread[" + ID + "]");
035: PackageBuilderConfiguration packageBuilderConfig = new PackageBuilderConfiguration();
036: //((JavaDialectConfiguration) packageBuilderConfig.getDialectConfiguration( "java" )).setCompiler( JavaDialectConfiguration.JANINO );
037: org.drools.compiler.PackageBuilder builder = null;
038: try {
039: builder = new org.drools.compiler.PackageBuilder(
040: packageBuilderConfig);
041: } catch (Throwable t) {
042: t.printStackTrace();
043: throw new RuntimeException(t);
044: }
045: PackageDescr packageDescr = new PackageDescr(
046: "MyRulebase");
047: addImports(packageDescr);
048: addFunctions(packageDescr);
049: // added some arbitrary sleep statements to encourage
050: // context switching and hope this provokes exceptions
051: sleep(_SLEEP_TIME_MS);
052: builder.addPackage(packageDescr);
053: sleep(_SLEEP_TIME_MS);
054: builder.getPackage();
055: sleep(_SLEEP_TIME_MS);
056: if (builder.hasErrors()) {
057: System.out
058: .println("ERROR in thread: " + ID);
059: errors.add(builder.getErrors());
060: }
061: } catch (Exception e) {
062: e.printStackTrace();
063: exceptions.add(e);
064: }
065: }
066: };
067: threads[i] = testThread;
068: try {
069: testThread.start();
070: } catch (Exception e) {
071: assertTrue(false);
072: }
073: }
074: for (int i = 0; i < _NUMBER_OF_THREADS; i++) {
075: try {
076: threads[i].join();
077: } catch (InterruptedException e) {
078: threads[i].interrupt();
079: }
080: }
081: assertTrue("Exceptions during package compilation (number="
082: + exceptions.size() + ")", exceptions.isEmpty());
083: assertTrue(
084: "PackageBuilderErrors during package compilation (number="
085: + errors.size() + ")", errors.isEmpty());
086: }
087:
088: private static void addImports(PackageDescr packageDescr) {
089: packageDescr.addImport(new ImportDescr("java.util.List"));
090: packageDescr.addImport(new ImportDescr("java.util.ArrayList"));
091: packageDescr.addImport(new ImportDescr("java.util.LinkedList"));
092: packageDescr.addImport(new ImportDescr("java.util.Set"));
093: packageDescr.addImport(new ImportDescr("java.util.HashSet"));
094: packageDescr.addImport(new ImportDescr("java.util.SortedSet"));
095: packageDescr.addImport(new ImportDescr("java.util.TreeSet"));
096: }
097:
098: private static void addFunctions(PackageDescr packageDescr) {
099: FunctionDescr functionDescr = new FunctionDescr("foo", "void");
100: functionDescr.addParameter("String", "arg1");
101: String body = "Set myHashSet = new HashSet();"
102: + "myHashSet.add(arg1);"
103: + "List myArrayList = new ArrayList();"
104: + "myArrayList.add(arg1);"
105: + "List myLinkedList = new LinkedList();"
106: + "myLinkedList.add(arg1);"
107: + "Set myTreeSet = new TreeSet();"
108: + "myTreeSet.add(arg1);";
109: functionDescr.setText(body);
110: packageDescr.addFunction(functionDescr);
111: }
112:
113: }
|