[jboss-svn-commits] JBL Code SVN: r25594 - labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Mar 11 11:50:31 EDT 2009


Author: tirelli
Date: 2009-03-11 11:50:31 -0400 (Wed, 11 Mar 2009)
New Revision: 25594

Modified:
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java
Log:
JBRULES-1991: adding test case

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java	2009-03-11 15:38:28 UTC (rev 25593)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/rule/builder/dialect/mvel/MVELSalienceBuilderTest.java	2009-03-11 15:50:31 UTC (rev 25594)
@@ -14,7 +14,6 @@
 import org.drools.common.InternalFactHandle;
 import org.drools.compiler.DialectCompiletimeRegistry;
 import org.drools.compiler.PackageBuilder;
-import org.drools.compiler.PackageBuilderConfiguration;
 import org.drools.lang.descr.AttributeDescr;
 import org.drools.lang.descr.RuleDescr;
 import org.drools.reteoo.LeftTuple;
@@ -24,24 +23,30 @@
 import org.drools.rule.builder.SalienceBuilder;
 import org.drools.spi.ObjectType;
 import org.drools.spi.PatternExtractor;
+import org.drools.spi.Salience;
 
 public class MVELSalienceBuilderTest extends TestCase {
-    
-    public void testSimpleExpression() {        
+    private InstrumentedBuildContent context;
+    private RuleBase                 ruleBase;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
         final Package pkg = new Package( "pkg1" );
         final RuleDescr ruleDescr = new RuleDescr( "rule 1" );
-        ruleDescr.addAttribute( new AttributeDescr( "salience", "(p.age + 20)/2" ) );
+        ruleDescr.addAttribute( new AttributeDescr( "salience",
+                                                    "(p.age + 20)/2" ) );
         ruleDescr.setConsequence( "" );
 
         PackageBuilder pkgBuilder = new PackageBuilder( pkg );
         DialectCompiletimeRegistry dialectRegistry = pkgBuilder.getPackageRegistry( pkg.getName() ).getDialectCompiletimeRegistry();
-        MVELDialect mvelDialect = ( MVELDialect ) dialectRegistry.getDialect( "mvel" );
+        MVELDialect mvelDialect = (MVELDialect) dialectRegistry.getDialect( "mvel" );
 
-        final InstrumentedBuildContent context = new InstrumentedBuildContent( pkgBuilder,
-                                                                               ruleDescr,
-                                                                               dialectRegistry,
-                                                                               pkg,                                                                               
-                                                                               mvelDialect );
+        context = new InstrumentedBuildContent( pkgBuilder,
+                                                ruleDescr,
+                                                dialectRegistry,
+                                                pkg,
+                                                mvelDialect );
 
         final InstrumentedDeclarationScopeResolver declarationResolver = new InstrumentedDeclarationScopeResolver();
 
@@ -55,25 +60,124 @@
         final Declaration declaration = new Declaration( "p",
                                                          extractor,
                                                          pattern );
-        final Map map = new HashMap();
+        final Map<String, Declaration> map = new HashMap<String, Declaration>();
         map.put( "p",
                  declaration );
         declarationResolver.setDeclarations( map );
         context.setDeclarationResolver( declarationResolver );
 
-        final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
-        final WorkingMemory wm = ruleBase.newStatefulSession();
+        ruleBase = RuleBaseFactory.newRuleBase();
+        SalienceBuilder salienceBuilder = new MVELSalienceBuilder();
+        salienceBuilder.build( context );
 
-        final Person p = new Person("mark", "", 31);
+        ((MVELSalienceExpression) context.getRule().getSalience()).compile( Thread.currentThread().getContextClassLoader() );
+
+    }
+
+    public void testSimpleExpression() {
+        WorkingMemory wm = ruleBase.newStatefulSession();
+
+        final Person p = new Person( "mark",
+                                     "",
+                                     31 );
         final InternalFactHandle f0 = (InternalFactHandle) wm.insert( p );
-        final LeftTuple tuple = new LeftTuple( f0, null, true );
+        final LeftTuple tuple = new LeftTuple( f0,
+                                               null,
+                                               true );
 
-        SalienceBuilder salienceBuilder = new MVELSalienceBuilder();
-        salienceBuilder.build( context );
-        
-        ((MVELSalienceExpression)context.getRule().getSalience()).compile( Thread.currentThread().getContextClassLoader() );
-                
-        assertEquals( 25, context.getRule().getSalience().getValue( tuple, wm ) );
-      
+        assertEquals( 25,
+                      context.getRule().getSalience().getValue( tuple,
+                                                                wm ) );
+
     }
+
+    public void testMultithreadSalienceExpression() {
+        final int tcount = 10;
+        final SalienceEvaluator[] evals = new SalienceEvaluator[tcount];
+        final Thread[] threads = new Thread[tcount];
+        for ( int i = 0; i < evals.length; i++ ) {
+            evals[i] = new SalienceEvaluator( ruleBase,
+                                              context.getRule().getSalience(),
+                                              new Person( "bob" + i,
+                                                          30 + (i * 3) ) );
+            threads[i] = new Thread( evals[i] );
+        }
+        for ( int i = 0; i < threads.length; i++ ) {
+            threads[i].start();
+        }
+        for ( int i = 0; i < threads.length; i++ ) {
+            try {
+                threads[i].join();
+            } catch ( InterruptedException e ) {
+                e.printStackTrace();
+            }
+        }
+        int errors = 0;
+        for ( int i = 0; i < evals.length; i++ ) {
+            if ( evals[i].isError() ) {
+                errors++;
+            }
+        }
+        assertEquals( "There shouldn't be any threads in error: ",
+                      0,
+                      errors );
+
+    }
+
+    public static class SalienceEvaluator
+        implements
+        Runnable {
+        public static final int   iterations = 1000;
+
+        private Salience          salience;
+        private LeftTuple         tuple;
+        private WorkingMemory     wm;
+        private final int         result;
+        private transient boolean halt;
+
+        private boolean           error;
+
+        public SalienceEvaluator(RuleBase ruleBase,
+                                 Salience salience,
+                                 Person person) {
+            wm = ruleBase.newStatefulSession();
+            final InternalFactHandle f0 = (InternalFactHandle) wm.insert( person );
+            tuple = new LeftTuple( f0,
+                                   null,
+                                   true );
+            this.salience = salience;
+            this.halt = false;
+            this.error = false;
+            this.result = (person.getAge() + 20) / 2;
+        }
+
+        public void run() {
+            try {
+                Thread.sleep( 1000 );
+                for ( int i = 0; i < iterations && !halt; i++ ) {
+                    assertEquals( result,
+                                  salience.getValue( tuple,
+                                                     wm ) );
+                    Thread.currentThread().yield();
+                }
+            } catch ( Throwable e ) {
+                e.printStackTrace();
+                this.error = true;
+            }
+        }
+
+        public void halt() {
+            this.halt = true;
+        }
+
+        public boolean isError() {
+            return error;
+        }
+
+        public void setError(boolean error) {
+            this.error = error;
+        }
+
+    }
+
 }




More information about the jboss-svn-commits mailing list