Author: mriou
Date: Wed Mar 14 17:17:44 2007
New Revision: 518392

URL: http://svn.apache.org/viewvc?view=rev&rev=518392
Log:
Tests execution seems to work. Some tests fail but some work so I guess that's 
a good sign. Since we changed a bit the way mex works and things are scheduled, 
more had to be implemented there.

Modified:
    incubator/ode/trunk/Rakefile
    
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
    
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
    
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java

Modified: incubator/ode/trunk/Rakefile
URL: 
http://svn.apache.org/viewvc/incubator/ode/trunk/Rakefile?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
--- incubator/ode/trunk/Rakefile (original)
+++ incubator/ode/trunk/Rakefile Wed Mar 14 17:17:44 2007
@@ -259,9 +259,20 @@
   end
 
   define "bpel-test" do
-    compile.with project("ode:bpel-api"), project("ode:bpel-runtime"),
+    compile.with project("ode:bpel-api"), project("ode:bpel-compiler"), 
+      project("ode:bpel-dao"), project("ode:bpel-runtime"),
       project("ode:bpel-store"), project("ode:utils"),
       DERBY, WSDL4J
+
+    tests.resources.into(path_to(:test_target_dir))
+    tests.compile.with *compile.classpath
+    tests.compile.with project("ode:bpel-schemas"), 
project("ode:bpel-scheduler-quartz"),
+      project("ode:bpel-obj"), project("ode:dao-jpa"), project("ode:minerva"),
+      project("ode:jacob"),
+      COMMONS.pool, COMMONS.lang, COMMONS.logging, DERBY, JAVAX.connector, 
+      JAVAX.transaction, JAVAX.stream, JAXEN, HSQLDB, JOTM, LOG4J, XERCES, 
OpenJPA::REQUIRES, 
+      QUARTZ, SAXON, XALAN, XMLBEANS
+    
     package :jar
   end
 

Modified: 
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: 
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
--- 
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
 (original)
+++ 
incubator/ode/trunk/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
 Wed Mar 14 17:17:44 2007
@@ -734,8 +734,11 @@
                 partnerLink.partnerLink.partnerRolePortType, operation, 
partnerEpr, myRoleEndpoint, _bpelProcess
                         .getPartnerRoleChannel(partnerLink.partnerLink));
 
+        BpelProcess p2pProcess = null;
         Endpoint partnerEndpoint = 
