use of org.camunda.bpm.engine.test.util.ExecutionTree in project camunda-bpm-platform by camunda.
the class ProcessInstanceModificationTest method testStartAfterWithAncestorInstanceIdTwoScopesUp.
@Deployment(resources = DOUBLE_NESTED_SUB_PROCESS)
public void testStartAfterWithAncestorInstanceIdTwoScopesUp() {
// given two instances of the outer subprocess
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("doubleNestedSubprocess");
String processInstanceId = processInstance.getId();
runtimeService.createProcessInstanceModification(processInstance.getId()).startBeforeActivity("subProcess").execute();
// when I start the inner subprocess task without explicit ancestor
try {
runtimeService.createProcessInstanceModification(processInstance.getId()).startAfterActivity("innerSubProcessStart").execute();
// then the command fails
fail("should not succeed because the ancestors are ambiguous");
} catch (ProcessEngineException e) {
// happy path
}
// when I start the inner subprocess task with an explicit ancestor activity
// instance id
ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstanceId);
ActivityInstance randomSubProcessInstance = getChildInstanceForActivity(updatedTree, "subProcess");
// then the command suceeds
runtimeService.createProcessInstanceModification(processInstanceId).startAfterActivity("innerSubProcessStart", randomSubProcessInstance.getId()).execute();
// and the trees are correct
updatedTree = runtimeService.getActivityInstance(processInstanceId);
assertNotNull(updatedTree);
assertEquals(processInstanceId, updatedTree.getProcessInstanceId());
assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).beginScope("subProcess").activity("subProcessTask").endScope().beginScope("subProcess").activity("subProcessTask").beginScope("innerSubProcess").activity("innerSubProcessTask").done());
ActivityInstance innerSubProcessInstance = getChildInstanceForActivity(updatedTree, "innerSubProcess");
assertEquals(randomSubProcessInstance.getId(), innerSubProcessInstance.getParentActivityInstanceId());
ExecutionTree executionTree = ExecutionTree.forExecution(processInstanceId, processEngine);
assertThat(executionTree).matches(describeExecutionTree(null).scope().child(null).concurrent().noScope().child("subProcessTask").scope().up().up().child(null).concurrent().noScope().child(null).scope().child("subProcessTask").concurrent().noScope().up().child(null).concurrent().noScope().child("innerSubProcessTask").scope().done());
assertEquals(3, taskService.createTaskQuery().count());
// complete the process
completeTasksInOrder("subProcessTask", "subProcessTask", "innerSubProcessTask", "innerSubProcessTask", "innerSubProcessTask");
assertProcessEnded(processInstanceId);
}
use of org.camunda.bpm.engine.test.util.ExecutionTree in project camunda-bpm-platform by camunda.
the class ProcessInstanceModificationAsyncTest method testCancelAsyncAfterTransitionInstance.
@Deployment(resources = NESTED_ASYNC_AFTER_TASK_PROCESS)
public void testCancelAsyncAfterTransitionInstance() {
// given a process instance with an asyncAfter task in a subprocess
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("nestedOneTaskProcess");
Task innerTask = taskService.createTaskQuery().taskDefinitionKey("innerTask").singleResult();
assertNotNull(innerTask);
taskService.complete(innerTask.getId());
ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId());
assertEquals(1, managementService.createJobQuery().count());
// when the async task is cancelled via cancelTransitionInstance
runtimeService.createProcessInstanceModification(processInstance.getId()).cancelTransitionInstance(getChildTransitionInstanceForTargetActivity(tree, "innerTask").getId()).execute();
// then the job has been removed
assertEquals(0, managementService.createJobQuery().count());
// and the activity instance and execution trees match
ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstance.getId());
assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).activity("outerTask").done());
ExecutionTree executionTree = ExecutionTree.forExecution(processInstance.getId(), processEngine);
assertThat(executionTree).matches(describeExecutionTree("outerTask").scope().done());
// and the process can be completed successfully
completeTasksInOrder("outerTask");
assertProcessEnded(processInstance.getId());
}
use of org.camunda.bpm.engine.test.util.ExecutionTree in project camunda-bpm-platform by camunda.
the class ProcessInstanceModificationAsyncTest method testStartBeforeAndCancelSingleTransitionInstance.
/**
* CAM-4090
*/
@Deployment(resources = NESTED_PARALLEL_ASYNC_BEFORE_SCOPE_TASK_PROCESS)
public void testStartBeforeAndCancelSingleTransitionInstance() {
// given there is one transition instance in a scope
ProcessInstance instance = runtimeService.createProcessInstanceByKey("nestedConcurrentTasksProcess").startBeforeActivity("innerTask1").execute();
ActivityInstance tree = runtimeService.getActivityInstance(instance.getId());
TransitionInstance transitionInstance = tree.getTransitionInstances("innerTask1")[0];
// when I start an activity in the same scope
// and cancel the first transition instance
runtimeService.createProcessInstanceModification(instance.getId()).startBeforeActivity("innerTask2").cancelTransitionInstance(transitionInstance.getId()).execute();
// then the activity was successfully instantiated
tree = runtimeService.getActivityInstance(instance.getId());
assertThat(tree).hasStructure(describeActivityInstanceTree(instance.getProcessDefinitionId()).beginScope("subProcess").transition("innerTask2").done());
// assert executions
ExecutionTree executionTree = ExecutionTree.forExecution(instance.getId(), processEngine);
assertThat(executionTree).matches(describeExecutionTree(null).scope().child("innerTask2").scope().done());
}
use of org.camunda.bpm.engine.test.util.ExecutionTree in project camunda-bpm-platform by camunda.
the class ProcessInstanceModificationAsyncTest method testCancelParentScopeOfParallelAsyncBeforeScopeActivity.
@Deployment(resources = NESTED_PARALLEL_ASYNC_BEFORE_SCOPE_TASK_PROCESS)
public void testCancelParentScopeOfParallelAsyncBeforeScopeActivity() {
// given a process instance with two concurrent async scope tasks in a subprocess
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("nestedConcurrentTasksProcess");
ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId());
// when I cancel the subprocess
runtimeService.createProcessInstanceModification(processInstance.getId()).cancelActivityInstance(getInstanceIdForActivity(tree, "subProcess")).execute();
// then the process instance is in a valid state
ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstance.getId());
assertNotNull(updatedTree);
assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).activity("outerTask").done());
ExecutionTree executionTree = ExecutionTree.forExecution(processInstance.getId(), processEngine);
assertThat(executionTree).matches(describeExecutionTree("outerTask").scope().done());
completeTasksInOrder("outerTask");
assertProcessEnded(processInstance.getId());
}
use of org.camunda.bpm.engine.test.util.ExecutionTree in project camunda-bpm-platform by camunda.
the class ProcessInstanceModificationAsyncTest method testCancelAsyncAfterEndEventTransitionInstance.
@Deployment(resources = NESTED_ASYNC_AFTER_END_EVENT_PROCESS)
public void testCancelAsyncAfterEndEventTransitionInstance() {
// given a process instance with an asyncAfter end event in a subprocess
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("nestedAsyncEndEventProcess");
ActivityInstance tree = runtimeService.getActivityInstance(processInstance.getId());
assertEquals(1, managementService.createJobQuery().count());
// when the async task is cancelled via cancelTransitionInstance
runtimeService.createProcessInstanceModification(processInstance.getId()).cancelTransitionInstance(getChildTransitionInstanceForTargetActivity(tree, "subProcessEnd").getId()).execute();
// then the job has been removed
assertEquals(0, managementService.createJobQuery().count());
// and the activity instance and execution trees match
ActivityInstance updatedTree = runtimeService.getActivityInstance(processInstance.getId());
assertThat(updatedTree).hasStructure(describeActivityInstanceTree(processInstance.getProcessDefinitionId()).activity("outerTask").done());
ExecutionTree executionTree = ExecutionTree.forExecution(processInstance.getId(), processEngine);
assertThat(executionTree).matches(describeExecutionTree("outerTask").scope().done());
// and the process can be completed successfully
completeTasksInOrder("outerTask");
assertProcessEnded(processInstance.getId());
}
Aggregations