From 4ad8d8cfff5ff720c63f52b49c908c94be57d67e Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Thu, 26 Feb 2026 00:49:34 +0530 Subject: [PATCH 1/7] [Improvement][Master] Add IT case for task timeout alert (#17843) --- .../master/integration/WorkflowOperator.java | 40 +- .../cases/WorkflowStartTestCase.java | 3667 +++++++++-------- .../workflow_with_timeout_warn_task.yaml | 47 + ...workflow_with_timeout_warnfailed_task.yaml | 47 + 4 files changed, 2071 insertions(+), 1730 deletions(-) create mode 100644 dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml create mode 100644 dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java index aaac0b459deb..942519287562 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java @@ -67,10 +67,12 @@ public Integer manualTriggerWorkflow(final WorkflowTriggerDTO workflowTriggerDTO .dryRun(workflowTriggerDTO.getDryRun()) .taskDependType(workflowTriggerDTO.getTaskDependType()) .failureStrategy(workflowTriggerDTO.getFailureStrategy()) + .warningType(workflowTriggerDTO.getWarningType()) + .warningGroupId(workflowTriggerDTO.getWarningGroupId()) .build(); - final WorkflowManualTriggerResponse manualTriggerWorkflowResponse = - workflowInstanceController.manualTriggerWorkflow(workflowManualTriggerRequest); + final WorkflowManualTriggerResponse manualTriggerWorkflowResponse = workflowInstanceController + .manualTriggerWorkflow(workflowManualTriggerRequest); Assertions.assertThat(manualTriggerWorkflowResponse.isSuccess()).isTrue(); return manualTriggerWorkflowResponse.getWorkflowInstanceId(); @@ -114,32 +116,32 @@ public void repeatRunningWorkflowInstance(final Integer workflowInstanceId) { } public void recoverFailureTasks(final Integer workflowInstanceId) { - final WorkflowInstanceRecoverFailureTasksRequest recoverFailureTasksRequest = - WorkflowInstanceRecoverFailureTasksRequest.builder() - .workflowInstanceId(workflowInstanceId) - .userId(1) - .build(); + final WorkflowInstanceRecoverFailureTasksRequest recoverFailureTasksRequest = WorkflowInstanceRecoverFailureTasksRequest + .builder() + .workflowInstanceId(workflowInstanceId) + .userId(1) + .build(); workflowInstanceController.triggerFromFailureTasks(recoverFailureTasksRequest); } public WorkflowInstancePauseResponse pauseWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstancePauseRequest workflowInstancePauseRequest = - new WorkflowInstancePauseRequest(workflowInstanceId); + final WorkflowInstancePauseRequest workflowInstancePauseRequest = new WorkflowInstancePauseRequest( + workflowInstanceId); return workflowInstanceController.pauseWorkflowInstance(workflowInstancePauseRequest); } public WorkflowInstanceRecoverSuspendTasksResponse recoverSuspendWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstanceRecoverSuspendTasksRequest workflowInstancePauseRequest = - WorkflowInstanceRecoverSuspendTasksRequest.builder() - .workflowInstanceId(workflowInstanceId) - .userId(1) - .build(); + final WorkflowInstanceRecoverSuspendTasksRequest workflowInstancePauseRequest = WorkflowInstanceRecoverSuspendTasksRequest + .builder() + .workflowInstanceId(workflowInstanceId) + .userId(1) + .build(); return workflowInstanceController.triggerFromSuspendTasks(workflowInstancePauseRequest); } public WorkflowInstanceStopResponse stopWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstanceStopRequest workflowInstanceStopRequest = - new WorkflowInstanceStopRequest(workflowInstanceId); + final WorkflowInstanceStopRequest workflowInstanceStopRequest = new WorkflowInstanceStopRequest( + workflowInstanceId); return workflowInstanceController.stopWorkflowInstance(workflowInstanceStopRequest); } @@ -160,6 +162,12 @@ public static class WorkflowTriggerDTO { @Builder.Default private FailureStrategy failureStrategy = FailureStrategy.CONTINUE; + + @Builder.Default + private org.apache.dolphinscheduler.common.enums.WarningType warningType = org.apache.dolphinscheduler.common.enums.WarningType.NONE; + + @Builder.Default + private Integer warningGroupId = 0; } @Data diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index 498fb5ecb4b1..a162c958f61b 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -52,1722 +52,1961 @@ /** * The integration test for starting a workflow from workflow definition. - *

In each test method, will create different workflow from yaml, and then trigger it, and do assertions. - *

The method name should be clear to describe the test scenario. + *

+ * In each test method, will create different workflow from yaml, and then + * trigger it, and do assertions. + *

+ * The method name should be clear to describe the test scenario. */ public class WorkflowStartTestCase extends AbstractMasterIntegrationTestCase { - @Test - @DisplayName("Test start a workflow with one fake task(A) success") - public void testStartWorkflow_with_oneSuccessTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) dry run success") - public void testStartWorkflow_with_oneSuccessTaskDryRun() { - final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .dryRun(Flag.YES) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two fake task(A) has the same name") - public void testStartWorkflow_contains_duplicateTaskName() { - final String yaml = "/it/start/workflow_with_duplicate_task_name.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE); - assertThat(repository.queryTaskInstance(workflowInstanceId)).isEmpty(); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial wait strategy") - public void testStartWorkflow_with_serialWaitStrategy() { - final String yaml = "/it/start/workflow_with_serial_wait_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); - }); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - final WorkflowInstance workflowInstance1 = repository.queryWorkflowInstance(workflowInstanceId1); - final WorkflowInstance workflowInstance2 = repository.queryWorkflowInstance(workflowInstanceId2); - final WorkflowInstance workflowInstance3 = repository.queryWorkflowInstance(workflowInstanceId3); - assertThat(workflowInstance1.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), 5)); - assertThat(workflowInstance3.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance3.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), 5)); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial discard strategy") - public void testStartWorkflow_with_serialDiscardStrategy() { - final String yaml = "/it/start/workflow_with_serial_discard_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial priority strategy") - public void testStartWorkflow_with_serialPriorityStrategy() { - final String yaml = "/it/start/workflow_with_serial_priority_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three fake task(A) using end failure strategy") - public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { - final String yaml = "/it/start/workflow_with_three_parallel_fake_task_using_failure_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .failureStrategy(FailureStrategy.END) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE); - Assertions.assertThat(repository.queryTaskInstance(workflow)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two fake task(A) using task group") - public void testStartWorkflow_with_successTaskUsingTaskGroup() { - final String yaml = "/it/start/workflow_with_fake_tasks_using_task_group.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(2)) - .atLeast(Duration.ofSeconds(20)) - .untilAsserted(() -> { - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS.equals(taskInstance.getState()) && - taskInstance.getTaskGroupId() == context.getTaskGroups().get(0).getId()); - - final TaskInstance taskA = taskInstances.stream() - .filter(t -> "A".equals(t.getName())) - .findFirst().get(); - final TaskInstance taskB = taskInstances.stream() - .filter(t -> "B".equals(t.getName())) - .findFirst().get(); - // TaskA's task group priority is smaller than B - Assertions.assertThat(taskA.getStartTime()).isAfter(taskB.getStartTime()); - Assertions.assertThat(taskA.getEndTime()).isAfter(taskB.getEndTime()); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using environment config") - public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { - final String yaml = "/it/start/workflow_with_one_fake_task_using_environment_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one success switch task and two fake task") - public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { - final String yaml = "/it/start/workflow_with_one_success_switch_two_fake_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("switch_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("success_branch"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one failed switch task and two fake task") - public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { - final String yaml = "/it/start/workflow_with_one_failed_switch_two_fake_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("switch_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("default_branch"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) success") - public void testStartWorkflow_with_subWorkflowTask_success() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); - - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .hasSize(1) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); - assertThat(workflowInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); - }); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - Assertions - .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("fake_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) dry run, will not execute") - public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .dryRun(Flag.YES) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); - - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .isEmpty(); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run success") - void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { - final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(4) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run failed") - void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { - final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) failed") - public void testStartWorkflow_with_subWorkflowTask_failed() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) - .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO); - - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .hasSize(1) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.FAILURE); - assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); - }); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - - Assertions - .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("fake_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using workflow params") - public void testStartWorkflow_usingWorkflowParam() { - final String yaml = "/it/start/workflow_with_global_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using command params") - public void testStartWorkflow_usingCommandParam() { - final String yaml = "/it/start/workflow_with_global_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .commandParams(Lists.newArrayList(Property.builder() - .prop("name") - .direct(Direct.IN) - .type(DataType.VARCHAR) - .value("commandParam") - .build())) - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow contains fake task using local param will be overwrite by varpool") - public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { - final String yaml = "/it/start/workflow_with_local_param_overwrite_by_varpool.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - List assertVarPools = Lists.newArrayList( - Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1").build()); - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(VarPoolUtils.deserializeVarPool(workflowInstance.getVarPool())) - .isEqualTo(assertVarPools); - }); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using null key params") - public void testStartWorkflow_usingNullKeyParam() { - final String yaml = "/it/start/workflow_with_null_key_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .commandParams(Lists.newArrayList(Property.builder() - .prop(null) - .direct(Direct.IN) - .type(DataType.VARCHAR) - .value("commandParam") - .build())) - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) failed") - public void testStartWorkflow_with_oneFailedTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) fatal") - public void testStartWorkflow_with_oneFatalTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) failed") - public void testStartWorkflow_with_oneFailedTaskWithRetry() { - final String yaml = "/it/start/workflow_with_one_fake_task_failed_with_retry.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(3)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .allSatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .hasSize(2); - - final TaskInstance taskInstance = taskInstances.get(0); - Assertions - .assertThat(taskInstance) - .matches(task -> task.getRetryTimes() == 0) - .matches(task -> task.getFlag() == Flag.NO) - .isNotNull(); - - final TaskInstance latestTaskInstance = taskInstances.get(1); - Assertions - .assertThat(latestTaskInstance) - .matches(task -> task.getRetryTimes() == 1) - .matches(task -> task.getFlag() == Flag.YES) - .isNotNull(); - assertThat(latestTaskInstance.getFirstSubmitTime()).isEqualTo(taskInstance.getFirstSubmitTime()); - assertThat(latestTaskInstance.getSubmitTime()) - .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), -65)); - assertThat(latestTaskInstance.getSubmitTime()) - .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), 65)); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two serial fake tasks(A -> B) success") - public void testStartWorkflow_with_twoSerialSuccessTask() { - String yaml = "/it/start/workflow_with_two_serial_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two serial fake tasks(A(failed) -> B) success") - public void testStartWorkflow_with_twoSerialFailedTask() { - final String yaml = "/it/start/workflow_with_two_serial_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two parallel fake tasks(A, B) success") - public void testStartWorkflow_with_twoParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_two_parallel_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two parallel fake tasks(A(failed), B(failed)) success") - public void testStartWorkflow_with_twoParallelFailedTask() { - final String yaml = "/it/start/workflow_with_two_parallel_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") - public void testStartWorkflow_with_threeParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(9) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") - public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .startNodes(Lists.newArrayList(6L)) - .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using workflow built in params") - public void testStartWorkflow_usingWorkflowBuiltInParam() { - final String yaml = "/it/start/workflow_with_built_in_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which contains a dep task with timeout kill strategy") - public void testStartWorkflow_withTimeoutKillTask() { - final String yaml = "/it/start/workflow_with_timeout_kill_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which contains a dep task will be kill by system timeout") - public void testStartWorkflow_withSystemTimeoutKillTask() { - masterConfig.getServerLoadProtection().setMaxTaskInstanceRuntime(Duration.ofMinutes(1)); - - final String yaml = "/it/start/workflow_with_system_timeout_kill_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with task depend type TASK_ONLY") - public void testStartWorkflow_withTaskOnlyStrategy() { - final String yaml = "/it/start/workflow_with_task_only_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) - .taskDependType(TaskDependType.TASK_ONLY) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with task which successors is forbidden") - public void testStartWorkflow_withTaskSuccessorsIsForbidden() { - final String yaml = "/it/start/workflow_with_task_successors_is_forbidden.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }, (Consumer) taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run success") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run success") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runSuccess() { - final String yaml = - "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run failed") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run fatal") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run failed") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFailed() { - final String yaml = - "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = - "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is enabled") - public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { - TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); - taskDispatchPolicy.setDispatchTimeoutEnabled(true); - taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); - this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); - - final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is disabled") - public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDisabled() { - TaskDispatchPolicy policy = new TaskDispatchPolicy(); - policy.setDispatchTimeoutEnabled(false); - this.masterConfig.setTaskDispatchPolicy(policy); - - final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); - - }); - - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. - // masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow when no available worker and dispatch timeout is enabled") - public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { - TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); - taskDispatchPolicy.setDispatchTimeoutEnabled(true); - taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); - this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); - - final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow when no available worker and dispatch timeout is disabled") - public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisabled() { - TaskDispatchPolicy policy = new TaskDispatchPolicy(); - policy.setDispatchTimeoutEnabled(false); - this.masterConfig.setTaskDispatchPolicy(policy); - - final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); - }); - - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. - // masterContainer.assertAllResourceReleased(); - } + @Test + @DisplayName("Test start a workflow with one fake task(A) success") + public void testStartWorkflow_with_oneSuccessTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.NO.getCode()); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) dry run success") + public void testStartWorkflow_with_oneSuccessTaskDryRun() { + final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .dryRun(Flag.YES) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.YES + .getCode()); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.YES.getCode()); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two fake task(A) has the same name") + public void testStartWorkflow_contains_duplicateTaskName() { + final String yaml = "/it/start/workflow_with_duplicate_task_name.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE); + assertThat(repository.queryTaskInstance(workflowInstanceId)).isEmpty(); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial wait strategy") + public void testStartWorkflow_with_serialWaitStrategy() { + final String yaml = "/it/start/workflow_with_serial_wait_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); + }); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + final WorkflowInstance workflowInstance1 = repository + .queryWorkflowInstance(workflowInstanceId1); + final WorkflowInstance workflowInstance2 = repository + .queryWorkflowInstance(workflowInstanceId2); + final WorkflowInstance workflowInstance3 = repository + .queryWorkflowInstance(workflowInstanceId3); + assertThat(workflowInstance1.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getEndTime()) + .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), + 5)); + assertThat(workflowInstance3.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance3.getEndTime()) + .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), + 5)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial discard strategy") + public void testStartWorkflow_with_serialDiscardStrategy() { + final String yaml = "/it/start/workflow_with_serial_discard_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial priority strategy") + public void testStartWorkflow_with_serialPriorityStrategy() { + final String yaml = "/it/start/workflow_with_serial_priority_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three fake task(A) using end failure strategy") + public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { + final String yaml = "/it/start/workflow_with_three_parallel_fake_task_using_failure_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .failureStrategy(FailureStrategy.END) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE); + Assertions.assertThat(repository.queryTaskInstance(workflow)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two fake task(A) using task group") + public void testStartWorkflow_with_successTaskUsingTaskGroup() { + final String yaml = "/it/start/workflow_with_fake_tasks_using_task_group.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(2)) + .atLeast(Duration.ofSeconds(20)) + .untilAsserted(() -> { + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS + .equals(taskInstance.getState()) && + taskInstance.getTaskGroupId() == context + .getTaskGroups().get(0) + .getId()); + + final TaskInstance taskA = taskInstances.stream() + .filter(t -> "A".equals(t.getName())) + .findFirst().get(); + final TaskInstance taskB = taskInstances.stream() + .filter(t -> "B".equals(t.getName())) + .findFirst().get(); + // TaskA's task group priority is smaller than B + Assertions.assertThat(taskA.getStartTime()).isAfter(taskB.getStartTime()); + Assertions.assertThat(taskA.getEndTime()).isAfter(taskB.getEndTime()); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using environment config") + public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { + final String yaml = "/it/start/workflow_with_one_fake_task_using_environment_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one success switch task and two fake task") + public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { + final String yaml = "/it/start/workflow_with_one_success_switch_two_fake_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("switch_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("success_branch"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one failed switch task and two fake task") + public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { + final String yaml = "/it/start/workflow_with_one_failed_switch_two_fake_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("switch_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("default_branch"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) success") + public void testStartWorkflow_with_subWorkflowTask_success() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); + + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .hasSize(1) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance.getIsSubWorkflow()) + .isEqualTo(Flag.YES); + assertThat(workflowInstance.getDryRun()) + .isEqualTo(Flag.NO.getCode()); + }); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + Assertions + .assertThat(repository.queryTaskInstance( + subWorkflowInstance.get(0).getId())) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("fake_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) dry run, will not execute") + public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .dryRun(Flag.YES) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance + .getDryRun() == Flag.YES + .getCode()); + + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .isEmpty(); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.YES.getCode()); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run success") + void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { + final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(4) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run failed") + void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { + final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) failed") + public void testStartWorkflow_with_subWorkflowTask_failed() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE) + .matches( + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO); + + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .hasSize(1) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.FAILURE); + assertThat(workflowInstance.getIsSubWorkflow()) + .isEqualTo(Flag.YES); + }); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryTaskInstance( + subWorkflowInstance.get(0).getId())) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()) + .isEqualTo("fake_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using workflow params") + public void testStartWorkflow_usingWorkflowParam() { + final String yaml = "/it/start/workflow_with_global_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using command params") + public void testStartWorkflow_usingCommandParam() { + final String yaml = "/it/start/workflow_with_global_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .commandParams(Lists.newArrayList(Property.builder() + .prop("name") + .direct(Direct.IN) + .type(DataType.VARCHAR) + .value("commandParam") + .build())) + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow contains fake task using local param will be overwrite by varpool") + public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { + final String yaml = "/it/start/workflow_with_local_param_overwrite_by_varpool.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + List assertVarPools = Lists.newArrayList( + Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1") + .build()); + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool( + workflowInstance.getVarPool())) + .isEqualTo(assertVarPools); + }); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using null key params") + public void testStartWorkflow_usingNullKeyParam() { + final String yaml = "/it/start/workflow_with_null_key_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .commandParams(Lists.newArrayList(Property.builder() + .prop(null) + .direct(Direct.IN) + .type(DataType.VARCHAR) + .value("commandParam") + .build())) + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) failed") + public void testStartWorkflow_with_oneFailedTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) fatal") + public void testStartWorkflow_with_oneFatalTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) failed") + public void testStartWorkflow_with_oneFailedTaskWithRetry() { + final String yaml = "/it/start/workflow_with_one_fake_task_failed_with_retry.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(3)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .allSatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .hasSize(2); + + final TaskInstance taskInstance = taskInstances.get(0); + Assertions + .assertThat(taskInstance) + .matches(task -> task.getRetryTimes() == 0) + .matches(task -> task.getFlag() == Flag.NO) + .isNotNull(); + + final TaskInstance latestTaskInstance = taskInstances.get(1); + Assertions + .assertThat(latestTaskInstance) + .matches(task -> task.getRetryTimes() == 1) + .matches(task -> task.getFlag() == Flag.YES) + .isNotNull(); + assertThat(latestTaskInstance.getFirstSubmitTime()) + .isEqualTo(taskInstance.getFirstSubmitTime()); + assertThat(latestTaskInstance.getSubmitTime()) + .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), + -65)); + assertThat(latestTaskInstance.getSubmitTime()) + .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), + 65)); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two serial fake tasks(A -> B) success") + public void testStartWorkflow_with_twoSerialSuccessTask() { + String yaml = "/it/start/workflow_with_two_serial_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two serial fake tasks(A(failed) -> B) success") + public void testStartWorkflow_with_twoSerialFailedTask() { + final String yaml = "/it/start/workflow_with_two_serial_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two parallel fake tasks(A, B) success") + public void testStartWorkflow_with_twoParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_two_parallel_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two parallel fake tasks(A(failed), B(failed)) success") + public void testStartWorkflow_with_twoParallelFailedTask() { + final String yaml = "/it/start/workflow_with_two_parallel_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") + public void testStartWorkflow_with_threeParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(9) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A1"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A2"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A3"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B1"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B2"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B3"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C1"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C2"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C3"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") + public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .startNodes(Lists.newArrayList(6L)) + .build(); + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C2"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C3"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using workflow built in params") + public void testStartWorkflow_usingWorkflowBuiltInParam() { + final String yaml = "/it/start/workflow_with_built_in_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which contains a dep task with timeout kill strategy") + public void testStartWorkflow_withTimeoutKillTask() { + final String yaml = "/it/start/workflow_with_timeout_kill_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which contains a dep task will be kill by system timeout") + public void testStartWorkflow_withSystemTimeoutKillTask() { + masterConfig.getServerLoadProtection().setMaxTaskInstanceRuntime(Duration.ofMinutes(1)); + + final String yaml = "/it/start/workflow_with_system_timeout_kill_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with task depend type TASK_ONLY") + public void testStartWorkflow_withTaskOnlyStrategy() { + final String yaml = "/it/start/workflow_with_task_only_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam( + new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) + .taskDependType(TaskDependType.TASK_ONLY) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with task which successors is forbidden") + public void testStartWorkflow_withTaskSuccessorsIsForbidden() { + final String yaml = "/it/start/workflow_with_task_successors_is_forbidden.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }, (Consumer) taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C1"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run success") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run success") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runSuccess() { + final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run failed") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run fatal") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run failed") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFailed() { + final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { + final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is enabled") + public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { + TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); + taskDispatchPolicy.setDispatchTimeoutEnabled(true); + taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); + this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); + + final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is disabled") + public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDisabled() { + TaskDispatchPolicy policy = new TaskDispatchPolicy(); + policy.setDispatchTimeoutEnabled(false); + this.masterConfig.setTaskDispatchPolicy(policy); + + final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo( + TaskExecutionStatus.SUBMITTED_SUCCESS); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + + }); + + // This test intentionally leaves the workflow running, so we skip the resource + // cleanup check. + // masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow when no available worker and dispatch timeout is enabled") + public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { + TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); + taskDispatchPolicy.setDispatchTimeoutEnabled(true); + taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); + this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); + + final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("default"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow when no available worker and dispatch timeout is disabled") + public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisabled() { + TaskDispatchPolicy policy = new TaskDispatchPolicy(); + policy.setDispatchTimeoutEnabled(false); + this.masterConfig.setTaskDispatchPolicy(policy); + + final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo( + TaskExecutionStatus.SUBMITTED_SUCCESS); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + }); + + // This test intentionally leaves the workflow running, so we skip the resource + // cleanup check. + // masterContainer.assertAllResourceReleased(); + } } diff --git a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml new file mode 100644 index 000000000000..3647b9b40428 --- /dev/null +++ b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml @@ -0,0 +1,47 @@ +project: + name: MasterIntegrationTest + code: 1 + description: This is a fake project + userId: 1 + userName: admin + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + +workflows: + - name: workflow_with_timeout_warn_task + code: 1 + version: 1 + projectCode: 1 + description: This is a fake workflow with single timeout warn task + releaseState: ONLINE + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + userId: 1 + executionType: PARALLEL + +tasks: + - name: dep_task_with_timeout_warn + code: 1 + version: 1 + projectCode: 1 + userId: 1 + timeoutFlag: 'OPEN' + timeoutNotifyStrategy: 'WARN' + timeout: 1 + taskType: DEPENDENT + taskParams: '{"localParams":[],"resourceList":[],"dependence":{"checkInterval":10,"failurePolicy":"DEPENDENT_FAILURE_FAILURE","relation":"AND","dependTaskList":[{"relation":"AND","dependItemList":[{"dependentType":"DEPENDENT_ON_WORKFLOW","projectCode":1,"definitionCode":1,"depTaskCode":0,"cycle":"day","dateValue":"last1Days"}]}]}}' + workerGroup: default + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + taskExecuteType: BATCH + +taskRelations: + - projectCode: 1 + workflowDefinitionCode: 1 + workflowDefinitionVersion: 1 + preTaskCode: 0 + preTaskVersion: 0 + postTaskCode: 1 + postTaskVersion: 1 + createTime: 2024-08-12 00:00:00 + updateTime: 2024-08-12 00:00:00 diff --git a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml new file mode 100644 index 000000000000..c7331cded643 --- /dev/null +++ b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml @@ -0,0 +1,47 @@ +project: + name: MasterIntegrationTest + code: 1 + description: This is a fake project + userId: 1 + userName: admin + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + +workflows: + - name: workflow_with_timeout_warnfailed_task + code: 1 + version: 1 + projectCode: 1 + description: This is a fake workflow with single timeout warnfailed task + releaseState: ONLINE + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + userId: 1 + executionType: PARALLEL + +tasks: + - name: dep_task_with_timeout_warnfailed + code: 1 + version: 1 + projectCode: 1 + userId: 1 + timeoutFlag: 'OPEN' + timeoutNotifyStrategy: 'WARNFAILED' + timeout: 1 + taskType: DEPENDENT + taskParams: '{"localParams":[],"resourceList":[],"dependence":{"checkInterval":10,"failurePolicy":"DEPENDENT_FAILURE_FAILURE","relation":"AND","dependTaskList":[{"relation":"AND","dependItemList":[{"dependentType":"DEPENDENT_ON_WORKFLOW","projectCode":1,"definitionCode":1,"depTaskCode":0,"cycle":"day","dateValue":"last1Days"}]}]}}' + workerGroup: default + createTime: 2024-08-12 00:00:00 + updateTime: 2021-08-12 00:00:00 + taskExecuteType: BATCH + +taskRelations: + - projectCode: 1 + workflowDefinitionCode: 1 + workflowDefinitionVersion: 1 + preTaskCode: 0 + preTaskVersion: 0 + postTaskCode: 1 + postTaskVersion: 1 + createTime: 2024-08-12 00:00:00 + updateTime: 2024-08-12 00:00:00 From c6f6ed879e431b5ecb943cd276464779f3e85f7e Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Thu, 26 Feb 2026 10:08:12 +0530 Subject: [PATCH 2/7] [Improvement-17843][Master] Add IT case for task timeout alert --- .../master/integration/WorkflowOperator.java | 40 +- .../cases/WorkflowStartTestCase.java | 3635 ++++++++--------- 2 files changed, 1749 insertions(+), 1926 deletions(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java index 942519287562..aaac0b459deb 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/WorkflowOperator.java @@ -67,12 +67,10 @@ public Integer manualTriggerWorkflow(final WorkflowTriggerDTO workflowTriggerDTO .dryRun(workflowTriggerDTO.getDryRun()) .taskDependType(workflowTriggerDTO.getTaskDependType()) .failureStrategy(workflowTriggerDTO.getFailureStrategy()) - .warningType(workflowTriggerDTO.getWarningType()) - .warningGroupId(workflowTriggerDTO.getWarningGroupId()) .build(); - final WorkflowManualTriggerResponse manualTriggerWorkflowResponse = workflowInstanceController - .manualTriggerWorkflow(workflowManualTriggerRequest); + final WorkflowManualTriggerResponse manualTriggerWorkflowResponse = + workflowInstanceController.manualTriggerWorkflow(workflowManualTriggerRequest); Assertions.assertThat(manualTriggerWorkflowResponse.isSuccess()).isTrue(); return manualTriggerWorkflowResponse.getWorkflowInstanceId(); @@ -116,32 +114,32 @@ public void repeatRunningWorkflowInstance(final Integer workflowInstanceId) { } public void recoverFailureTasks(final Integer workflowInstanceId) { - final WorkflowInstanceRecoverFailureTasksRequest recoverFailureTasksRequest = WorkflowInstanceRecoverFailureTasksRequest - .builder() - .workflowInstanceId(workflowInstanceId) - .userId(1) - .build(); + final WorkflowInstanceRecoverFailureTasksRequest recoverFailureTasksRequest = + WorkflowInstanceRecoverFailureTasksRequest.builder() + .workflowInstanceId(workflowInstanceId) + .userId(1) + .build(); workflowInstanceController.triggerFromFailureTasks(recoverFailureTasksRequest); } public WorkflowInstancePauseResponse pauseWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstancePauseRequest workflowInstancePauseRequest = new WorkflowInstancePauseRequest( - workflowInstanceId); + final WorkflowInstancePauseRequest workflowInstancePauseRequest = + new WorkflowInstancePauseRequest(workflowInstanceId); return workflowInstanceController.pauseWorkflowInstance(workflowInstancePauseRequest); } public WorkflowInstanceRecoverSuspendTasksResponse recoverSuspendWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstanceRecoverSuspendTasksRequest workflowInstancePauseRequest = WorkflowInstanceRecoverSuspendTasksRequest - .builder() - .workflowInstanceId(workflowInstanceId) - .userId(1) - .build(); + final WorkflowInstanceRecoverSuspendTasksRequest workflowInstancePauseRequest = + WorkflowInstanceRecoverSuspendTasksRequest.builder() + .workflowInstanceId(workflowInstanceId) + .userId(1) + .build(); return workflowInstanceController.triggerFromSuspendTasks(workflowInstancePauseRequest); } public WorkflowInstanceStopResponse stopWorkflowInstance(Integer workflowInstanceId) { - final WorkflowInstanceStopRequest workflowInstanceStopRequest = new WorkflowInstanceStopRequest( - workflowInstanceId); + final WorkflowInstanceStopRequest workflowInstanceStopRequest = + new WorkflowInstanceStopRequest(workflowInstanceId); return workflowInstanceController.stopWorkflowInstance(workflowInstanceStopRequest); } @@ -162,12 +160,6 @@ public static class WorkflowTriggerDTO { @Builder.Default private FailureStrategy failureStrategy = FailureStrategy.CONTINUE; - - @Builder.Default - private org.apache.dolphinscheduler.common.enums.WarningType warningType = org.apache.dolphinscheduler.common.enums.WarningType.NONE; - - @Builder.Default - private Integer warningGroupId = 0; } @Data diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index a162c958f61b..44683e45e266 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -52,1501 +52,1730 @@ /** * The integration test for starting a workflow from workflow definition. - *