_bpelProcess.getInitialPartnerRoleEndpoint(partnerLink.partnerLink);
-        BpelProcess p2pProcess = 
_bpelProcess.getEngine().route(partnerEndpoint.serviceName, mex.getRequest());
+        if (partnerEndpoint != null)
+            p2pProcess = 
_bpelProcess.getEngine().route(partnerEndpoint.serviceName, mex.getRequest());
+
         if (p2pProcess != null) {
             // Creating a my mex using the same message id as partner mex to 
"pipe" them
             MyRoleMessageExchange myRoleMex = 
_bpelProcess.getEngine().createMessageExchange(

Modified: 
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
URL: 
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
--- 
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
 (original)
+++ 
incubator/ode/trunk/bpel-test/src/main/java/org/apache/ode/test/scheduler/TestScheduler.java
 Wed Mar 14 17:17:44 2007
@@ -27,23 +27,52 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
 
+/**
+ * @author Matthieu Riou <mriou at apache dot org>
+ */
 public class TestScheduler implements Scheduler {
+
+    private JobProcessor _processor;
+    private ExecutorService _executorSvc = Executors.newCachedThreadPool();
+    private ThreadLocal<Boolean> _transacted = new ThreadLocal<Boolean>();
+
     ThreadLocal<List<Scheduler.Synchronizer>> _synchros = new 
ThreadLocal<List<Scheduler.Synchronizer>>() {
         @Override
         protected List<Synchronizer> initialValue() {
             return new ArrayList<Synchronizer>();
         }
-
     };
 
-    public String schedulePersistedJob(Map<String, Object> arg0, Date arg1) 
throws ContextException {
-        return null;
+    public String schedulePersistedJob(Map<String, Object> detail, Date date) 
throws ContextException {
+        return scheduleVolatileJob(true, detail);
     }
 
-    public String scheduleVolatileJob(boolean arg0, Map<String, Object> arg1) 
throws ContextException {
+    public String scheduleVolatileJob(final boolean transacted, final 
Map<String, Object> detail) throws ContextException {
+        registerSynchronizer(new Synchronizer() {
+            public void afterCompletion(boolean success) {
+                try {
+                    if (transacted) {
+                        execIsolatedTransaction(new Callable() {
+                            public Object call() throws Exception {
+                                JobInfo ji = new JobInfo("volatileJob", 
detail, 0);
+                                doExecute(ji);
+                                return null;
+                            }
+                        });
+                    } else {
+                        JobInfo ji = new JobInfo("volatileJob", detail, 0);
+                        doExecute(ji);
+                    }
+                } catch (Exception e) {
+                    throw new ContextException("Failure when starting a new 
volatile job.", e);
+                }
+            }
+            public void beforeCompletion() { }
+        });
         return null;
     }
 
@@ -62,17 +91,15 @@
     }
 
     public <T> Future<T> execIsolatedTransaction(final Callable<T> 
transaction) throws Exception, ContextException {
-        FutureTask future = new FutureTask(new Callable<T>() {
+        return _executorSvc.submit(new Callable<T>() {
             public T call() throws Exception {
                 return execTransaction(transaction);
             }
         });
-        future.run();
-        return future;
     }
 
     public boolean isTransacted() {
-        return false;
+        return _transacted.get();
     }
 
     public void start() {
@@ -90,9 +117,11 @@
 
     public void begin() {
         _synchros.get().clear();
+        _transacted.set(Boolean.TRUE);
     }
 
     public void commit() {
+        System.out.println("COMMITING THREAD " + 
Thread.currentThread().getName());
         for (Synchronizer s : _synchros.get())
             try {
                 s.beforeCompletion();
@@ -105,6 +134,7 @@
             }
 
         _synchros.get().clear();
+        _transacted.set(Boolean.FALSE);
     }
 
     public void rollback() {
@@ -119,10 +149,21 @@
             } catch (Throwable t) {
             }
         _synchros.get().clear();
+        _transacted.set(Boolean.FALSE);
     }
 
+    private void doExecute(JobInfo ji) {
+        JobProcessor processor = _processor;
+        if (processor == null)
+            throw new RuntimeException("No processor.");
+        try {
+            processor.onScheduledJob(ji);
+        } catch (Exception jpe) {
+            throw new RuntimeException("Scheduled transaction failed 
unexpectedly: transaction will not be retried!.", jpe);
+        }
+    }
 
     public void setJobProcessor(JobProcessor processor) throws 
ContextException {
-        // Nothing to do.
+        _processor = processor;
     }
 }

Modified: 
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
URL: 
http://svn.apache.org/viewvc/incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java?view=diff&rev=518392&r1=518391&r2=518392
==============================================================================
--- 
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
 (original)
+++ 
incubator/ode/trunk/bpel-test/src/test/java/org/apache/ode/test/BPELTestAbstract.java
 Wed Mar 14 17:17:44 2007
@@ -32,6 +32,7 @@
 import org.apache.ode.store.ProcessStoreImpl;
 import org.apache.ode.test.scheduler.TestScheduler;
 import org.apache.ode.utils.DOMUtils;
+import org.apache.ode.utils.GUID;
 import org.w3c.dom.Element;
 
 import javax.persistence.EntityManager;
@@ -41,28 +42,29 @@
 import java.io.File;
 import java.util.Collection;
 import java.util.Properties;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Pattern;
 
 public abstract class BPELTestAbstract extends TestCase {
 
-       protected BpelServerImpl server;
+    protected BpelServerImpl server;
     protected ProcessStore store;
-       protected MessageExchangeContextImpl mexContext;
-       protected EntityManager em;
-       protected EntityManagerFactory emf;
+    protected MessageExchangeContextImpl mexContext;
+    protected EntityManager em;
+    protected EntityManagerFactory emf;
     protected TestScheduler scheduler;
     protected BpelDAOConnectionFactory _cf;
 
     @Override
-       protected void setUp() throws Exception {
-               server = new BpelServerImpl();
-               mexContext = new MessageExchangeContextImpl();
-               
-               
-               if ( Boolean.getBoolean("org.apache.ode.test.persitent")) {
-                       emf = 
Persistence.createEntityManagerFactory("ode-unit-test-embedded");
-                       em = emf.createEntityManager();
-                       String pr = Persistence.PERSISTENCE_PROVIDER;
+    protected void setUp() throws Exception {
+        server = new BpelServerImpl();
+        mexContext = new MessageExchangeContextImpl();
+
+        if ( Boolean.getBoolean("org.apache.ode.test.persistent")) {
+            emf = 
Persistence.createEntityManagerFactory("ode-unit-test-embedded");
+            em = emf.createEntityManager();
+            String pr = Persistence.PERSISTENCE_PROVIDER;
             _cf = new BPELDAOConnectionFactoryImpl();
             server.setDaoConnectionFactory(_cf);
             scheduler = new TestScheduler() {
@@ -82,17 +84,18 @@
                     super.rollback();
                     em.getTransaction().rollback();
                 }
-                
+
             };
-               } else {
+        } else {
             _cf = new BpelDAOConnectionFactoryImpl();
             server.setDaoConnectionFactory(_cf);
             scheduler = new TestScheduler();
-               }
+        }
         server.setInMemDaoConnectionFactory(new 
BpelDAOConnectionFactoryImpl());
         server.setScheduler(scheduler);
-               server.setBindingContext(new BindingContextImpl());
-               server.setMessageExchangeContext(mexContext);
+        server.setBindingContext(new BindingContextImpl());
+        server.setMessageExchangeContext(mexContext);
+        scheduler.setJobProcessor(server);
         store = new ProcessStoreImpl(null, "jpa", true);
         store.registerListener(new ProcessStoreListener() {
             public void onProcessStoreEvent(ProcessStoreEvent event) {
@@ -103,196 +106,199 @@
             }
         });
         server.init();
-               server.start();
-       }
+        server.start();
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        if ( em != null ) em.close();
+        if ( emf != null ) emf.close();
+        server.stop();
+    }
+
+    protected void negative(String deployDir) throws Throwable {
+        try {
+            go(deployDir);
+        } catch (junit.framework.AssertionFailedError ex) {
+            return;
+        }
+        fail("Expecting test to fail");
+    }
+
+    protected void go(String deployDir) throws Throwable {
+
+        /**
+         * The deploy directory must contain at least one "test.properties"
+         * file.
+         *
+         * The test.properties file identifies the service, operation and
+         * messages to be sent to the BPEL engine.
+         *
+         * The deploy directory may contain more than one file in the form of
+         * "testN.properties" where N represents a monotonic integer beginning
+         * with 1.
+         *
+         */
+
+        int propsFileCnt = 0;
+        File testPropsFile = new File(deployDir + "/test.properties");
+
+        if (!testPropsFile.exists()) {
+            propsFileCnt++;
+            testPropsFile = new File(deployDir + "/test" + propsFileCnt
+                    + ".properties");
+            if (!testPropsFile.exists()) {
+                System.err.println("can't find " + testPropsFile.toString());
+            }
+        }
 
-       @Override
-       protected void tearDown() throws Exception {
-               if ( em != null ) em.close();
-               if ( emf != null ) emf.close();
-               server.stop();
-       }
-
-       protected void negative(String deployDir) throws Throwable {
-               try {
-                       go(deployDir);
-               } catch (junit.framework.AssertionFailedError ex) {
-                       return;
-               }
-               fail("Expecting test to fail");
-       }
-
-       protected void go(String deployDir) throws Throwable {
-
-               /**
-                * The deploy directory must contain at least one 
"test.properties"
-                * file.
-                *
-                * The test.properties file identifies the service, operation 
and
-                * messages to be sent to the BPEL engine.
-                *
-                * The deploy directory may contain more than one file in the 
form of
-                * "testN.properties" where N represents a monotonic integer 
beginning
-                * with 1.
-                *
-                */
-
-               int propsFileCnt = 0;
-               File testPropsFile = new File(deployDir + "/test.properties");
-
-               if (!testPropsFile.exists()) {
-                       propsFileCnt++;
-                       testPropsFile = new File(deployDir + "/test" + 
propsFileCnt
-                                       + ".properties");
-                       if (!testPropsFile.exists()) {
-                               System.err.println("can't find " + 
testPropsFile.toString());
-                       }
-               }
-
-               scheduler.begin();
-               try {
-                       Collection<QName> procs =  store.deploy(new 
File(deployDir));
+        scheduler.begin();
+        try {
+            Collection<QName> procs =  store.deploy(new File(deployDir));
             for (QName procName : procs) {
                 server.register(store.getProcessConfiguration(procName));
             }
 
         } catch (ContextException bpelE) {
-                       Properties testProps = new Properties();
-                       testProps.load(testPropsFile.toURL().openStream());
-                       String responsePattern = 
testProps.getProperty("response1");
+            Properties testProps = new Properties();
+            testProps.load(testPropsFile.toURL().openStream());
+            String responsePattern = testProps.getProperty("response1");
             bpelE.printStackTrace();
-                       testResponsePattern(bpelE.getMessage(), 
responsePattern);
+            testResponsePattern(bpelE.getMessage(), responsePattern);
             return;
-               } catch ( Exception e ) {
-                       e.printStackTrace();
-                       fail();
-               }
-               scheduler.commit();
-        
-               while (testPropsFile.exists()) {
-
-                       scheduler.begin();
-                       
-                       Properties testProps = new Properties();
-                       testProps.load(testPropsFile.toURL().openStream());
-
-                       QName serviceId = new 
QName(testProps.getProperty("namespace"),
-                                       testProps.getProperty("service"));
-                       String operation = testProps.getProperty("operation");
-
-                       MyRoleMessageExchange mex = server.getEngine()
-                                       .createMessageExchange("", serviceId, 
operation);
-
-                       /**
-                        * Each property file must contain at least one 
request/response
-                        * property tuple.
-                        *
-                        * The request/response tuple should be in the form
-                        *
-                        * requestN=<message>some XML input message</message>
-                        * responseN=.*some response message.*
-                        *
-                        * Where N is a monotonic integer beginning with 1.
-                        *
-                        * If a specific MEP is expected in lieu of a response 
message use:
-                        * responseN=ASYNC responseN=ONE_WAY 
responseN=COMPLETED_OK
-                        *
-                        */
-                       try {
-                               for (int i = 1; testProps.getProperty("request" 
+ i) != null; i++) {
-       
-                                       String in = 
testProps.getProperty("request" + i);
-                                       String responsePattern = 
testProps.getProperty("response" + i);
-       
-                                       mexContext.clearCurrentResponse();
-       
-                                       Message request = 
mex.createMessage(null);
-       
-                                       Element elem = DOMUtils.stringToDOM(in);
-                                       request.setMessage(elem);
-       
-       
-                                       mex.invoke(request);
-       
-       
-                                       switch (mex.getStatus()) {
-                                       case RESPONSE:
-                                               
testResponsePattern(mex.getResponse(), responsePattern);
-                                               // TODO: test for response fault
-                                               break;
-                                       case ASYNC:
-       
-                                               switch 
(mex.getMessageExchangePattern()) {
-                                               case REQUEST_ONLY:
-                                                       if 
(!responsePattern.equals("ASYNC"))
-                                                               fail();
-                                                       break;
-                                               case REQUEST_RESPONSE:
-                                                       
testResponsePattern(mexContext.getCurrentResponse(),
-                                                                       
responsePattern);
-                                               default:
-                                                       break;
-                                               }
-       
-                                               break;
-                                       case COMPLETED_OK:
-                                               if 
(!responsePattern.equals("COMPLETED_OK"))
-                                                       
testResponsePattern(mexContext.getCurrentResponse(),
-                                                                       
responsePattern);
-                                               break;
-                                       case FAULT:
-                                               // TODO: handle Fault
-                                               System.out.println("=> " + 
mex.getFaultExplanation());
-                                               fail();
-                                               break;
-                                       case COMPLETED_FAILURE:
-                                               // TODO: handle Failure
-                                               System.out.println("=> " + 
mex.getFaultExplanation());
-                                               fail();
-                                               break;
-                                       case COMPLETED_FAULT:
-                                               // TODO: handle Failure
-                                               System.out.println("=> " + 
mex.getFaultExplanation());
-                                               fail();
-                                               break;
-                                       case FAILURE:
-                                               // TODO: handle Faulure
-                                               System.out.println("=> " + 
mex.getFaultExplanation());
-                                               fail();
-                                               break;
-                                       default:
-                                               fail();
-                                               break;
-                                       }
-                               }
-                       } catch ( Throwable e ) {
-                               e.printStackTrace();
-                               scheduler.rollback();
-                               throw e;
-                       }
-                       propsFileCnt++;
-                       testPropsFile = new File(deployDir + "/test" + 
propsFileCnt
-                                       + ".properties");
-                       scheduler.commit();
-               }
-       }
+        } catch ( Exception e ) {
+            e.printStackTrace();
+            fail();
+        }
+        scheduler.commit();
+
+        while (testPropsFile.exists()) {
+
+            Properties testProps = new Properties();
+            testProps.load(testPropsFile.toURL().openStream());
+
+            QName serviceId = new QName(testProps.getProperty("namespace"),
+                    testProps.getProperty("service"));
+            String operation = testProps.getProperty("operation");
+
+
+            /**
+             * Each property file must contain at least one request/response
+             * property tuple.
+             *
+             * The request/response tuple should be in the form
+             *
+             * requestN=<message>some XML input message</message>
+             * responseN=.*some response message.*
+             *
+             * Where N is a monotonic integer beginning with 1.
+             *
+             * If a specific MEP is expected in lieu of a response message use:
+             * responseN=ASYNC responseN=ONE_WAY responseN=COMPLETED_OK
+             *
+             */
+            for (int i = 1; testProps.getProperty("request" + i) != null; i++) 
{
+                MyRoleMessageExchange mex = null;
+                Future running = null;
+                String responsePattern = null;
+                try {
+                    scheduler.begin();
+
+                    mex = server.getEngine().createMessageExchange(new 
GUID().toString(), serviceId, operation);
+
+                    String in = testProps.getProperty("request" + i);
+                    responsePattern = testProps.getProperty("response" + i);
+
+                    mexContext.clearCurrentResponse();
+
+                    Message request = mex.createMessage(null);
+
+                    Element elem = DOMUtils.stringToDOM(in);
+                    request.setMessage(elem);
+
+
+                    running = mex.invoke(request);
+                    scheduler.commit();
+                } catch ( Throwable e ) {
+                    e.printStackTrace();
+                    scheduler.rollback();
+                    throw e;
+                }
+
+                running.get(10000, TimeUnit.MILLISECONDS);
+
+                switch (mex.getStatus()) {
+                    case RESPONSE:
+                        testResponsePattern(mex.getResponse(), 
responsePattern);
+                        // TODO: test for response fault
+                        break;
+                    case ASYNC:
+
+                        switch (mex.getMessageExchangePattern()) {
+                            case REQUEST_ONLY:
+                                if (!responsePattern.equals("ASYNC"))
+                                    fail();
+                                break;
+                            case REQUEST_RESPONSE:
+                                
testResponsePattern(mexContext.getCurrentResponse(),
+                                        responsePattern);
+                            default:
+                                break;
+                        }
+
+                        break;
+                    case COMPLETED_OK:
+                        if (!responsePattern.equals("COMPLETED_OK"))
+                            
testResponsePattern(mexContext.getCurrentResponse(),
+                                    responsePattern);
+                        break;
+                    case FAULT:
+                        // TODO: handle Fault
+                        System.out.println("=> " + mex.getFaultExplanation());
+                        fail();
+                        break;
+                    case COMPLETED_FAILURE:
+                        // TODO: handle Failure
+                        System.out.println("=> " + mex.getFaultExplanation());
+                        fail();
+                        break;
+                    case COMPLETED_FAULT:
+                        // TODO: handle Failure
+                        System.out.println("=> " + mex.getFaultExplanation());
+                        fail();
+                        break;
+                    case FAILURE:
+                        // TODO: handle Faulure
+                        System.out.println("=> " + mex.getFaultExplanation());
+                        fail();
+                        break;
+                    default:
+                        fail();
+                        break;
+                }
+            }
+            propsFileCnt++;
+            testPropsFile = new File(deployDir + "/test" + propsFileCnt
+                    + ".properties");
+        }
+    }
 
     private void testResponsePattern(Message response, String responsePattern) 
{
-               String resp = (response == null) ? "null" : DOMUtils
-                               .domToString(response.getMessage());
-               testResponsePattern(resp, responsePattern);
-       }
-
-       private void testResponsePattern(String resp, String responsePattern) {
-               boolean testValue = Pattern.compile(responsePattern, 
Pattern.DOTALL)
-                               .matcher(resp).matches();
-
-               if (!testValue) {
-                       System.out.println("=> Expected Response Pattern >> "
-                                       + responsePattern);
-                       System.out.println("=> Acutal Response >> " + resp);
-               }
-               assertTrue(testValue);
-       }
+        String resp = (response == null) ? "null" : DOMUtils
+                .domToString(response.getMessage());
+        testResponsePattern(resp, responsePattern);
+    }
+
+    private void testResponsePattern(String resp, String responsePattern) {
+        boolean testValue = Pattern.compile(responsePattern, Pattern.DOTALL)
+                .matcher(resp).matches();
+
+        if (!testValue) {
+            System.out.println("=> Expected Response Pattern >> "
+                    + responsePattern);
+            System.out.println("=> Acutal Response >> " + resp);
+        }
+        assertTrue(testValue);
+    }
 
 }


Reply via email to