/* Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.activiti.engine.test.bpmn.multiinstance; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.activiti.engine.history.HistoricActivityInstance; import org.activiti.engine.history.HistoricProcessInstance; import org.activiti.engine.history.HistoricTaskInstance; import org.activiti.engine.impl.history.HistoryLevel; import org.activiti.engine.impl.test.PluggableActivitiTestCase; import org.activiti.engine.impl.util.ClockUtil; import org.activiti.engine.impl.util.CollectionUtil; import org.activiti.engine.runtime.Execution; import org.activiti.engine.runtime.Job; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; import org.activiti.engine.test.Deployment; /** * @author Joram Barrez */ public class MultiInstanceTest extends PluggableActivitiTestCase { @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.sequentialUserTasks.bpmn20.xml"}) public void testSequentialUserTasks() { String procId = runtimeService.startProcessInstanceByKey("miSequentialUserTasks", CollectionUtil.singletonMap("nrOfLoops", 3)).getId(); Task task = taskService.createTaskQuery().singleResult(); assertEquals("My Task", task.getName()); assertEquals("kermit_0", task.getAssignee()); taskService.complete(task.getId()); task = taskService.createTaskQuery().singleResult(); assertEquals("My Task", task.getName()); assertEquals("kermit_1", task.getAssignee()); taskService.complete(task.getId()); task = taskService.createTaskQuery().singleResult(); assertEquals("My Task", task.getName()); assertEquals("kermit_2", task.getAssignee()); taskService.complete(task.getId()); assertNull(taskService.createTaskQuery().singleResult()); assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.sequentialUserTasks.bpmn20.xml"}) public void testSequentialUserTasksHistory() { runtimeService.startProcessInstanceByKey("miSequentialUserTasks", CollectionUtil.singletonMap("nrOfLoops", 4)).getId(); for (int i=0; i<4; i++) { taskService.complete(taskService.createTaskQuery().singleResult().getId()); } if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().list(); assertEquals(4, historicTaskInstances.size()); for (HistoricTaskInstance ht : historicTaskInstances) { assertNotNull(ht.getAssignee()); assertNotNull(ht.getStartTime()); assertNotNull(ht.getEndTime()); } List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityType("userTask").list(); assertEquals(4, historicActivityInstances.size()); for (HistoricActivityInstance hai : historicActivityInstances) { assertNotNull(hai.getActivityId()); assertNotNull(hai.getActivityName()); assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); assertNotNull(hai.getAssignee()); } } } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.sequentialUserTasks.bpmn20.xml"}) public void testSequentialUserTasksWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miSequentialUserTasks", CollectionUtil.singletonMap("nrOfLoops", 3)).getId(); // Complete 1 tasks taskService.complete(taskService.createTaskQuery().singleResult().getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.sequentialUserTasks.bpmn20.xml"}) public void testSequentialUserTasksCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miSequentialUserTasks", CollectionUtil.singletonMap("nrOfLoops", 10)).getId(); // 10 tasks are to be created, but completionCondition stops them at 5 for (int i=0; i<5; i++) { Task task = taskService.createTaskQuery().singleResult(); taskService.complete(task.getId()); } assertNull(taskService.createTaskQuery().singleResult()); assertProcessEnded(procId); } @Deployment public void testNestedSequentialUserTasks() { String procId = runtimeService.startProcessInstanceByKey("miNestedSequentialUserTasks").getId(); for (int i=0; i<3; i++) { Task task = taskService.createTaskQuery().taskAssignee("kermit").singleResult(); assertEquals("My Task", task.getName()); taskService.complete(task.getId()); } assertProcessEnded(procId); } @Deployment public void testParallelUserTasks() { String procId = runtimeService.startProcessInstanceByKey("miParallelUserTasks").getId(); List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(3, tasks.size()); assertEquals("My Task 0", tasks.get(0).getName()); assertEquals("My Task 1", tasks.get(1).getName()); assertEquals("My Task 2", tasks.get(2).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); taskService.complete(tasks.get(2).getId()); assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelUserTasks.bpmn20.xml"}) public void testParallelUserTasksHistory() { runtimeService.startProcessInstanceByKey("miParallelUserTasks"); for (Task task : taskService.createTaskQuery().list()) { taskService.complete(task.getId()); } // Validate history if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().orderByTaskAssignee().asc().list(); for (int i=0; i<historicTaskInstances.size(); i++) { HistoricTaskInstance hi = historicTaskInstances.get(i); assertNotNull(hi.getStartTime()); assertNotNull(hi.getEndTime()); assertEquals("kermit_"+i, hi.getAssignee()); } List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityType("userTask").list(); assertEquals(3, historicActivityInstances.size()); for (HistoricActivityInstance hai : historicActivityInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); assertNotNull(hai.getAssignee()); assertEquals("userTask", hai.getActivityType()); } } } @Deployment public void testParallelUserTasksWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miParallelUserTasksWithTimer").getId(); List<Task> tasks = taskService.createTaskQuery().list(); taskService.complete(tasks.get(0).getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment public void testParallelUserTasksCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miParallelUserTasksCompletionCondition").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(5, tasks.size()); // Completing 3 tasks gives 50% of tasks completed, which triggers completionCondition for (int i=0; i<3; i++) { assertEquals(5-i, taskService.createTaskQuery().count()); taskService.complete(tasks.get(i).getId()); } assertProcessEnded(procId); } @Deployment public void testParallelUserTasksBasedOnCollection() { List<String> assigneeList = Arrays.asList("kermit", "gonzo", "mispiggy", "fozzie", "bubba"); String procId = runtimeService.startProcessInstanceByKey("miParallelUserTasksBasedOnCollection", CollectionUtil.singletonMap("assigneeList", assigneeList)).getId(); List<Task> tasks = taskService.createTaskQuery().orderByTaskAssignee().asc().list(); assertEquals(5, tasks.size()); assertEquals("bubba", tasks.get(0).getAssignee()); assertEquals("fozzie", tasks.get(1).getAssignee()); assertEquals("gonzo", tasks.get(2).getAssignee()); assertEquals("kermit", tasks.get(3).getAssignee()); assertEquals("mispiggy", tasks.get(4).getAssignee()); // Completing 3 tasks will trigger completioncondition taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); taskService.complete(tasks.get(2).getId()); assertEquals(0, taskService.createTaskQuery().count()); assertProcessEnded(procId); } @Deployment public void testParallelUserTasksCustomExtensions() { Map<String, Object> vars = new HashMap<String, Object>(); List<String> assigneeList = Arrays.asList("kermit", "gonzo", "fozzie"); vars.put("assigneeList", assigneeList); runtimeService.startProcessInstanceByKey("miSequentialUserTasks", vars); for (String assignee : assigneeList) { Task task = taskService.createTaskQuery().singleResult(); assertEquals(assignee, task.getAssignee()); taskService.complete(task.getId()); } } @Deployment public void testParallelUserTasksExecutionAndTaskListeners() { runtimeService.startProcessInstanceByKey("miParallelUserTasks"); List<Task> tasks = taskService.createTaskQuery().list(); for (Task task : tasks) { taskService.complete(task.getId()); } Execution waitState = runtimeService.createExecutionQuery().singleResult(); assertEquals(3, runtimeService.getVariable(waitState.getId(), "taskListenerCounter")); assertEquals(3, runtimeService.getVariable(waitState.getId(), "executionListenerCounter")); } @Deployment public void testNestedParallelUserTasks() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelUserTasks").getId(); List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list(); for (Task task : tasks) { assertEquals("My Task", task.getName()); taskService.complete(task.getId()); } assertProcessEnded(procId); } @Deployment public void testSequentialScriptTasks() { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("sum", 0); vars.put("nrOfLoops", 5); runtimeService.startProcessInstanceByKey("miSequentialScriptTask", vars); Execution waitStateExecution = runtimeService.createExecutionQuery().singleResult(); int sum = (Integer) runtimeService.getVariable(waitStateExecution.getId(), "sum"); assertEquals(10, sum); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testSequentialScriptTasks.bpmn20.xml"}) public void testSequentialScriptTasksHistory() { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("sum", 0); vars.put("nrOfLoops", 7); runtimeService.startProcessInstanceByKey("miSequentialScriptTask", vars); // Validate history if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricActivityInstance> historicInstances = historyService.createHistoricActivityInstanceQuery().activityType("scriptTask").orderByActivityId().asc().list(); assertEquals(7, historicInstances.size()); for (int i=0; i<7; i++) { HistoricActivityInstance hai = historicInstances.get(i); assertEquals("scriptTask", hai.getActivityType()); assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); } } } @Deployment public void testSequentialScriptTasksCompletionCondition() { runtimeService.startProcessInstanceByKey("miSequentialScriptTaskCompletionCondition").getId(); Execution waitStateExecution = runtimeService.createExecutionQuery().singleResult(); int sum = (Integer) runtimeService.getVariable(waitStateExecution.getId(), "sum"); assertEquals(5, sum); } @Deployment public void testParallelScriptTasks() { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("sum", 0); vars.put("nrOfLoops", 10); runtimeService.startProcessInstanceByKey("miParallelScriptTask", vars); Execution waitStateExecution = runtimeService.createExecutionQuery().singleResult(); int sum = (Integer) runtimeService.getVariable(waitStateExecution.getId(), "sum"); assertEquals(45, sum); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelScriptTasks.bpmn20.xml"}) public void testParallelScriptTasksHistory() { Map<String, Object> vars = new HashMap<String, Object>(); vars.put("sum", 0); vars.put("nrOfLoops", 4); runtimeService.startProcessInstanceByKey("miParallelScriptTask", vars); if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityType("scriptTask").list(); assertEquals(4, historicActivityInstances.size()); for (HistoricActivityInstance hai : historicActivityInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getStartTime()); } } } @Deployment public void testParallelScriptTasksCompletionCondition() { runtimeService.startProcessInstanceByKey("miParallelScriptTaskCompletionCondition"); Execution waitStateExecution = runtimeService.createExecutionQuery().singleResult(); int sum = (Integer) runtimeService.getVariable(waitStateExecution.getId(), "sum"); assertEquals(2, sum); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelScriptTasksCompletionCondition.bpmn20.xml"}) public void testParallelScriptTasksCompletionConditionHistory() { runtimeService.startProcessInstanceByKey("miParallelScriptTaskCompletionCondition"); if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityType("scriptTask").list(); assertEquals(2, historicActivityInstances.size()); } } @Deployment public void testSequentialSubProcess() { String procId = runtimeService.startProcessInstanceByKey("miSequentialSubprocess").getId(); TaskQuery query = taskService.createTaskQuery().orderByTaskName().asc(); for (int i=0; i<4; i++) { List<Task> tasks = query.list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); if(i != 3) { List<String> activities = runtimeService.getActiveActivityIds(procId); assertNotNull(activities); assertEquals(2, activities.size()); } } assertProcessEnded(procId); } @Deployment public void testSequentialSubProcessEndEvent() { // ACT-1185: end-event in subprocess causes inactivated execution String procId = runtimeService.startProcessInstanceByKey("miSequentialSubprocess").getId(); TaskQuery query = taskService.createTaskQuery().orderByTaskName().asc(); for (int i=0; i<4; i++) { List<Task> tasks = query.list(); assertEquals(1, tasks.size()); assertEquals("task one", tasks.get(0).getName()); taskService.complete(tasks.get(0).getId()); // Last run, the execution no longer exists if(i != 3) { List<String> activities = runtimeService.getActiveActivityIds(procId); assertNotNull(activities); assertEquals(1, activities.size()); } } assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testSequentialSubProcess.bpmn20.xml"}) public void testSequentialSubProcessHistory() { runtimeService.startProcessInstanceByKey("miSequentialSubprocess"); for (int i=0; i<4; i++) { List<Task> tasks = taskService.createTaskQuery().list(); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } // Validate history if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricActivityInstance> onlySubProcessInstances = historyService.createHistoricActivityInstanceQuery().activityType("subProcess").list(); assertEquals(4, onlySubProcessInstances.size()); List<HistoricActivityInstance> historicInstances = historyService.createHistoricActivityInstanceQuery().activityType("subProcess").list(); assertEquals(4, historicInstances.size()); for (HistoricActivityInstance hai : historicInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); } historicInstances = historyService.createHistoricActivityInstanceQuery().activityType("userTask").list(); assertEquals(8, historicInstances.size()); for (HistoricActivityInstance hai : historicInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); } } } @Deployment public void testSequentialSubProcessWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miSequentialSubprocessWithTimer").getId(); // Complete one subprocess List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(2, tasks.size()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); tasks = taskService.createTaskQuery().list(); assertEquals(2, tasks.size()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment public void testSequentialSubProcessCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miSequentialSubprocessCompletionCondition").getId(); TaskQuery query = taskService.createTaskQuery().orderByTaskName().asc(); for (int i=0; i<3; i++) { List<Task> tasks = query.list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } assertProcessEnded(procId); } @Deployment public void testNestedSequentialSubProcess() { String procId = runtimeService.startProcessInstanceByKey("miNestedSequentialSubProcess").getId(); for (int i=0; i<3; i++) { List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list(); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } assertProcessEnded(procId); } @Deployment public void testNestedSequentialSubProcessWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miNestedSequentialSubProcessWithTimer").getId(); for (int i=0; i<2; i++) { List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list(); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } // Complete one task, to make it a bit more trickier List<Task> tasks = taskService.createTaskQuery().taskAssignee("kermit").list(); taskService.complete(tasks.get(0).getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment public void testParallelSubProcess() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocess").getId(); List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(4, tasks.size()); for (Task task : tasks) { taskService.complete(task.getId()); } assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelSubProcess.bpmn20.xml"}) public void testParallelSubProcessHistory() { runtimeService.startProcessInstanceByKey("miParallelSubprocess"); for (Task task : taskService.createTaskQuery().list()) { taskService.complete(task.getId()); } // Validate history if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityId("miSubProcess").list(); assertEquals(2, historicActivityInstances.size()); for (HistoricActivityInstance hai : historicActivityInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); } } } @Deployment public void testParallelSubProcessWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocessWithTimer").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(6, tasks.size()); // Complete two tasks taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment public void testParallelSubProcessCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocessCompletionCondition").getId(); List<Task> tasks = taskService.createTaskQuery().orderByExecutionId().asc().list(); assertEquals(4, tasks.size()); for (int i=0; i<2; i++) { taskService.complete(tasks.get(i).getId()); } assertProcessEnded(procId); } @Deployment public void testParallelSubProcessAllAutomatic() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocessAllAutomatics", CollectionUtil.singletonMap("nrOfLoops", 5)).getId(); Execution waitState = runtimeService.createExecutionQuery().singleResult(); assertEquals(10, runtimeService.getVariable(waitState.getId(), "sum")); runtimeService.signal(waitState.getId()); assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelSubProcessAllAutomatic.bpmn20.xml"}) public void testParallelSubProcessAllAutomaticCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miParallelSubprocessAllAutomatics", CollectionUtil.singletonMap("nrOfLoops", 10)).getId(); Execution waitState = runtimeService.createExecutionQuery().singleResult(); assertEquals(12, runtimeService.getVariable(waitState.getId(), "sum")); runtimeService.signal(waitState.getId()); assertProcessEnded(procId); } @Deployment public void testNestedParallelSubProcess() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelSubProcess").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(8, tasks.size()); for (Task task : tasks) { taskService.complete(task.getId()); } assertProcessEnded(procId); } @Deployment public void testNestedParallelSubProcessWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelSubProcess").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(12, tasks.size()); for (int i=0; i<3; i++) { taskService.complete(tasks.get(i).getId()); } // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = {"org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testSequentialCallActivity.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml"}) public void testSequentialCallActivity() { String procId = runtimeService.startProcessInstanceByKey("miSequentialCallActivity").getId(); for (int i=0; i<3; i++) { List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } assertProcessEnded(procId); } @Deployment(resources = "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testSequentialCallActivityWithList.bpmn20.xml") public void testSequentialCallActivityWithList() { ArrayList<String> list = new ArrayList<String>(); list.add("one"); list.add("two"); HashMap<String, Object> variables = new HashMap<String, Object>(); variables.put("list", list); String procId = runtimeService.startProcessInstanceByKey("parentProcess", variables).getId(); Task task1 = taskService.createTaskQuery().processVariableValueEquals("element", "one").singleResult(); Task task2 = taskService.createTaskQuery().processVariableValueEquals("element", "two").singleResult(); assertNotNull(task1); assertNotNull(task2); HashMap<String, Object> subVariables = new HashMap<String, Object>(); subVariables.put("x", "y"); taskService.complete(task1.getId(), subVariables); taskService.complete(task2.getId(), subVariables); Task task3 = taskService.createTaskQuery().processDefinitionKey("midProcess").singleResult(); assertNotNull(task3); taskService.complete(task3.getId()); Task task4 = taskService.createTaskQuery().processDefinitionKey("parentProcess").singleResult(); assertNotNull(task4); taskService.complete(task4.getId()); assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testSequentialCallActivityWithTimer.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testSequentialCallActivityWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miSequentialCallActivityWithTimer").getId(); // Complete first subprocess List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelCallActivity.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testParallelCallActivity() { String procId = runtimeService.startProcessInstanceByKey("miParallelCallActivity").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(12, tasks.size()); for (int i = 0; i < tasks.size(); i++) { taskService.complete(tasks.get(i).getId()); } assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelCallActivity.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testParallelCallActivityHistory() { runtimeService.startProcessInstanceByKey("miParallelCallActivity"); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(12, tasks.size()); for (int i = 0; i < tasks.size(); i++) { taskService.complete(tasks.get(i).getId()); } if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.ACTIVITY)) { // Validate historic processes List<HistoricProcessInstance> historicProcessInstances = historyService.createHistoricProcessInstanceQuery().list(); assertEquals(7, historicProcessInstances.size()); // 6 subprocesses + main process for (HistoricProcessInstance hpi : historicProcessInstances) { assertNotNull(hpi.getStartTime()); assertNotNull(hpi.getEndTime()); } // Validate historic tasks List<HistoricTaskInstance> historicTaskInstances = historyService.createHistoricTaskInstanceQuery().list(); assertEquals(12, historicTaskInstances.size()); for (HistoricTaskInstance hti : historicTaskInstances) { assertNotNull(hti.getStartTime()); assertNotNull(hti.getEndTime()); assertNotNull(hti.getAssignee()); assertEquals("completed", hti.getDeleteReason()); } // Validate historic activities List<HistoricActivityInstance> historicActivityInstances = historyService.createHistoricActivityInstanceQuery().activityType("callActivity").list(); assertEquals(6, historicActivityInstances.size()); for (HistoricActivityInstance hai : historicActivityInstances) { assertNotNull(hai.getStartTime()); assertNotNull(hai.getEndTime()); } } } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testParallelCallActivityWithTimer.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testParallelCallActivityWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miParallelCallActivity").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(6, tasks.size()); for (int i = 0; i < 2; i++) { taskService.complete(tasks.get(i).getId()); } // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testNestedSequentialCallActivity.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testNestedSequentialCallActivity() { String procId = runtimeService.startProcessInstanceByKey("miNestedSequentialCallActivity").getId(); for (int i=0; i<4; i++) { List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); } assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testNestedSequentialCallActivityWithTimer.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testNestedSequentialCallActivityWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miNestedSequentialCallActivityWithTimer").getId(); // first instance List<Task> tasks = taskService.createTaskQuery().orderByTaskName().asc().list(); assertEquals(2, tasks.size()); assertEquals("task one", tasks.get(0).getName()); assertEquals("task two", tasks.get(1).getName()); taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // one task of second instance tasks = taskService.createTaskQuery().list(); assertEquals(2, tasks.size()); taskService.complete(tasks.get(0).getId()); // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testNestedParallelCallActivity.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testNestedParallelCallActivity() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelCallActivity").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(14, tasks.size()); for (int i = 0; i < 14; i++) { taskService.complete(tasks.get(i).getId()); } assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testNestedParallelCallActivityWithTimer.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testNestedParallelCallActivityWithTimer() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelCallActivityWithTimer").getId(); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(4, tasks.size()); for (int i = 0; i < 3; i++) { taskService.complete(tasks.get(i).getId()); } // Fire timer Job timer = managementService.createJobQuery().singleResult(); managementService.executeJob(timer.getId()); Task taskAfterTimer = taskService.createTaskQuery().singleResult(); assertEquals("taskAfterTimer", taskAfterTimer.getTaskDefinitionKey()); taskService.complete(taskAfterTimer.getId()); assertProcessEnded(procId); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.testNestedParallelCallActivityCompletionCondition.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.externalSubProcess.bpmn20.xml" }) public void testNestedParallelCallActivityCompletionCondition() { String procId = runtimeService.startProcessInstanceByKey("miNestedParallelCallActivityCompletionCondition").getId(); assertEquals(8, taskService.createTaskQuery().count()); for (int i = 0; i < 2; i++) { ProcessInstance nextSubProcessInstance = runtimeService.createProcessInstanceQuery().processDefinitionKey("externalSubProcess").listPage(0, 1).get(0); List<Task> tasks = taskService.createTaskQuery().processInstanceId(nextSubProcessInstance.getId()).list(); assertEquals(2, tasks.size()); for (Task task : tasks) { taskService.complete(task.getId()); } } assertProcessEnded(procId); } // ACT-764 @Deployment public void testSequentialServiceTaskWithClass() { ProcessInstance procInst = runtimeService.startProcessInstanceByKey("multiInstanceServiceTask", CollectionUtil.singletonMap("result", 5)); Integer result = (Integer) runtimeService.getVariable(procInst.getId(), "result"); assertEquals(160, result.intValue()); runtimeService.signal(procInst.getId()); assertProcessEnded(procInst.getId()); } @Deployment public void testSequentialServiceTaskWithClassAndCollection() { Collection<Integer> items = Arrays.asList(1,2,3,4,5,6); Map<String, Object> vars = new HashMap<String, Object>(); vars.put("result", 1); vars.put("items", items); ProcessInstance procInst = runtimeService.startProcessInstanceByKey("multiInstanceServiceTask", vars); Integer result = (Integer) runtimeService.getVariable(procInst.getId(), "result"); assertEquals(720, result.intValue()); runtimeService.signal(procInst.getId()); assertProcessEnded(procInst.getId()); } // ACT-901 @Deployment public void testAct901() { Date startTime = ClockUtil.getCurrentTime(); ProcessInstance pi = runtimeService.startProcessInstanceByKey("multiInstanceSubProcess"); List<Task> tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc().list(); ClockUtil.setCurrentTime(new Date(startTime.getTime() + 61000L)); // timer is set to one minute List<Job> timers = managementService.createJobQuery().list(); assertEquals(5, timers.size()); // Execute all timers one by one (single thread vs thread pool of job executor, which leads to optimisticlockingexceptions!) for (Job timer : timers) { managementService.executeJob(timer.getId()); } // All tasks should be canceled tasks = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc().list(); assertEquals(0, tasks.size()); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.callActivityWithBoundaryErrorEvent.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.throwingErrorEventSubProcess.bpmn20.xml" }) public void testMultiInstanceCallActivityWithErrorBoundaryEvent() { Map<String, Object> variableMap = new HashMap<String, Object>(); variableMap.put("assignees", Arrays.asList("kermit", "gonzo")); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process", variableMap); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(2, tasks.size()); // finish first call activity with error variableMap = new HashMap<String, Object>(); variableMap.put("done", false); taskService.complete(tasks.get(0).getId(), variableMap); tasks = taskService.createTaskQuery().list(); assertEquals(1, tasks.size()); taskService.complete(tasks.get(0).getId()); List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("process").list(); assertEquals(0, processInstances.size()); assertProcessEnded(processInstance.getId()); } @Deployment(resources = { "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.callActivityWithBoundaryErrorEventSequential.bpmn20.xml", "org/activiti/engine/test/bpmn/multiinstance/MultiInstanceTest.throwingErrorEventSubProcess.bpmn20.xml" }) public void testSequentialMultiInstanceCallActivityWithErrorBoundaryEvent() { Map<String, Object> variableMap = new HashMap<String, Object>(); variableMap.put("assignees", Arrays.asList("kermit", "gonzo")); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process", variableMap); List<Task> tasks = taskService.createTaskQuery().list(); assertEquals(1, tasks.size()); // finish first call activity with error variableMap = new HashMap<String, Object>(); variableMap.put("done", false); taskService.complete(tasks.get(0).getId(), variableMap); tasks = taskService.createTaskQuery().list(); assertEquals(1, tasks.size()); taskService.complete(tasks.get(0).getId()); List<ProcessInstance> processInstances = runtimeService.createProcessInstanceQuery().processDefinitionKey("process").list(); assertEquals(0, processInstances.size()); assertProcessEnded(processInstance.getId()); } }