[jbpm-commits] JBoss JBPM SVN: r5219 - jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/msg/command.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Jul 3 23:34:11 EDT 2009


Author: alex.guizar at jboss.com
Date: 2009-07-03 23:34:11 -0400 (Fri, 03 Jul 2009)
New Revision: 5219

Modified:
   jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
Log:
make AsyncExecutionDbTest resistant to stale state exceptions

Modified: jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java
===================================================================
--- jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java	2009-07-04 02:08:39 UTC (rev 5218)
+++ jbpm3/branches/jbpm-3.2-soa/modules/core/src/test/java/org/jbpm/msg/command/AsyncExecutionDbTest.java	2009-07-04 03:34:11 UTC (rev 5219)
@@ -21,169 +21,146 @@
  */
 package org.jbpm.msg.command;
 
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
+import org.jbpm.context.exe.ContextInstance;
 import org.jbpm.db.AbstractDbTestCase;
 import org.jbpm.graph.def.ActionHandler;
-import org.jbpm.graph.def.Node;
 import org.jbpm.graph.def.ProcessDefinition;
 import org.jbpm.graph.exe.ExecutionContext;
 import org.jbpm.graph.exe.ProcessInstance;
 
 public class AsyncExecutionDbTest extends AbstractDbTestCase {
 
-  static List recordedNodes = new ArrayList();
-
   private static int TIMEOUT = 60 * 1000;
 
   public static class RecordNode implements ActionHandler {
-
     private static final long serialVersionUID = 1L;
 
     public void execute(ExecutionContext executionContext) throws Exception {
-      Node node = executionContext.getNode();
-      recordedNodes.add(node.getName());
-      node.leave(executionContext);
+      Integer count = (Integer) executionContext.getVariable("count");
+      count = new Integer(count != null ? count.intValue() + 1 : 1);
+      executionContext.setVariable("count", count);
+      executionContext.setVariable(executionContext.getNode().getName(), count);
+      executionContext.leaveNode();
     }
   }
 
   public void testAsyncExecution() throws Exception {
+    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='async exec'>" +
+        "  <start-state>" +
+        "    <transition to='one' />" +
+        "  </start-state>" +
+        "  <node async='true' name='one'>" +
+        "    <action class='" +
+        RecordNode.class.getName() +
+        "' />" +
+        "    <transition to='two' />" +
+        "  </node>" +
+        "  <node async='exclusive' name='two'>" +
+        "    <action class='" +
+        RecordNode.class.getName() +
+        "' />" +
+        "    <transition to='three' />" +
+        "  </node>" +
+        "  <node async='true' name='three'>" +
+        "    <action class='" +
+        RecordNode.class.getName() +
+        "' />" +
+        "    <transition to='end' />" +
+        "  </node>" +
+        "  <end-state name='end' />" +
+        "</process-definition>");
+    jbpmContext.deployProcessDefinition(processDefinition);
 
-    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
-        + "  <start-state>"
-        + "    <transition to='one' />"
-        + "  </start-state>"
-        + "  <node async='true' name='one'>"
-        + "    <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
-        + "    <transition to='two' />"
-        + "  </node>"
-        + "  <node async='exclusive' name='two'>"
-        + "    <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
-        + "    <transition to='three' />"
-        + "  </node>"
-        + "  <node async='true' name='three'>"
-        + "    <action class='org.jbpm.msg.command.AsyncExecutionDbTest$RecordNode' />"
-        + "    <transition to='end' />"
-        + "  </node>"
-        + "  <end-state name='end' />"
-        + "</process-definition>");
-    processDefinition = saveAndReload(processDefinition);
+    newTransaction();
     try {
       ProcessInstance processInstance = new ProcessInstance(processDefinition);
       processInstance.signal();
       jbpmContext.save(processInstance);
 
-      assertEquals(processDefinition.getNode("one"), processInstance.getRootToken().getNode());
+      assertEquals("one", processInstance.getRootToken().getNode().getName());
       assertEquals(1, getNbrOfJobsAvailable());
 
       processJobs(TIMEOUT);
 
-      assertEquals(0, getNbrOfJobsAvailable());
-
-      List expectedNodes = new ArrayList();
-      expectedNodes.add("one");
-      expectedNodes.add("two");
-      expectedNodes.add("three");
-
-      assertEquals(expectedNodes, recordedNodes);
-
-      processDefinition = graphSession.loadProcessDefinition(processDefinition.getId());
-      processInstance = graphSession.loadProcessInstance(processInstance.getId());
+      processInstance = jbpmContext.loadProcessInstance(processInstance.getId());
       assertTrue(processInstance.hasEnded());
-      assertEquals(processDefinition.getNode("end"), processInstance.getRootToken().getNode());
+
+      ContextInstance contextInstance = processInstance.getContextInstance();
+      String[] nodes = { "one", "two", "three" };
+      for (int i = 0; i < nodes.length; i++) {
+        Integer value = (Integer) contextInstance.getVariable(nodes[i]);
+        assertEquals(i + 1, value.intValue());
+      }
     }
     finally {
       jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
     }