- * In each test method, will create different workflow from yaml, and then - * trigger it, and do assertions. - *

- * The method name should be clear to describe the test scenario. + *

In each test method, will create different workflow from yaml, and then trigger it, and do assertions. + *

The method name should be clear to describe the test scenario. */ public class WorkflowStartTestCase extends AbstractMasterIntegrationTestCase { - @Test - @DisplayName("Test start a workflow with one fake task(A) success") - public void testStartWorkflow_with_oneSuccessTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.NO.getCode()); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) dry run success") - public void testStartWorkflow_with_oneSuccessTaskDryRun() { - final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .dryRun(Flag.YES) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.YES - .getCode()); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.YES.getCode()); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two fake task(A) has the same name") - public void testStartWorkflow_contains_duplicateTaskName() { - final String yaml = "/it/start/workflow_with_duplicate_task_name.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE); - assertThat(repository.queryTaskInstance(workflowInstanceId)).isEmpty(); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial wait strategy") - public void testStartWorkflow_with_serialWaitStrategy() { - final String yaml = "/it/start/workflow_with_serial_wait_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); - }); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - final WorkflowInstance workflowInstance1 = repository - .queryWorkflowInstance(workflowInstanceId1); - final WorkflowInstance workflowInstance2 = repository - .queryWorkflowInstance(workflowInstanceId2); - final WorkflowInstance workflowInstance3 = repository - .queryWorkflowInstance(workflowInstanceId3); - assertThat(workflowInstance1.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), - 5)); - assertThat(workflowInstance3.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance3.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), - 5)); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial discard strategy") - public void testStartWorkflow_with_serialDiscardStrategy() { - final String yaml = "/it/start/workflow_with_serial_discard_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using serial priority strategy") - public void testStartWorkflow_with_serialPriorityStrategy() { - final String yaml = "/it/start/workflow_with_serial_priority_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) - .isEqualTo(WorkflowExecutionStatus.STOP); - assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three fake task(A) using end failure strategy") - public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { - final String yaml = "/it/start/workflow_with_three_parallel_fake_task_using_failure_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .failureStrategy(FailureStrategy.END) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE); - Assertions.assertThat(repository.queryTaskInstance(workflow)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two fake task(A) using task group") - public void testStartWorkflow_with_successTaskUsingTaskGroup() { - final String yaml = "/it/start/workflow_with_fake_tasks_using_task_group.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(2)) - .atLeast(Duration.ofSeconds(20)) - .untilAsserted(() -> { - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS - .equals(taskInstance.getState()) && - taskInstance.getTaskGroupId() == context - .getTaskGroups().get(0) - .getId()); - - final TaskInstance taskA = taskInstances.stream() - .filter(t -> "A".equals(t.getName())) - .findFirst().get(); - final TaskInstance taskB = taskInstances.stream() - .filter(t -> "B".equals(t.getName())) - .findFirst().get(); - // TaskA's task group priority is smaller than B - Assertions.assertThat(taskA.getStartTime()).isAfter(taskB.getStartTime()); - Assertions.assertThat(taskA.getEndTime()).isAfter(taskB.getEndTime()); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) using environment config") - public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { - final String yaml = "/it/start/workflow_with_one_fake_task_using_environment_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one success switch task and two fake task") - public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { - final String yaml = "/it/start/workflow_with_one_success_switch_two_fake_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("switch_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("success_branch"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one failed switch task and two fake task") - public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { - final String yaml = "/it/start/workflow_with_one_failed_switch_two_fake_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("switch_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("default_branch"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) success") - public void testStartWorkflow_with_subWorkflowTask_success() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); - - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .hasSize(1) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance.getIsSubWorkflow()) - .isEqualTo(Flag.YES); - assertThat(workflowInstance.getDryRun()) - .isEqualTo(Flag.NO.getCode()); - }); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - - Assertions - .assertThat(repository.queryTaskInstance( - subWorkflowInstance.get(0).getId())) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("fake_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) dry run, will not execute") - public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .dryRun(Flag.YES) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) - .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.YES - .getCode()); - - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .isEmpty(); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.YES.getCode()); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run success") - void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { - final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(4) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run failed") - void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { - final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one sub workflow task(A) failed") - public void testStartWorkflow_with_subWorkflowTask_failed() { - final String yaml = "/it/start/workflow_with_sub_workflow_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE) - .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO); - - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); - Assertions - .assertThat(subWorkflowInstance) - .hasSize(1) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.FAILURE); - assertThat(workflowInstance.getIsSubWorkflow()) - .isEqualTo(Flag.YES); - }); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - - Assertions - .assertThat(repository.queryTaskInstance( - subWorkflowInstance.get(0).getId())) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("fake_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using workflow params") - public void testStartWorkflow_usingWorkflowParam() { - final String yaml = "/it/start/workflow_with_global_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using command params") - public void testStartWorkflow_usingCommandParam() { - final String yaml = "/it/start/workflow_with_global_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .commandParams(Lists.newArrayList(Property.builder() - .prop("name") - .direct(Direct.IN) - .type(DataType.VARCHAR) - .value("commandParam") - .build())) - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow contains fake task using local param will be overwrite by varpool") - public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { - final String yaml = "/it/start/workflow_with_local_param_overwrite_by_varpool.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - List assertVarPools = Lists.newArrayList( - Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1") - .build()); - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.SUCCESS); - assertThat(VarPoolUtils.deserializeVarPool( - workflowInstance.getVarPool())) - .isEqualTo(assertVarPools); - }); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using null key params") - public void testStartWorkflow_usingNullKeyParam() { - final String yaml = "/it/start/workflow_with_null_key_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .commandParams(Lists.newArrayList(Property.builder() - .prop(null) - .direct(Direct.IN) - .type(DataType.VARCHAR) - .value("commandParam") - .build())) - .build(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) failed") - public void testStartWorkflow_with_oneFailedTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) fatal") - public void testStartWorkflow_with_oneFatalTask() { - final String yaml = "/it/start/workflow_with_one_fake_task_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one fake task(A) failed") - public void testStartWorkflow_with_oneFailedTaskWithRetry() { - final String yaml = "/it/start/workflow_with_one_fake_task_failed_with_retry.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(3)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .allSatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .hasSize(2); - - final TaskInstance taskInstance = taskInstances.get(0); - Assertions - .assertThat(taskInstance) - .matches(task -> task.getRetryTimes() == 0) - .matches(task -> task.getFlag() == Flag.NO) - .isNotNull(); - - final TaskInstance latestTaskInstance = taskInstances.get(1); - Assertions - .assertThat(latestTaskInstance) - .matches(task -> task.getRetryTimes() == 1) - .matches(task -> task.getFlag() == Flag.YES) - .isNotNull(); - assertThat(latestTaskInstance.getFirstSubmitTime()) - .isEqualTo(taskInstance.getFirstSubmitTime()); - assertThat(latestTaskInstance.getSubmitTime()) - .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), - -65)); - assertThat(latestTaskInstance.getSubmitTime()) - .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), - 65)); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two serial fake tasks(A -> B) success") - public void testStartWorkflow_with_twoSerialSuccessTask() { - String yaml = "/it/start/workflow_with_two_serial_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two serial fake tasks(A(failed) -> B) success") - public void testStartWorkflow_with_twoSerialFailedTask() { - final String yaml = "/it/start/workflow_with_two_serial_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two parallel fake tasks(A, B) success") - public void testStartWorkflow_with_twoParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_two_parallel_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with two parallel fake tasks(A(failed), B(failed)) success") - public void testStartWorkflow_with_twoParallelFailedTask() { - final String yaml = "/it/start/workflow_with_two_parallel_fake_task_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") - public void testStartWorkflow_with_threeParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(9) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") - public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { - final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() - .startNodes(Lists.newArrayList(6L)) - .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(runWorkflowCommandParam) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) - .hasSize(1); - - final List taskInstances = repository.queryTaskInstance(workflow); - Assertions - .assertThat(taskInstances) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which using workflow built in params") - public void testStartWorkflow_usingWorkflowBuiltInParam() { - final String yaml = "/it/start/workflow_with_built_in_param.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which contains a dep task with timeout kill strategy") - public void testStartWorkflow_withTimeoutKillTask() { - final String yaml = "/it/start/workflow_with_timeout_kill_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which contains a dep task will be kill by system timeout") - public void testStartWorkflow_withSystemTimeoutKillTask() { - masterConfig.getServerLoadProtection().setMaxTaskInstanceRuntime(Duration.ofMinutes(1)); - - final String yaml = "/it/start/workflow_with_system_timeout_kill_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with task depend type TASK_ONLY") - public void testStartWorkflow_withTaskOnlyStrategy() { - final String yaml = "/it/start/workflow_with_task_only_strategy.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam( - new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) - .taskDependType(TaskDependType.TASK_ONLY) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } + @Test + @DisplayName("Test start a workflow with one fake task(A) success") + public void testStartWorkflow_with_oneSuccessTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) dry run success") + public void testStartWorkflow_with_oneSuccessTaskDryRun() { + final String yaml = "/it/start/workflow_with_one_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .dryRun(Flag.YES) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two fake task(A) has the same name") + public void testStartWorkflow_contains_duplicateTaskName() { + final String yaml = "/it/start/workflow_with_duplicate_task_name.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE); + assertThat(repository.queryTaskInstance(workflowInstanceId)).isEmpty(); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial wait strategy") + public void testStartWorkflow_with_serialWaitStrategy() { + final String yaml = "/it/start/workflow_with_serial_wait_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.SERIAL_WAIT); + }); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + final WorkflowInstance workflowInstance1 = repository.queryWorkflowInstance(workflowInstanceId1); + final WorkflowInstance workflowInstance2 = repository.queryWorkflowInstance(workflowInstanceId2); + final WorkflowInstance workflowInstance3 = repository.queryWorkflowInstance(workflowInstanceId3); + assertThat(workflowInstance1.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getEndTime()) + .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), 5)); + assertThat(workflowInstance3.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance3.getEndTime()) + .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), 5)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial discard strategy") + public void testStartWorkflow_with_serialDiscardStrategy() { + final String yaml = "/it/start/workflow_with_serial_discard_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using serial priority strategy") + public void testStartWorkflow_with_serialPriorityStrategy() { + final String yaml = "/it/start/workflow_with_serial_priority_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId1 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId2 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + final Integer workflowInstanceId3 = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId1).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId2).getState()) + .isEqualTo(WorkflowExecutionStatus.STOP); + assertThat(repository.queryWorkflowInstance(workflowInstanceId3).getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three fake task(A) using end failure strategy") + public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { + final String yaml = "/it/start/workflow_with_three_parallel_fake_task_using_failure_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .failureStrategy(FailureStrategy.END) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + assertThat(repository.queryWorkflowInstance(workflowInstanceId).getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE); + Assertions.assertThat(repository.queryTaskInstance(workflow)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two fake task(A) using task group") + public void testStartWorkflow_with_successTaskUsingTaskGroup() { + final String yaml = "/it/start/workflow_with_fake_tasks_using_task_group.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(2)) + .atLeast(Duration.ofSeconds(20)) + .untilAsserted(() -> { + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS.equals(taskInstance.getState()) && + taskInstance.getTaskGroupId() == context.getTaskGroups().get(0).getId()); + + final TaskInstance taskA = taskInstances.stream() + .filter(t -> "A".equals(t.getName())) + .findFirst().get(); + final TaskInstance taskB = taskInstances.stream() + .filter(t -> "B".equals(t.getName())) + .findFirst().get(); + // TaskA's task group priority is smaller than B + Assertions.assertThat(taskA.getStartTime()).isAfter(taskB.getStartTime()); + Assertions.assertThat(taskA.getEndTime()).isAfter(taskB.getEndTime()); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) using environment config") + public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { + final String yaml = "/it/start/workflow_with_one_fake_task_using_environment_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one success switch task and two fake task") + public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { + final String yaml = "/it/start/workflow_with_one_success_switch_two_fake_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("switch_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("success_branch"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one failed switch task and two fake task") + public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { + final String yaml = "/it/start/workflow_with_one_failed_switch_two_fake_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("switch_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("default_branch"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) success") + public void testStartWorkflow_with_subWorkflowTask_success() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .hasSize(1) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); + assertThat(workflowInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); + }); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + + Assertions + .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("fake_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) dry run, will not execute") + public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .dryRun(Flag.YES) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .matches( + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + .matches( + workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); + + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .isEmpty(); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run success") + void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { + final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(4) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) with multiple predecessors run failed") + void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { + final String yaml = "/it/start/workflow_with_one_fake_task_with_multiple_predecessors_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one sub workflow task(A) failed") + public void testStartWorkflow_with_subWorkflowTask_failed() { + final String yaml = "/it/start/workflow_with_sub_workflow_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) + .matches( + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO); + + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); + Assertions + .assertThat(subWorkflowInstance) + .hasSize(1) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.FAILURE); + assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); + }); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("fake_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using workflow params") + public void testStartWorkflow_usingWorkflowParam() { + final String yaml = "/it/start/workflow_with_global_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using command params") + public void testStartWorkflow_usingCommandParam() { + final String yaml = "/it/start/workflow_with_global_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .commandParams(Lists.newArrayList(Property.builder() + .prop("name") + .direct(Direct.IN) + .type(DataType.VARCHAR) + .value("commandParam") + .build())) + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow contains fake task using local param will be overwrite by varpool") + public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { + final String yaml = "/it/start/workflow_with_local_param_overwrite_by_varpool.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + List assertVarPools = Lists.newArrayList( + Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1").build()); + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> { + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool(workflowInstance.getVarPool())) + .isEqualTo(assertVarPools); + }); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using null key params") + public void testStartWorkflow_usingNullKeyParam() { + final String yaml = "/it/start/workflow_with_null_key_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .commandParams(Lists.newArrayList(Property.builder() + .prop(null) + .direct(Direct.IN) + .type(DataType.VARCHAR) + .value("commandParam") + .build())) + .build(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) failed") + public void testStartWorkflow_with_oneFailedTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) fatal") + public void testStartWorkflow_with_oneFatalTask() { + final String yaml = "/it/start/workflow_with_one_fake_task_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one fake task(A) failed") + public void testStartWorkflow_with_oneFailedTaskWithRetry() { + final String yaml = "/it/start/workflow_with_one_fake_task_failed_with_retry.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(3)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .allSatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .hasSize(2); + + final TaskInstance taskInstance = taskInstances.get(0); + Assertions + .assertThat(taskInstance) + .matches(task -> task.getRetryTimes() == 0) + .matches(task -> task.getFlag() == Flag.NO) + .isNotNull(); + + final TaskInstance latestTaskInstance = taskInstances.get(1); + Assertions + .assertThat(latestTaskInstance) + .matches(task -> task.getRetryTimes() == 1) + .matches(task -> task.getFlag() == Flag.YES) + .isNotNull(); + assertThat(latestTaskInstance.getFirstSubmitTime()).isEqualTo(taskInstance.getFirstSubmitTime()); + assertThat(latestTaskInstance.getSubmitTime()) + .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), -65)); + assertThat(latestTaskInstance.getSubmitTime()) + .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), 65)); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two serial fake tasks(A -> B) success") + public void testStartWorkflow_with_twoSerialSuccessTask() { + String yaml = "/it/start/workflow_with_two_serial_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two serial fake tasks(A(failed) -> B) success") + public void testStartWorkflow_with_twoSerialFailedTask() { + final String yaml = "/it/start/workflow_with_two_serial_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two parallel fake tasks(A, B) success") + public void testStartWorkflow_with_twoParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_two_parallel_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with two parallel fake tasks(A(failed), B(failed)) success") + public void testStartWorkflow_with_twoParallelFailedTask() { + final String yaml = "/it/start/workflow_with_two_parallel_fake_task_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") + public void testStartWorkflow_with_threeParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(9) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A1"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A2"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A3"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B1"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B2"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B3"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C1"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C2"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C3"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with three parallel three fake tasks(A1->A2->A3, B1->B2->B3, C1->C2->C3) success") + public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { + final String yaml = "/it/start/workflow_with_three_parallel_three_fake_task_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() + .startNodes(Lists.newArrayList(6L)) + .build(); + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(runWorkflowCommandParam) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .filteredOn( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + .hasSize(1); + + final List taskInstances = repository.queryTaskInstance(workflow); + Assertions + .assertThat(taskInstances) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C2"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C3"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which using workflow built in params") + public void testStartWorkflow_usingWorkflowBuiltInParam() { + final String yaml = "/it/start/workflow_with_built_in_param.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which contains a dep task with timeout kill strategy") + public void testStartWorkflow_withTimeoutKillTask() { + final String yaml = "/it/start/workflow_with_timeout_kill_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which contains a dep task will be kill by system timeout") + public void testStartWorkflow_withSystemTimeoutKillTask() { + masterConfig.getServerLoadProtection().setMaxTaskInstanceRuntime(Duration.ofMinutes(1)); + + final String yaml = "/it/start/workflow_with_system_timeout_kill_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with task depend type TASK_ONLY") + public void testStartWorkflow_withTaskOnlyStrategy() { + final String yaml = "/it/start/workflow_with_task_only_strategy.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) + .taskDependType(TaskDependType.TASK_ONLY) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with task which successors is forbidden") + public void testStartWorkflow_withTaskSuccessorsIsForbidden() { + final String yaml = "/it/start/workflow_with_task_successors_is_forbidden.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(2) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }, (Consumer) taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C1"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run success") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run success") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runSuccess() { + final String yaml = + "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_success.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("C"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run failed") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run fatal") + void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { + final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(3) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("B"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("D"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run failed") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFailed() { + final String yaml = + "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_failed.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") + void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { + final String yaml = + "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(parentWorkflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofMinutes(1)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .matches( + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + + Assertions + .assertThat(repository.queryTaskInstance(workflowInstanceId)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is enabled") + public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { + TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); + taskDispatchPolicy.setDispatchTimeoutEnabled(true); + taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); + this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); + + final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is disabled") + public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDisabled() { + TaskDispatchPolicy policy = new TaskDispatchPolicy(); + policy.setDispatchTimeoutEnabled(false); + this.masterConfig.setTaskDispatchPolicy(policy); + + final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + + }); + + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow when no available worker and dispatch timeout is enabled") + public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { + TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); + taskDispatchPolicy.setDispatchTimeoutEnabled(true); + taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); + this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); + + final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + }); + + masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow when no available worker and dispatch timeout is disabled") + public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisabled() { + TaskDispatchPolicy policy = new TaskDispatchPolicy(); + policy.setDispatchTimeoutEnabled(false); + this.masterConfig.setTaskDispatchPolicy(policy); + + final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getOneWorkflow(); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .anySatisfy(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); + }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + }); + + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // masterContainer.assertAllResourceReleased(); + } @Test - @DisplayName("Test start a workflow with task which successors is forbidden") - public void testStartWorkflow_withTaskSuccessorsIsForbidden() { - final String yaml = "/it/start/workflow_with_task_successors_is_forbidden.yaml"; + @DisplayName("Test start a workflow which contains a dep task with timeout warn strategy") + public void testStartWorkflow_withTimeoutWarnTask() { + final String yaml = "/it/start/workflow_with_timeout_warn_task.yaml"; final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warn_task"); final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO .builder() @@ -1556,295 +1785,33 @@ public void testStartWorkflow_withTaskSuccessorsIsForbidden() { workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); await() - .atMost(Duration.ofMinutes(1)) + .atMost(Duration.ofSeconds(90)) .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .satisfiesExactly(workflowInstance -> assertThat( workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); Assertions .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(2) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }, (Consumer) taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run success") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run success") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runSuccess() { - final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_success.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run failed") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) when one fake predecessor task(A) run fatal") - void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = "/it/start/workflow_with_one_condition_task_with_one_fake_predecessor_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(3) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run failed") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFailed() { - final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_failed.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") - void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(parentWorkflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - final Integer workflowInstanceId = workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofMinutes(1)) - .untilAsserted(() -> { - Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) - .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); - - Assertions - .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(1) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_warn"); assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + .isEqualTo(TaskExecutionStatus.RUNNING_EXECUTION); }); }); - masterContainer.assertAllResourceReleased(); + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // masterContainer.assertAllResourceReleased(); } @Test - @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is enabled") - public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { - TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); - taskDispatchPolicy.setDispatchTimeoutEnabled(true); - taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); - this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); - - final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; + @DisplayName("Test start a workflow which contains a dep task with timeout warn failed strategy") + public void testStartWorkflow_withTimeoutWarnFailedTask() { + final String yaml = "/it/start/workflow_with_timeout_warnfailed_task.yaml"; final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warnfailed_task"); final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO .builder() @@ -1854,159 +1821,23 @@ public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); await() - .atMost(Duration.ofSeconds(30)) + .atMost(Duration.ofSeconds(90)) .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .satisfiesExactly(workflowInstance -> assertThat( workflowInstance.getState()) .isEqualTo(WorkflowExecutionStatus.FAILURE)); - }); - - masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow whose task specifies a non-existent worker group when dispatch timeout is disabled") - public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDisabled() { - TaskDispatchPolicy policy = new TaskDispatchPolicy(); - policy.setDispatchTimeoutEnabled(false); - this.masterConfig.setTaskDispatchPolicy(policy); - - final String yaml = "/it/start/workflow_with_worker_group_not_found.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo( - TaskExecutionStatus.SUBMITTED_SUCCESS); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); - - }); - - // This test intentionally leaves the workflow running, so we skip the resource - // cleanup check. - // masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow when no available worker and dispatch timeout is enabled") - public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { - TaskDispatchPolicy taskDispatchPolicy = new TaskDispatchPolicy(); - taskDispatchPolicy.setDispatchTimeoutEnabled(true); - taskDispatchPolicy.setMaxTaskDispatchDuration(Duration.ofSeconds(10)); - this.masterConfig.setTaskDispatchPolicy(taskDispatchPolicy); - - final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("default"); + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_warnfailed"); assertThat(taskInstance.getState()) .isEqualTo(TaskExecutionStatus.FAILURE); }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); }); - masterContainer.assertAllResourceReleased(); } - - @Test - @DisplayName("Test start a workflow when no available worker and dispatch timeout is disabled") - public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisabled() { - TaskDispatchPolicy policy = new TaskDispatchPolicy(); - policy.setDispatchTimeoutEnabled(false); - this.masterConfig.setTaskDispatchPolicy(policy); - - final String yaml = "/it/start/workflow_with_no_available_worker.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getOneWorkflow(); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(30)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo( - TaskExecutionStatus.SUBMITTED_SUCCESS); - }); - - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); - }); - - // This test intentionally leaves the workflow running, so we skip the resource - // cleanup check. - // masterContainer.assertAllResourceReleased(); - } - } From 391416c00693dcca0471e546c9bab03352efc2b6 Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Thu, 26 Feb 2026 12:13:04 +0530 Subject: [PATCH 3/7] Added Apache Header ... --- .../cases/WorkflowStartTestCase.java | 140 +++++++++--------- .../workflow_with_timeout_warn_task.yaml | 17 +++ ...workflow_with_timeout_warnfailed_task.yaml | 17 +++ 3 files changed, 104 insertions(+), 70 deletions(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index 44683e45e266..24876b032035 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -1770,74 +1770,74 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa // masterContainer.assertAllResourceReleased(); } - @Test - @DisplayName("Test start a workflow which contains a dep task with timeout warn strategy") - public void testStartWorkflow_withTimeoutWarnTask() { - final String yaml = "/it/start/workflow_with_timeout_warn_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warn_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_warn"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.RUNNING_EXECUTION); - }); - }); - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. - // masterContainer.assertAllResourceReleased(); - } - - @Test - @DisplayName("Test start a workflow which contains a dep task with timeout warn failed strategy") - public void testStartWorkflow_withTimeoutWarnFailedTask() { - final String yaml = "/it/start/workflow_with_timeout_warnfailed_task.yaml"; - final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); - final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warnfailed_task"); - - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() - .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam()) - .build(); - workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); - - await() - .atMost(Duration.ofSeconds(90)) - .untilAsserted(() -> { - Assertions - .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); - Assertions - .assertThat(repository.queryTaskInstance(workflow)) - .hasSize(1) - .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_warnfailed"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); - }); - }); - masterContainer.assertAllResourceReleased(); - } + @Test + @DisplayName("Test start a workflow which contains a dep task with timeout warn strategy") + public void testStartWorkflow_withTimeoutWarnTask() { + final String yaml = "/it/start/workflow_with_timeout_warn_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warn_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_warn"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.RUNNING_EXECUTION); + }); + }); + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // masterContainer.assertAllResourceReleased(); + } + + @Test + @DisplayName("Test start a workflow which contains a dep task with timeout warn failed strategy") + public void testStartWorkflow_withTimeoutWarnFailedTask() { + final String yaml = "/it/start/workflow_with_timeout_warnfailed_task.yaml"; + final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); + final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_warnfailed_task"); + + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() + .workflowDefinition(workflow) + .runWorkflowCommandParam(new RunWorkflowCommandParam()) + .build(); + workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); + + await() + .atMost(Duration.ofSeconds(90)) + .untilAsserted(() -> { + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); + Assertions + .assertThat(repository.queryTaskInstance(workflow)) + .hasSize(1) + .satisfiesExactly(taskInstance -> { + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_warnfailed"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); + }); + }); + masterContainer.assertAllResourceReleased(); + } } diff --git a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml index 3647b9b40428..7612658845ff 100644 --- a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml +++ b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warn_task.yaml @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# + project: name: MasterIntegrationTest code: 1 diff --git a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml index c7331cded643..ff930f3bfe5f 100644 --- a/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml +++ b/dolphinscheduler-master/src/test/resources/it/start/workflow_with_timeout_warnfailed_task.yaml @@ -1,3 +1,20 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +# + project: name: MasterIntegrationTest code: 1 From 9e75a326e4ef05747d9654364a198a47b09e6a5d Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Thu, 26 Feb 2026 18:18:52 +0530 Subject: [PATCH 4/7] Issues Resolved In testCase Evaluation ... --- .../cases/WorkflowStartTestCase.java | 776 ++++++++++++------ 1 file changed, 510 insertions(+), 266 deletions(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index 24876b032035..822b81e1891d 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -52,8 +52,11 @@ /** * The integration test for starting a workflow from workflow definition. - *

In each test method, will create different workflow from yaml, and then trigger it, and do assertions. - *

The method name should be clear to describe the test scenario. + *

+ * In each test method, will create different workflow from yaml, and then + * trigger it, and do assertions. + *

+ * The method name should be clear to describe the test scenario. */ public class WorkflowStartTestCase extends AbstractMasterIntegrationTestCase { @@ -64,7 +67,8 @@ public void testStartWorkflow_with_oneSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -74,17 +78,23 @@ public void testStartWorkflow_with_oneSuccessTask() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.NO.getCode()); }); }); @@ -98,7 +108,8 @@ public void testStartWorkflow_with_oneSuccessTaskDryRun() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .dryRun(Flag.YES) @@ -109,17 +120,23 @@ public void testStartWorkflow_with_oneSuccessTaskDryRun() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.YES + .getCode()); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.YES.getCode()); }); }); @@ -133,7 +150,8 @@ public void testStartWorkflow_contains_duplicateTaskName() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -157,7 +175,8 @@ public void testStartWorkflow_with_serialWaitStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -179,16 +198,24 @@ public void testStartWorkflow_with_serialWaitStrategy() { await() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { - final WorkflowInstance workflowInstance1 = repository.queryWorkflowInstance(workflowInstanceId1); - final WorkflowInstance workflowInstance2 = repository.queryWorkflowInstance(workflowInstanceId2); - final WorkflowInstance workflowInstance3 = repository.queryWorkflowInstance(workflowInstanceId3); - assertThat(workflowInstance1.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + final WorkflowInstance workflowInstance1 = repository + .queryWorkflowInstance(workflowInstanceId1); + final WorkflowInstance workflowInstance2 = repository + .queryWorkflowInstance(workflowInstanceId2); + final WorkflowInstance workflowInstance3 = repository + .queryWorkflowInstance(workflowInstanceId3); + assertThat(workflowInstance1.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); assertThat(workflowInstance2.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), 5)); - assertThat(workflowInstance3.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), + 5)); + assertThat(workflowInstance3.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS); assertThat(workflowInstance3.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), 5)); + .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), + 5)); }); masterContainer.assertAllResourceReleased(); @@ -201,7 +228,8 @@ public void testStartWorkflow_with_serialDiscardStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -230,7 +258,8 @@ public void testStartWorkflow_with_serialPriorityStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -259,7 +288,8 @@ public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .failureStrategy(FailureStrategy.END) @@ -275,15 +305,18 @@ public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -298,7 +331,8 @@ public void testStartWorkflow_with_successTaskUsingTaskGroup() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -313,8 +347,11 @@ public void testStartWorkflow_with_successTaskUsingTaskGroup() { Assertions .assertThat(taskInstances) .hasSize(2) - .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS.equals(taskInstance.getState()) && - taskInstance.getTaskGroupId() == context.getTaskGroups().get(0).getId()); + .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS + .equals(taskInstance.getState()) && + taskInstance.getTaskGroupId() == context + .getTaskGroups().get(0) + .getId()); final TaskInstance taskA = taskInstances.stream() .filter(t -> "A".equals(t.getName())) @@ -338,7 +375,8 @@ public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -349,13 +387,16 @@ public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -369,7 +410,8 @@ public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -380,24 +422,33 @@ public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(2) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("switch_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("switch_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("success_branch"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("success_branch"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -412,7 +463,8 @@ public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -423,24 +475,33 @@ public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(2) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("switch_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("switch_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("default_branch"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("default_branch"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -455,7 +516,8 @@ public void testStartWorkflow_with_subWorkflowTask_success() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -466,37 +528,50 @@ public void testStartWorkflow_with_subWorkflowTask_success() { .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.NO + .getCode()); - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .hasSize(1) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); - assertThat(workflowInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance.getIsSubWorkflow()) + .isEqualTo(Flag.YES); + assertThat(workflowInstance.getDryRun()) + .isEqualTo(Flag.NO.getCode()); }); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); Assertions - .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) + .assertThat(repository.queryTaskInstance( + subWorkflowInstance.get(0).getId())) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("fake_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()) + .isEqualTo("fake_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -510,7 +585,8 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .dryRun(Flag.YES) @@ -522,16 +598,21 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); + workflowInstance -> workflowInstance + .getDryRun() == Flag.YES + .getCode()); - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .isEmpty(); @@ -539,9 +620,12 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()) + .isEqualTo(Flag.YES.getCode()); }); }); masterContainer.assertAllResourceReleased(); @@ -554,7 +638,8 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -564,28 +649,34 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(4) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -598,7 +689,8 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -608,24 +700,29 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -638,7 +735,8 @@ public void testStartWorkflow_with_subWorkflowTask_failed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -649,34 +747,44 @@ public void testStartWorkflow_with_subWorkflowTask_failed() { .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE) .matches( - workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO); + workflowInstance -> workflowInstance + .getIsSubWorkflow() == Flag.NO); - final List subWorkflowInstance = - repository.queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = repository + .queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .hasSize(1) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.FAILURE); - assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.FAILURE); + assertThat(workflowInstance.getIsSubWorkflow()) + .isEqualTo(Flag.YES); }); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getName()) + .isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions - .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) + .assertThat(repository.queryTaskInstance( + subWorkflowInstance.get(0).getId())) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("fake_task"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getName()) + .isEqualTo("fake_task"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -690,7 +798,8 @@ public void testStartWorkflow_usingWorkflowParam() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -701,18 +810,21 @@ public void testStartWorkflow_usingWorkflowParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -735,7 +847,8 @@ public void testStartWorkflow_usingCommandParam() { .build())) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -746,18 +859,21 @@ public void testStartWorkflow_usingCommandParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -773,44 +889,54 @@ public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); List assertVarPools = Lists.newArrayList( - Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1").build()); + Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1") + .build()); await() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(VarPoolUtils.deserializeVarPool(workflowInstance.getVarPool())) - .isEqualTo(assertVarPools); + assertThat(workflowInstance.getState()).isEqualTo( + WorkflowExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool( + workflowInstance.getVarPool())) + .isEqualTo(assertVarPools); }); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool( + taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -832,7 +958,8 @@ public void testStartWorkflow_usingNullKeyParam() { .build())) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -843,18 +970,21 @@ public void testStartWorkflow_usingNullKeyParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -867,7 +997,8 @@ public void testStartWorkflow_with_oneFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -878,13 +1009,15 @@ public void testStartWorkflow_with_oneFailedTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -897,7 +1030,8 @@ public void testStartWorkflow_with_oneFatalTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -908,13 +1042,15 @@ public void testStartWorkflow_with_oneFatalTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -927,7 +1063,8 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -938,15 +1075,17 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); final List taskInstances = repository.queryTaskInstance(workflow); Assertions .assertThat(taskInstances) .allSatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .hasSize(2); @@ -963,11 +1102,14 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { .matches(task -> task.getRetryTimes() == 1) .matches(task -> task.getFlag() == Flag.YES) .isNotNull(); - assertThat(latestTaskInstance.getFirstSubmitTime()).isEqualTo(taskInstance.getFirstSubmitTime()); + assertThat(latestTaskInstance.getFirstSubmitTime()) + .isEqualTo(taskInstance.getFirstSubmitTime()); assertThat(latestTaskInstance.getSubmitTime()) - .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), -65)); + .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), + -65)); assertThat(latestTaskInstance.getSubmitTime()) - .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), 65)); + .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), + 65)); }); masterContainer.assertAllResourceReleased(); } @@ -979,7 +1121,8 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -990,8 +1133,9 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)) + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1000,11 +1144,13 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1017,7 +1163,8 @@ public void testStartWorkflow_with_twoSerialFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1028,13 +1175,15 @@ public void testStartWorkflow_with_twoSerialFailedTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1047,7 +1196,8 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1058,8 +1208,9 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); final List taskInstances = repository.queryTaskInstance(workflow); Assertions @@ -1067,11 +1218,13 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1084,7 +1237,8 @@ public void testStartWorkflow_with_twoParallelFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1096,7 +1250,8 @@ public void testStartWorkflow_with_twoParallelFailedTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1105,11 +1260,13 @@ public void testStartWorkflow_with_twoParallelFailedTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1122,7 +1279,8 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1134,7 +1292,8 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1143,39 +1302,48 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { .hasSize(9) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1191,7 +1359,8 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() .startNodes(Lists.newArrayList(6L)) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -1203,7 +1372,8 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1212,11 +1382,13 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1229,7 +1401,8 @@ public void testStartWorkflow_usingWorkflowBuiltInParam() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1240,18 +1413,21 @@ public void testStartWorkflow_usingWorkflowBuiltInParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1264,7 +1440,8 @@ public void testStartWorkflow_withTimeoutKillTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1275,14 +1452,17 @@ public void testStartWorkflow_withTimeoutKillTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); }); }); masterContainer.assertAllResourceReleased(); @@ -1297,7 +1477,8 @@ public void testStartWorkflow_withSystemTimeoutKillTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1308,14 +1489,17 @@ public void testStartWorkflow_withSystemTimeoutKillTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getName()).isEqualTo( + "dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.KILL); }); }); masterContainer.assertAllResourceReleased(); @@ -1328,9 +1512,11 @@ public void testStartWorkflow_withTaskOnlyStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) - .runWorkflowCommandParam(new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) + .runWorkflowCommandParam( + new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) .taskDependType(TaskDependType.TASK_ONLY) .build(); workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); @@ -1340,14 +1526,16 @@ public void testStartWorkflow_withTaskOnlyStrategy() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1360,7 +1548,8 @@ public void testStartWorkflow_withTaskSuccessorsIsForbidden() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1371,17 +1560,20 @@ public void testStartWorkflow_withTaskSuccessorsIsForbidden() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }, (Consumer) taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1394,7 +1586,8 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1404,24 +1597,29 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1435,7 +1633,8 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runS final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1445,23 +1644,28 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runS .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1474,7 +1678,8 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1484,24 +1689,29 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1514,7 +1724,8 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1524,24 +1735,29 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1555,7 +1771,8 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1565,16 +1782,19 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1583,12 +1803,12 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF @Test @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = - "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; + final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1598,16 +1818,19 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository + .queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance + .getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1625,7 +1848,8 @@ public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1639,14 +1863,17 @@ public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); }); masterContainer.assertAllResourceReleased(); @@ -1663,7 +1890,8 @@ public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDi final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1677,18 +1905,22 @@ public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDi .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo( + TaskExecutionStatus.SUBMITTED_SUCCESS); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); }); - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // This test intentionally leaves the workflow running, so we skip the resource + // cleanup check. // masterContainer.assertAllResourceReleased(); } @@ -1704,7 +1936,8 @@ public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1718,14 +1951,17 @@ public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("default"); + assertThat(taskInstance.getState()) + .isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); }); masterContainer.assertAllResourceReleased(); @@ -1742,7 +1978,8 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO + .builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1756,17 +1993,21 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); + assertThat(taskInstance.getWorkerGroup()) + .isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo( + TaskExecutionStatus.SUBMITTED_SUCCESS); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + .satisfiesExactly(workflowInstance -> assertThat( + workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); }); - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // This test intentionally leaves the workflow running, so we skip the resource + // cleanup check. // masterContainer.assertAllResourceReleased(); } @@ -1802,7 +2043,8 @@ public void testStartWorkflow_withTimeoutWarnTask() { .isEqualTo(TaskExecutionStatus.RUNNING_EXECUTION); }); }); - // This test intentionally leaves the workflow running, so we skip the resource cleanup check. + // This test intentionally leaves the workflow running, so we skip the resource + // cleanup check. // masterContainer.assertAllResourceReleased(); } @@ -1827,7 +2069,8 @@ public void testStartWorkflow_withTimeoutWarnFailedTask() { .assertThat(repository.queryWorkflowInstance(workflow)) .satisfiesExactly(workflowInstance -> assertThat( workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .isEqualTo(WorkflowExecutionStatus.STOP)); + Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) @@ -1838,6 +2081,7 @@ public void testStartWorkflow_withTimeoutWarnFailedTask() { .isEqualTo(TaskExecutionStatus.FAILURE); }); }); + masterContainer.assertAllResourceReleased(); } } From 8c3bc78da0ed44d1c17f7b0b42f4c0c0192e5140 Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Thu, 26 Feb 2026 23:53:53 +0530 Subject: [PATCH 5/7] Formatting Done Completely --- .../cases/WorkflowStartTestCase.java | 771 ++++++------------ 1 file changed, 266 insertions(+), 505 deletions(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index 822b81e1891d..8371f2bbd806 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -52,11 +52,8 @@ /** * The integration test for starting a workflow from workflow definition. - *

