public void testPropagateTenantIdToConcurrentExecution() { deploymentForTenant(TENANT_ID, Bpmn.createExecutableProcess(PROCESS_DEFINITION_KEY) .startEvent() .parallelGateway("fork") .userTask() .parallelGateway("join") .endEvent() .moveToNode("fork") .userTask() .connectTo("join") .done()); startProcessInstance(PROCESS_DEFINITION_KEY); List<Execution> executions = runtimeService.createExecutionQuery().list(); assertThat(executions.size(), is(3)); assertThat(executions.get(0).getTenantId(), is(TENANT_ID)); // inherit the tenant id from process instance assertThat(executions.get(1).getTenantId(), is(TENANT_ID)); assertThat(executions.get(2).getTenantId(), is(TENANT_ID)); }
public void testConcurrentExecution() { deploymentForTenant("tenant1", Bpmn.createExecutableProcess(PROCESS_DEFINITION_KEY) .startEvent() .parallelGateway("fork") .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .parallelGateway("join") .endEvent() .moveToNode("fork") .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .connectTo("join") .done()); AssertingJavaDelegate.addAsserts(hasTenantId("tenant1")); startProcessInstance(PROCESS_DEFINITION_KEY); }
public void testConcurrentServiceTasks() { deployment(Bpmn.createExecutableProcess("testProcess") .startEvent() .parallelGateway("fork") .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .parallelGateway("join") .endEvent() .moveToNode("fork") .serviceTask() .camundaClass(AssertingJavaDelegate.class.getName()) .connectTo("join") .done()); AssertingJavaDelegate.addAsserts( new DelegateExecutionAsserter() { public void doAssert(DelegateExecution execution) { assertFalse(execution.equals(execution.getProcessInstance())); assertNull(execution.getSuperExecution()); } } ); runtimeService.startProcessInstanceByKey("testProcess"); }
@Test public void testSkipListenerInvocationF() { // given DelegateEvent.clearEvents(); ProcessDefinition processDefinition = testRule.deployAndGetDefinition(modify(instance) .activityBuilder("user2") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, DelegateExecutionListener.class.getName()) .done()); ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId()); Batch batch = runtimeService .createModification(processDefinition.getId()) .cancelAllForActivity("user2") .processInstanceIds(Arrays.asList(processInstance.getId())) .skipCustomListeners() .executeAsync(); helper.executeSeedJob(batch); // when helper.executeJobs(batch); // then assertEquals(0, DelegateEvent.getEvents().size()); }
@Test public void testListenerInvocationForNewlyCreatedScope() { // given DelegateEvent.clearEvents(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, DelegateExecutionListener.class.getName()) .done() ); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask") .build(); // when testHelper.createProcessInstanceAndMigrate(migrationPlan); // then List<DelegateEvent> recordedEvents = DelegateEvent.getEvents(); assertEquals(1, recordedEvents.size()); DelegateEvent event = recordedEvents.get(0); assertEquals(targetProcessDefinition.getId(), event.getProcessDefinitionId()); assertEquals("subProcess", event.getCurrentActivityId()); DelegateEvent.clearEvents(); }
@Test public void shouldSkipCustomListeners() { // given ProcessDefinition processDefinition = testRule.deployAndGetDefinition(modify(ProcessModels.TWO_TASKS_PROCESS).activityBuilder("userTask1") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, IncrementCounterListener.class.getName()).done()); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Process"); runtimeService.deleteProcessInstance(processInstance.getId(), "test"); IncrementCounterListener.counter = 0; // when runtimeService.restartProcessInstances(processDefinition.getId()) .startBeforeActivity("userTask1") .processInstanceIds(processInstance.getId()) .skipCustomListeners() .execute(); // then assertEquals(0, IncrementCounterListener.counter); }
@Test public void testNoListenersCalled() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(modify(CompensationModels.COMPENSATION_ONE_TASK_SUBPROCESS_MODEL) .activityBuilder("subProcess") .camundaExecutionListenerClass( ExecutionListener.EVENTNAME_END, RecorderExecutionListener.class.getName()) .done()); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(CompensationModels.ONE_COMPENSATION_TASK_MODEL); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask2", "userTask2") .mapActivities("compensationBoundary", "compensationBoundary") .build(); ProcessInstance processInstance = rule.getRuntimeService().startProcessInstanceById(sourceProcessDefinition.getId()); testHelper.completeTask("userTask1"); // when testHelper.migrateProcessInstance(migrationPlan, processInstance); // then // the listener was only called once when the sub process completed properly Assert.assertEquals(1, RecorderExecutionListener.getRecordedEvents().size()); }
@Test public void testSkipListenerInvocationForRemovedScope() { // given DelegateEvent.clearEvents(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_END, DelegateExecutionListener.class.getName()) .done() ); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask") .build(); // when ProcessInstance processInstance = rule.getRuntimeService() .startProcessInstanceById(migrationPlan.getSourceProcessDefinitionId()); rule.getRuntimeService() .newMigration(migrationPlan) .processInstanceIds(Arrays.asList(processInstance.getId())) .skipCustomListeners() .execute(); // then List<DelegateEvent> recordedEvents = DelegateEvent.getEvents(); assertEquals(0, recordedEvents.size()); DelegateEvent.clearEvents(); }
@Test public void testSkipListenerInvocationForNewlyCreatedScope() { // given DelegateEvent.clearEvents(); ProcessDefinition sourceProcessDefinition = migrationRule.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); ProcessDefinition targetProcessDefinition = migrationRule.deployAndGetDefinition(modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, DelegateExecutionListener.class.getName()) .done() ); MigrationPlan migrationPlan = engineRule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask") .build(); ProcessInstance processInstance = engineRule.getRuntimeService().startProcessInstanceById(sourceProcessDefinition.getId()); Batch batch = engineRule.getRuntimeService().newMigration(migrationPlan) .processInstanceIds(Arrays.asList(processInstance.getId())) .skipCustomListeners() .executeAsync(); helper.executeSeedJob(batch); // when helper.executeJobs(batch); // then assertEquals(0, DelegateEvent.getEvents().size()); }
@Test public void testEndListenerInvocationForRemovedScope() { // given DelegateEvent.clearEvents(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_END, DelegateExecutionListener.class.getName()) .done() ); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask") .build(); // when testHelper.createProcessInstanceAndMigrate(migrationPlan); // then List<DelegateEvent> recordedEvents = DelegateEvent.getEvents(); assertEquals(1, recordedEvents.size()); DelegateEvent event = recordedEvents.get(0); assertEquals(sourceProcessDefinition.getId(), event.getProcessDefinitionId()); assertEquals("subProcess", event.getCurrentActivityId()); assertEquals(testHelper.getSingleActivityInstanceBeforeMigration("subProcess").getId(), event.getActivityInstanceId()); DelegateEvent.clearEvents(); }
public void testRemoveConcurrentExecutionLocalVariablesOnJoin() { deployment(Bpmn.createExecutableProcess("process") .startEvent() .parallelGateway("fork") .userTask("task1") .parallelGateway("join") .userTask("afterTask") .endEvent() .moveToNode("fork") .userTask("task2") .connectTo("join") .done()); // given runtimeService.startProcessInstanceByKey("process"); List<Task> tasks = taskService.createTaskQuery().list(); for (Task task : tasks) { runtimeService.setVariableLocal(task.getExecutionId(), "var", "value"); } // when taskService.complete(tasks.get(0).getId()); taskService.complete(tasks.get(1).getId()); // then assertEquals(0, runtimeService.createVariableInstanceQuery().count()); }
@Test public void testNoListenersCalled() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(CompensationModels.ONE_COMPENSATION_TASK_MODEL); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(modify(CompensationModels.COMPENSATION_ONE_TASK_SUBPROCESS_MODEL) .activityBuilder("subProcess") .camundaExecutionListenerExpression( ExecutionListener.EVENTNAME_START, "${execution.setVariable('foo', 'bar')}") .done()); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask2", "userTask2") .mapActivities("compensationBoundary", "compensationBoundary") .build(); ProcessInstance processInstance = rule.getRuntimeService().startProcessInstanceById(sourceProcessDefinition.getId()); testHelper.completeTask("userTask1"); // when testHelper.migrateProcessInstance(migrationPlan, processInstance); // then Assert.assertEquals(0, testHelper.snapshotAfterMigration.getVariables().size()); }
@Test public void shouldSkipCustomListeners() { // given ProcessDefinition processDefinition = testRule.deployAndGetDefinition(modify(ProcessModels.TWO_TASKS_PROCESS).activityBuilder("userTask1") .camundaExecutionListenerClass(ExecutionListener.EVENTNAME_START, IncrementCounterListener.class.getName()).done()); ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("Process"); ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("Process"); runtimeService.deleteProcessInstance(processInstance1.getId(), "test"); runtimeService.deleteProcessInstance(processInstance2.getId(), "test"); IncrementCounterListener.counter = 0; // when Batch batch = runtimeService.restartProcessInstances(processDefinition.getId()) .startBeforeActivity("userTask1") .processInstanceIds(processInstance1.getId(), processInstance2.getId()) .skipCustomListeners() .executeAsync(); helper.completeBatch(batch); // then assertEquals(0, IncrementCounterListener.counter); }
@Test public void testSetVariableInDelegateWithSynchronousEvent() { BpmnModelInstance modelInstance = Bpmn.createExecutableProcess(CONDITIONAL_EVENT_PROCESS_KEY) .startEvent() .userTask().name(TASK_BEFORE_CONDITION) .serviceTask(TASK_WITH_CONDITION_ID).camundaClass(SetVariableDelegate.class.getName()) .endEvent().done(); modelInstance = modify(modelInstance) .serviceTaskBuilder(TASK_WITH_CONDITION_ID) .boundaryEvent() .cancelActivity(true) .conditionalEventDefinition(CONDITIONAL_EVENT) .condition(CONDITION_EXPR) .conditionalEventDefinitionDone() .done(); engine.manageDeployment(repositoryService.createDeployment().addModelInstance(CONDITIONAL_MODEL, modelInstance).deploy()); // given ProcessInstance procInst = runtimeService.startProcessInstanceByKey(CONDITIONAL_EVENT_PROCESS_KEY); TaskQuery taskQuery = taskService.createTaskQuery().processInstanceId(procInst.getId()); //when task is completed taskService.complete(taskQuery.singleResult().getId()); //then service task with delegated code is called and variable is set //-> conditional event is triggered and process instance ends tasksAfterVariableIsSet = taskQuery.list(); assertEquals(0, tasksAfterVariableIsSet.size()); assertEquals(0, conditionEventSubscriptionQuery.list().size()); assertNull(runtimeService.createProcessInstanceQuery().singleResult()); }
@Test public void testCannotMigrateUnmappedTransitionInstanceAtNonLeafActivity() { // given BpmnModelInstance model = modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaAsyncBefore(true) .done(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(model); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(model); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .build(); // when try { testHelper.createProcessInstanceAndMigrate(migrationPlan); Assert.fail("should fail"); } catch (MigratingProcessInstanceValidationException e) { // then assertThat(e.getValidationReport()) .hasTransitionInstanceFailures("subProcess", "There is no migration instruction for this instance's activity" ); } }
@Test public void testAddScopeDoesNotBecomeAsync() { // given ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(ProcessModels.ONE_TASK_PROCESS); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(modify(ProcessModels.SUBPROCESS_PROCESS) .activityBuilder("subProcess") .camundaAsyncBefore() .done()); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask", "userTask") .build(); // when testHelper.createProcessInstanceAndMigrate(migrationPlan); // then the async flag for the subprocess was not relevant for instantiation testHelper.assertActivityTreeAfterMigration().hasStructure( describeActivityInstanceTree(targetProcessDefinition.getId()) .beginScope("subProcess") .activity("userTask", testHelper.getSingleActivityInstanceBeforeMigration("userTask").getId()) .done()); Assert.assertEquals(0, testHelper.snapshotAfterMigration.getJobs().size()); }
@Test public void testCannotMigrateWhenNotAllTransitionInstancesAreMapped() { // given BpmnModelInstance model = ModifiableBpmnModelInstance.modify(ProcessModels.PARALLEL_GATEWAY_PROCESS) .activityBuilder("userTask1") .camundaAsyncBefore() .moveToActivity("userTask2") .camundaAsyncBefore() .done(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(model); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(model); MigrationPlan migrationPlan = rule.getRuntimeService().createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("userTask1", "userTask1") .build(); // when try { testHelper.createProcessInstanceAndMigrate(migrationPlan); Assert.fail("should not succeed because the userTask2 instance is not mapped"); } catch (MigratingProcessInstanceValidationException e) { assertThat(e.getValidationReport()) .hasTransitionInstanceFailures("userTask2", "There is no migration instruction for this instance's activity"); } }
@Test public void testMigrateAsyncAfterCompensateEventSubProcessStartEvent() { // given BpmnModelInstance model = modify(EventSubProcessModels.COMPENSATE_EVENT_SUBPROCESS_PROCESS) .flowNodeBuilder("eventSubProcessStart") .camundaAsyncAfter() .done(); ProcessDefinition sourceProcessDefinition = testHelper.deployAndGetDefinition(model); ProcessDefinition targetProcessDefinition = testHelper.deployAndGetDefinition(model); MigrationPlan migrationPlan = rule.getRuntimeService() .createMigrationPlan(sourceProcessDefinition.getId(), targetProcessDefinition.getId()) .mapActivities("subProcess", "subProcess") .mapActivities("eventSubProcess", "eventSubProcess") .mapActivities("eventSubProcessStart", "eventSubProcessStart") .build(); ProcessInstance processInstance = rule.getRuntimeService().createProcessInstanceById(sourceProcessDefinition.getId()) .startBeforeActivity("eventSubProcess") .execute(); // when testHelper.migrateProcessInstance(migrationPlan, processInstance); // then testHelper.assertJobMigrated("eventSubProcessStart", "eventSubProcessStart", AsyncContinuationJobHandler.TYPE); }
@Test public void testMapEqualUnsupportedAsyncAfterActivities() { BpmnModelInstance testModel = modify(ProcessModels.UNSUPPORTED_ACTIVITIES) .flowNodeBuilder("startEvent").camundaAsyncAfter() .moveToNode("decisionTask").camundaAsyncAfter() .moveToNode("throwEvent").camundaAsyncAfter() .moveToNode("serviceTask").camundaAsyncAfter() .moveToNode("sendTask").camundaAsyncAfter() .moveToNode("scriptTask").camundaAsyncAfter() .moveToNode("endEvent").camundaAsyncAfter() .done(); assertGeneratedMigrationPlan(testModel, testModel) .hasInstructions( migrate("startEvent").to("startEvent"), migrate("decisionTask").to("decisionTask"), migrate("throwEvent").to("throwEvent"), migrate("serviceTask").to("serviceTask"), migrate("sendTask").to("sendTask"), migrate("scriptTask").to("scriptTask"), migrate("endEvent").to("endEvent") ); }
@Test public void testMapEqualUnsupportedAsyncBeforeActivities() { BpmnModelInstance testModel = modify(ProcessModels.UNSUPPORTED_ACTIVITIES) .flowNodeBuilder("startEvent").camundaAsyncBefore() .moveToNode("decisionTask").camundaAsyncBefore() .moveToNode("throwEvent").camundaAsyncAfter() .moveToNode("serviceTask").camundaAsyncBefore() .moveToNode("sendTask").camundaAsyncBefore() .moveToNode("scriptTask").camundaAsyncBefore() .moveToNode("endEvent").camundaAsyncBefore() .done(); assertGeneratedMigrationPlan(testModel, testModel) .hasInstructions( migrate("startEvent").to("startEvent"), migrate("decisionTask").to("decisionTask"), migrate("throwEvent").to("throwEvent"), migrate("serviceTask").to("serviceTask"), migrate("sendTask").to("sendTask"), migrate("scriptTask").to("scriptTask"), migrate("endEvent").to("endEvent") ); }