package org.jbpm.command; import java.util.Iterator; import org.jbpm.JbpmException; import org.jbpm.db.AbstractDbTestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; /** * Tests for {@link Command}s working on {@link ProcessInstance} * * @author bernd.ruecker@camunda.com */ public class ProcessInstanceCommandTest extends AbstractDbTestCase { public void testCancelProcessInstanceCommand() throws Exception { String xml = "<process-definition name='TestException'>" + " <start-state name='start'>" + " <transition to='fork' />" + " </start-state>" + " <fork name='fork'>" + " <transition name='path1' to='path1' />" + " <transition name='path2' to='path2' />" + " </fork>" + " <state name='path1'>" + " <transition to='join' />" + " </state>" + " <state name='path2'>" + " <transition to='join' />" + " </state>" + " <join name='join'>" + " <transition to='end' />" + " </join>" + " <end-state name='end' />" + "</process-definition>"; ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(xml); deployProcessDefinition(processDefinition); ProcessInstance processInstance = processDefinition.createProcessInstance(); processInstance.signal(); processInstance = saveAndReload(processInstance); assert !processInstance.hasEnded() : processInstance; Token rootToken = processInstance.getRootToken(); assertEquals("fork", rootToken.getNode().getName()); for (Iterator iterator = rootToken.getChildren().values().iterator(); iterator.hasNext();) { Token childToken = (Token) iterator.next(); assert !childToken.hasEnded() : childToken; } // execute CancelProcessInstanceCommand new CancelProcessInstanceCommand(processInstance.getId()).execute(jbpmContext); // and verify it is canceled assert rootToken.hasEnded() : processInstance; assertEquals("fork", rootToken.getNode().getName()); for (Iterator iterator = rootToken.getChildren().values().iterator(); iterator.hasNext();) { Token childToken = (Token) iterator.next(); assert childToken.hasEnded() : childToken; } } public void testSuspendResumeProcessInstanceCommand() throws Exception { String xml = "<?xml version='1.0'?>" + "<process-definition name='TestException'>" + " <start-state name='start'>" + " <transition to='fork' />" + " </start-state>" + " <fork name='fork'>" + " <transition name='path1' to='path1' />" + " <transition name='path2' to='path2' />" + " </fork>" + " <state name='path1'>" + " <transition to='join' />" + " </state>" + " <state name='path2'>" + " <transition to='join' />" + " </state>" + " <join name='join'>" + " <transition to='end' />" + " </join>" + " <end-state name='end' />" + "</process-definition>"; ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(xml); deployProcessDefinition(processDefinition); ProcessInstance processInstance = processDefinition.createProcessInstance(); processInstance.signal(); processInstance = saveAndReload(processInstance); assert !processInstance.isSuspended() : processInstance; Token rootToken = processInstance.getRootToken(); assert !rootToken.isSuspended() : rootToken; assertEquals("fork", rootToken.getNode().getName()); for (Iterator iterator = rootToken.getChildren().values().iterator(); iterator.hasNext();) { Token childToken = (Token) iterator.next(); assert !childToken.isSuspended() : childToken; } // execute SuspendProcessInstanceCommand new SuspendProcessInstanceCommand().processInstanceId( processInstance.getId()).execute(jbpmContext); // and verify assert processInstance.isSuspended() : processInstance; assert rootToken.isSuspended() : rootToken; assertEquals("fork", rootToken.getNode().getName()); for (Iterator iterator = rootToken.getChildren().values().iterator(); iterator.hasNext();) { Token childToken = (Token) iterator.next(); assert childToken.isSuspended() : childToken; try { childToken.signal(); fail("signal should not be accepted on suspended token"); } catch (JbpmException ex) { // token is suspended assert ex.getMessage().indexOf("suspended") != 0 : ex.getMessage(); } } // execute ResumeProcessInstanceCommand new ResumeProcessInstanceCommand().processInstanceId( processInstance.getId()).execute(jbpmContext); // and verify assert !processInstance.isSuspended() : processInstance; assert !rootToken.isSuspended() : rootToken; for (Iterator iter = rootToken.getChildren().values().iterator(); iter.hasNext();) { Token childToken = (Token) iter.next(); assert !childToken.isSuspended() : childToken; childToken.signal(); } assertEquals("end", rootToken.getNode().getName()); assert processInstance.hasEnded() : processInstance; // check db state processInstance = saveAndReload(processInstance); assertEquals("end", processInstance.getRootToken().getNode().getName()); assert processInstance.hasEnded() : processInstance; } }