- * In each test method, will create different workflow from yaml, and then - * trigger it, and do assertions. - *

- * The method name should be clear to describe the test scenario. + *

In each test method, will create different workflow from yaml, and then trigger it, and do assertions. + *

The method name should be clear to describe the test scenario. */ public class WorkflowStartTestCase extends AbstractMasterIntegrationTestCase { @@ -67,8 +64,7 @@ public void testStartWorkflow_with_oneSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -78,23 +74,17 @@ public void testStartWorkflow_with_oneSuccessTask() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.NO.getCode()); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); }); }); @@ -108,8 +98,7 @@ public void testStartWorkflow_with_oneSuccessTaskDryRun() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .dryRun(Flag.YES) @@ -120,23 +109,17 @@ public void testStartWorkflow_with_oneSuccessTaskDryRun() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.YES - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.YES.getCode()); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); }); }); @@ -150,8 +133,7 @@ public void testStartWorkflow_contains_duplicateTaskName() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -175,8 +157,7 @@ public void testStartWorkflow_with_serialWaitStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -198,24 +179,16 @@ public void testStartWorkflow_with_serialWaitStrategy() { await() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { - final WorkflowInstance workflowInstance1 = repository - .queryWorkflowInstance(workflowInstanceId1); - final WorkflowInstance workflowInstance2 = repository - .queryWorkflowInstance(workflowInstanceId2); - final WorkflowInstance workflowInstance3 = repository - .queryWorkflowInstance(workflowInstanceId3); - assertThat(workflowInstance1.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance2.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); + final WorkflowInstance workflowInstance1 = repository.queryWorkflowInstance(workflowInstanceId1); + final WorkflowInstance workflowInstance2 = repository.queryWorkflowInstance(workflowInstanceId2); + final WorkflowInstance workflowInstance3 = repository.queryWorkflowInstance(workflowInstanceId3); + assertThat(workflowInstance1.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance2.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); assertThat(workflowInstance2.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), - 5)); - assertThat(workflowInstance3.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS); + .isAtLeast(DateUtils.addSeconds(workflowInstance1.getEndTime(), 5)); + assertThat(workflowInstance3.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); assertThat(workflowInstance3.getEndTime()) - .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), - 5)); + .isAtLeast(DateUtils.addSeconds(workflowInstance2.getEndTime(), 5)); }); masterContainer.assertAllResourceReleased(); @@ -228,8 +201,7 @@ public void testStartWorkflow_with_serialDiscardStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -258,8 +230,7 @@ public void testStartWorkflow_with_serialPriorityStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -288,8 +259,7 @@ public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .failureStrategy(FailureStrategy.END) @@ -305,18 +275,15 @@ public void testStartWorkflow_with_threeFakeTask_usingFailureStrategyEnd() { .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -331,8 +298,7 @@ public void testStartWorkflow_with_successTaskUsingTaskGroup() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -347,11 +313,8 @@ public void testStartWorkflow_with_successTaskUsingTaskGroup() { Assertions .assertThat(taskInstances) .hasSize(2) - .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS - .equals(taskInstance.getState()) && - taskInstance.getTaskGroupId() == context - .getTaskGroups().get(0) - .getId()); + .allMatch(taskInstance -> TaskExecutionStatus.SUCCESS.equals(taskInstance.getState()) && + taskInstance.getTaskGroupId() == context.getTaskGroups().get(0).getId()); final TaskInstance taskA = taskInstances.stream() .filter(t -> "A".equals(t.getName())) @@ -375,8 +338,7 @@ public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -387,16 +349,13 @@ public void testStartWorkflow_with_oneSuccessTaskUsingEnvironmentConfig() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -410,8 +369,7 @@ public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -422,33 +380,24 @@ public void testStartWorkflow_with_oneSuccessSwitch_twoFakeTask() { .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(2) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("switch_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("switch_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("success_branch"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("success_branch"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -463,8 +412,7 @@ public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -475,33 +423,24 @@ public void testStartWorkflow_with_oneFailedSwitch_twoFakeTask() { .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(2) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("switch_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("switch_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("default_branch"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("default_branch"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -516,8 +455,7 @@ public void testStartWorkflow_with_subWorkflowTask_success() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -528,50 +466,37 @@ public void testStartWorkflow_with_subWorkflowTask_success() { .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.NO - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.NO.getCode()); - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .hasSize(1) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.SUCCESS); - assertThat(workflowInstance.getIsSubWorkflow()) - .isEqualTo(Flag.YES); - assertThat(workflowInstance.getDryRun()) - .isEqualTo(Flag.NO.getCode()); + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); + assertThat(workflowInstance.getDryRun()).isEqualTo(Flag.NO.getCode()); }); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); Assertions - .assertThat(repository.queryTaskInstance( - subWorkflowInstance.get(0).getId())) + .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("fake_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getName()).isEqualTo("fake_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); @@ -585,8 +510,7 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .dryRun(Flag.YES) @@ -598,21 +522,16 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO) + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO) .matches( - workflowInstance -> workflowInstance - .getDryRun() == Flag.YES - .getCode()); + workflowInstance -> workflowInstance.getDryRun() == Flag.YES.getCode()); - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .isEmpty(); @@ -620,12 +539,9 @@ public void testStartWorkflow_with_subWorkflowTask_dryRunSuccess() { Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); - assertThat(taskInstance.getDryRun()) - .isEqualTo(Flag.YES.getCode()); + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getDryRun()).isEqualTo(Flag.YES.getCode()); }); }); masterContainer.assertAllResourceReleased(); @@ -638,8 +554,7 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -649,34 +564,28 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runSuccess() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(4) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -689,8 +598,7 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -700,29 +608,24 @@ void testStartWorkflow_with_oneTaskWithMultiplePredecessors_runFailed() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -735,8 +638,7 @@ public void testStartWorkflow_with_subWorkflowTask_failed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -747,44 +649,34 @@ public void testStartWorkflow_with_subWorkflowTask_failed() { .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) .matches( - workflowInstance -> workflowInstance - .getIsSubWorkflow() == Flag.NO); + workflowInstance -> workflowInstance.getIsSubWorkflow() == Flag.NO); - final List subWorkflowInstance = repository - .queryWorkflowInstance(context.getWorkflows().get(1)); + final List subWorkflowInstance = + repository.queryWorkflowInstance(context.getWorkflows().get(1)); Assertions .assertThat(subWorkflowInstance) .hasSize(1) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.FAILURE); - assertThat(workflowInstance.getIsSubWorkflow()) - .isEqualTo(Flag.YES); + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.FAILURE); + assertThat(workflowInstance.getIsSubWorkflow()).isEqualTo(Flag.YES); }); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("sub_logic_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getName()).isEqualTo("sub_logic_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions - .assertThat(repository.queryTaskInstance( - subWorkflowInstance.get(0).getId())) + .assertThat(repository.queryTaskInstance(subWorkflowInstance.get(0).getId())) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()) - .isEqualTo("fake_task"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getName()).isEqualTo("fake_task"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -798,8 +690,7 @@ public void testStartWorkflow_usingWorkflowParam() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -810,21 +701,18 @@ public void testStartWorkflow_usingWorkflowParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); @@ -847,8 +735,7 @@ public void testStartWorkflow_usingCommandParam() { .build())) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -859,21 +746,18 @@ public void testStartWorkflow_usingCommandParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -889,54 +773,44 @@ public void testStartWorkflow_fakeTask_usingLocalParamOverWriteByVarPool() { final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); List assertVarPools = Lists.newArrayList( - Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1") - .build()); + Property.builder().prop("output").direct(Direct.OUT).type(DataType.VARCHAR).value("1").build()); await() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .satisfiesExactly(workflowInstance -> { - assertThat(workflowInstance.getState()).isEqualTo( - WorkflowExecutionStatus.SUCCESS); - assertThat(VarPoolUtils.deserializeVarPool( - workflowInstance.getVarPool())) - .isEqualTo(assertVarPools); + assertThat(workflowInstance.getState()).isEqualTo(WorkflowExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool(workflowInstance.getVarPool())) + .isEqualTo(assertVarPools); }); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(VarPoolUtils.deserializeVarPool( - taskInstance.getVarPool())) - .isEqualTo(assertVarPools); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(VarPoolUtils.deserializeVarPool(taskInstance.getVarPool())) + .isEqualTo(assertVarPools); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -958,8 +832,7 @@ public void testStartWorkflow_usingNullKeyParam() { .build())) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -970,21 +843,18 @@ public void testStartWorkflow_usingNullKeyParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -997,8 +867,7 @@ public void testStartWorkflow_with_oneFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1009,15 +878,13 @@ public void testStartWorkflow_with_oneFailedTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1030,8 +897,7 @@ public void testStartWorkflow_with_oneFatalTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1042,15 +908,13 @@ public void testStartWorkflow_with_oneFatalTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1063,8 +927,7 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1075,17 +938,15 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); final List taskInstances = repository.queryTaskInstance(workflow); Assertions .assertThat(taskInstances) .allSatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .hasSize(2); @@ -1102,14 +963,11 @@ public void testStartWorkflow_with_oneFailedTaskWithRetry() { .matches(task -> task.getRetryTimes() == 1) .matches(task -> task.getFlag() == Flag.YES) .isNotNull(); - assertThat(latestTaskInstance.getFirstSubmitTime()) - .isEqualTo(taskInstance.getFirstSubmitTime()); + assertThat(latestTaskInstance.getFirstSubmitTime()).isEqualTo(taskInstance.getFirstSubmitTime()); assertThat(latestTaskInstance.getSubmitTime()) - .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), - -65)); + .isAtLeast(DateUtils.addSeconds(taskInstance.getSubmitTime(), -65)); assertThat(latestTaskInstance.getSubmitTime()) - .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), - 65)); + .isAtMost(DateUtils.addMinutes(taskInstance.getSubmitTime(), 65)); }); masterContainer.assertAllResourceReleased(); } @@ -1121,8 +979,7 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1133,9 +990,8 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1144,13 +1000,11 @@ public void testStartWorkflow_with_twoSerialSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1163,8 +1017,7 @@ public void testStartWorkflow_with_twoSerialFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1175,15 +1028,13 @@ public void testStartWorkflow_with_twoSerialFailedTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1196,8 +1047,7 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1208,9 +1058,8 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); final List taskInstances = repository.queryTaskInstance(workflow); Assertions @@ -1218,13 +1067,11 @@ public void testStartWorkflow_with_twoParallelSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1237,8 +1084,7 @@ public void testStartWorkflow_with_twoParallelFailedTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1250,8 +1096,7 @@ public void testStartWorkflow_with_twoParallelFailedTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1260,13 +1105,11 @@ public void testStartWorkflow_with_twoParallelFailedTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1279,8 +1122,7 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1292,8 +1134,7 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1302,48 +1143,39 @@ public void testStartWorkflow_with_threeParallelSuccessTask() { .hasSize(9) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1359,8 +1191,7 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { final RunWorkflowCommandParam runWorkflowCommandParam = RunWorkflowCommandParam.builder() .startNodes(Lists.newArrayList(6L)) .build(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(runWorkflowCommandParam) .build(); @@ -1372,8 +1203,7 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) .filteredOn( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS) + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS) .hasSize(1); final List taskInstances = repository.queryTaskInstance(workflow); @@ -1382,13 +1212,11 @@ public void testStartWorkflowFromStartNodes_with_threeParallelSuccessTask() { .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C2"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C3"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1401,8 +1229,7 @@ public void testStartWorkflow_usingWorkflowBuiltInParam() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1413,21 +1240,18 @@ public void testStartWorkflow_usingWorkflowBuiltInParam() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1440,8 +1264,7 @@ public void testStartWorkflow_withTimeoutKillTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1452,17 +1275,14 @@ public void testStartWorkflow_withTimeoutKillTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); }); }); masterContainer.assertAllResourceReleased(); @@ -1477,8 +1297,7 @@ public void testStartWorkflow_withSystemTimeoutKillTask() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getWorkflow("workflow_with_timeout_kill_task"); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1489,17 +1308,14 @@ public void testStartWorkflow_withSystemTimeoutKillTask() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.STOP)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { - assertThat(taskInstance.getName()).isEqualTo( - "dep_task_with_timeout_killed"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.KILL); + assertThat(taskInstance.getName()).isEqualTo("dep_task_with_timeout_killed"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.KILL); }); }); masterContainer.assertAllResourceReleased(); @@ -1512,11 +1328,9 @@ public void testStartWorkflow_withTaskOnlyStrategy() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) - .runWorkflowCommandParam( - new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) + .runWorkflowCommandParam(new RunWorkflowCommandParam().withStartNodes(Lists.newArrayList(1L))) .taskDependType(TaskDependType.TASK_ONLY) .build(); workflowOperator.manualTriggerWorkflow(workflowTriggerDTO); @@ -1526,16 +1340,14 @@ public void testStartWorkflow_withTaskOnlyStrategy() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1548,8 +1360,7 @@ public void testStartWorkflow_withTaskSuccessorsIsForbidden() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1560,20 +1371,17 @@ public void testStartWorkflow_withTaskSuccessorsIsForbidden() { .untilAsserted(() -> { Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.SUCCESS)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.SUCCESS)); Assertions .assertThat(repository.queryTaskInstance(workflow)) .hasSize(2) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }, (Consumer) taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C1"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1586,8 +1394,7 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1597,29 +1404,24 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runSuccess() .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1633,8 +1435,7 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runS final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1644,28 +1445,23 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runS .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("C"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1678,8 +1474,7 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1689,29 +1484,24 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFailed() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1724,8 +1514,7 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1735,29 +1524,24 @@ void testStartWorkflow_with_oneConditionTaskWithOneFakePredecessor_runFatal() { .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.SUCCESS); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.SUCCESS); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(3) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("B"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("D"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.SUCCESS); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUCCESS); }); }); masterContainer.assertAllResourceReleased(); @@ -1771,8 +1555,7 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1782,19 +1565,16 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1803,12 +1583,12 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF @Test @DisplayName("Test start a workflow with one condition task(B) which is forbidden when one fake predecessor task(A) run fatal") void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runFatal() { - final String yaml = "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; + final String yaml = + "/it/start/workflow_with_one_forbidden_condition_task_with_one_fake_predecessor_fatal.yaml"; final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition parentWorkflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(parentWorkflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1818,19 +1598,16 @@ void testStartWorkflow_with_oneForbiddenConditionTaskWithOneFakePredecessor_runF .atMost(Duration.ofMinutes(1)) .untilAsserted(() -> { Assertions - .assertThat(repository - .queryWorkflowInstance(workflowInstanceId)) + .assertThat(repository.queryWorkflowInstance(workflowInstanceId)) .matches( - workflowInstance -> workflowInstance - .getState() == WorkflowExecutionStatus.FAILURE); + workflowInstance -> workflowInstance.getState() == WorkflowExecutionStatus.FAILURE); Assertions .assertThat(repository.queryTaskInstance(workflowInstanceId)) .hasSize(1) .satisfiesExactly(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); }); masterContainer.assertAllResourceReleased(); @@ -1848,8 +1625,7 @@ public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1863,17 +1639,14 @@ public void testTaskFail_with_workerGroupNotFoundAndTimeoutEnabled() { .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); }); masterContainer.assertAllResourceReleased(); @@ -1890,8 +1663,7 @@ public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDi final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1905,22 +1677,18 @@ public void testTaskRemainsSubmittedSuccess_with_workerGroupNotFoundAndTimeoutDi .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("workerGroupNotFound"); - assertThat(taskInstance.getState()).isEqualTo( - TaskExecutionStatus.SUBMITTED_SUCCESS); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("workerGroupNotFound"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); }); - // This test intentionally leaves the workflow running, so we skip the resource - // cleanup check. + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. // masterContainer.assertAllResourceReleased(); } @@ -1936,8 +1704,7 @@ public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1951,17 +1718,14 @@ public void testTaskFail_with_noAvailableWorkerAndTimeoutEnabled() { .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("default"); - assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.FAILURE); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.FAILURE)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.FAILURE)); }); masterContainer.assertAllResourceReleased(); @@ -1978,8 +1742,7 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa final WorkflowTestCaseContext context = workflowTestCaseContextFactory.initializeContextFromYaml(yaml); final WorkflowDefinition workflow = context.getOneWorkflow(); - final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO - .builder() + final WorkflowOperator.WorkflowTriggerDTO workflowTriggerDTO = WorkflowOperator.WorkflowTriggerDTO.builder() .workflowDefinition(workflow) .runWorkflowCommandParam(new RunWorkflowCommandParam()) .build(); @@ -1993,24 +1756,21 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa .hasSize(1) .anySatisfy(taskInstance -> { assertThat(taskInstance.getName()).isEqualTo("A"); - assertThat(taskInstance.getWorkerGroup()) - .isEqualTo("default"); - assertThat(taskInstance.getState()).isEqualTo( - TaskExecutionStatus.SUBMITTED_SUCCESS); + assertThat(taskInstance.getWorkerGroup()).isEqualTo("default"); + assertThat(taskInstance.getState()).isEqualTo(TaskExecutionStatus.SUBMITTED_SUCCESS); }); Assertions .assertThat(repository.queryWorkflowInstance(workflow)) - .satisfiesExactly(workflowInstance -> assertThat( - workflowInstance.getState()) - .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); }); - // This test intentionally leaves the workflow running, so we skip the resource - // cleanup check. + // This test intentionally leaves the workflow running, so we skip the resource cleanup check. // masterContainer.assertAllResourceReleased(); } + @Test @DisplayName("Test start a workflow which contains a dep task with timeout warn strategy") public void testStartWorkflow_withTimeoutWarnTask() { @@ -2084,4 +1844,5 @@ public void testStartWorkflow_withTimeoutWarnFailedTask() { masterContainer.assertAllResourceReleased(); } + } From 928a0daf50a310b4131e378a84ba5e8373303431 Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Fri, 27 Feb 2026 08:29:03 +0530 Subject: [PATCH 6/7] Extra Space Has been removed --- .../server/master/integration/cases/WorkflowStartTestCase.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index 8371f2bbd806..d95700b7e7c8 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -1770,7 +1770,6 @@ public void testTaskRemainsSubmittedSuccess_with_noAvailableWorkerAndTimeoutDisa // masterContainer.assertAllResourceReleased(); } - @Test @DisplayName("Test start a workflow which contains a dep task with timeout warn strategy") public void testStartWorkflow_withTimeoutWarnTask() { From 97e9a4765298608b34baaa35ec1b488ca1bd8bbb Mon Sep 17 00:00:00 2001 From: shrihari7396 Date: Mon, 2 Mar 2026 12:21:45 +0530 Subject: [PATCH 7/7] Add DB assertion for alert event in timeout warn failed workflow test --- .../integration/cases/WorkflowStartTestCase.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java index d95700b7e7c8..4fc7834249ff 100644 --- a/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java +++ b/dolphinscheduler-master/src/test/java/org/apache/dolphinscheduler/server/master/integration/cases/WorkflowStartTestCase.java @@ -1801,6 +1801,11 @@ public void testStartWorkflow_withTimeoutWarnTask() { assertThat(taskInstance.getState()) .isEqualTo(TaskExecutionStatus.RUNNING_EXECUTION); }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.RUNNING_EXECUTION)); }); // This test intentionally leaves the workflow running, so we skip the resource // cleanup check. @@ -1837,8 +1842,13 @@ public void testStartWorkflow_withTimeoutWarnFailedTask() { assertThat(taskInstance.getName()).isEqualTo( "dep_task_with_timeout_warnfailed"); assertThat(taskInstance.getState()) - .isEqualTo(TaskExecutionStatus.FAILURE); + .isEqualTo(TaskExecutionStatus.KILL); }); + + Assertions + .assertThat(repository.queryWorkflowInstance(workflow)) + .satisfiesExactly(workflowInstance -> assertThat(workflowInstance.getState()) + .isEqualTo(WorkflowExecutionStatus.STOP)); }); masterContainer.assertAllResourceReleased();