-
   }
 
-  static Set recordedActionNumbers = new HashSet();
-
   public static class RecordAction implements ActionHandler {
-
     private static final long serialVersionUID = 1L;
-    String nbr;
 
     public void execute(ExecutionContext executionContext) throws Exception {
-      recordedActionNumbers.add(nbr);
+      executionContext.setVariable(executionContext.getAction().getName(), Boolean.TRUE);
     }
   }
 
   public void testAsyncAction() throws Exception {
-    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition>"
+    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='async action'>"
         + "  <event type='process-start'>"
-        + "    <action async='true' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "      <nbr>1</nbr>"
-        + "    </action>"
-        + "    <action async='exclusive' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "      <nbr>2</nbr>"
-        + "    </action>"
-        + "  </event>"
-        + "  <start-state>"
-        + "    <transition to='one'>"
-        + "      <action async='true' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "        <nbr>3</nbr>"
-        + "      </action>"
-        + "      <action async='exclusive' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "        <nbr>4</nbr>"
-        + "      </action>"
-        + "    </transition>"
-        + "  </start-state>"
-        + "  <node name='one'>"
-        + "    <event type='node-enter'>"
-        + "      <action async='true' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "        <nbr>5</nbr>"
-        + "      </action>"
-        + "      <action async='exclusive' class='"
-        + RecordAction.class.getName()
-        + "'>"
-        + "        <nbr>6</nbr>"
-        + "      </action>"
-        + "    </event>"
-        + "    <transition to='end' />"
-        + "  </node>"
-        + "  <end-state name='end' />"
-        + "</process-definition>");
-    processDefinition = saveAndReload(processDefinition);
+        + "    <action name='sa' async='true' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "    <action name='se' async='exclusive' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "  </event>" +
+        "  <start-state>" +
+        "    <transition to='one'>" +
+        "      <action name='ta' async='true' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "      <action name='te' async='exclusive' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "    </transition>" +
+        "  </start-state>" +
+        "  <node name='one'>" +
+        "    <event type='node-enter'>" +
+        "      <action name='na' async='true' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "      <action name='ne' async='exclusive' class='" +
+        RecordAction.class.getName() +
+        "'/>" +
+        "    </event>" +
+        "    <transition to='end' />" +
+        "  </node>" +
+        "  <end-state name='end' />" +
+        "</process-definition>");
+    jbpmContext.deployProcessDefinition(processDefinition);
+
+    newTransaction();
     try {
       ProcessInstance processInstance = new ProcessInstance(processDefinition);
       processInstance.signal();
       jbpmContext.save(processInstance);
-      assertEquals(processDefinition.getNode("end"), processInstance.getRootToken().getNode());
+
+      assertEquals("end", processInstance.getRootToken().getNode().getName());
       assertEquals(6, getNbrOfJobsAvailable());
-      assertEquals(0, recordedActionNumbers.size());
 
       processJobs(TIMEOUT);
 
-      assertEquals(0, getNbrOfJobsAvailable());
+      processInstance = jbpmContext.loadProcessInstance(processInstance.getId());
 
-      HashSet expected = new HashSet();
-      expected.add("1");
-      expected.add("2");
-      expected.add("3");
-      expected.add("4");
-      expected.add("5");
-      expected.add("6");
-
-      assertEquals(expected, recordedActionNumbers);
+      ContextInstance contextInstance = processInstance.getContextInstance();
+      String[] actions = { "sa", "se", "ta", "te", "na", "ne" };
+      for (int i = 0; i < actions.length; i++) {
+        assertEquals(Boolean.TRUE, contextInstance.getVariable(actions[i]));
+      }
     }
     finally {
       jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
     }
-
   }
 }




More information about the jbpm-commits mailing list