package ee.telekom.workflow.executor; import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import ee.telekom.workflow.TestApplicationContexts; import ee.telekom.workflow.core.abort.AbortService; import ee.telekom.workflow.core.retry.RetryService; import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceService; import ee.telekom.workflow.core.workflowinstance.WorkflowInstanceStatus; import ee.telekom.workflow.core.workunit.WorkType; import ee.telekom.workflow.graph.Graph; import ee.telekom.workflow.graph.GraphFactory; import ee.telekom.workflow.graph.GraphRepository; import ee.telekom.workflow.graph.RecordPathScript; import ee.telekom.workflow.graph.WorkItemStatus; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = TestApplicationContexts.DEFAULT) @DirtiesContext public class OneHumanTaskIT extends AbstractWorkflowIT{ @Autowired private WorkflowInstanceService workflowInstanceService; @Autowired private AbortService abortService; @Autowired private RetryService retryService; @Autowired private WorkflowExecutor executor; @Autowired private GraphEngineFactory engineFactory; @Test public void start_complete(){ Graph graph = GraphFactory.INSTANCE.human_task_one_pre_post(); GraphRepository repo = engineFactory.getSingletonInstance().getRepository(); repo.addGraph( graph ); String name = graph.getName(); Integer version = graph.getVersion(); Map<String, Object> envMap; long woinRefNum = workflowInstanceService.create( name, version, INITIAL_ENV, LABEL1, LABEL2 ).getRefNum(); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, null, false ); simulatePollLockAssign( woinRefNum, WorkType.START_WORKFLOW, null ); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, config.getNodeName(), true ); executor.startWorkflow( woinRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1" ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, null, false ); assertActiveWoitsCount( woinRefNum, 1 ); long woitRefNum = getActiveWoitRefNum( woinRefNum, 1 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.NEW, ROLE, USER, HUMAN_TASK_ARGUMENTS, null ); submitHumanTask( woitRefNum, HUMAN_TASK_RESULT ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); simulatePollLockAssign( woinRefNum, WorkType.COMPLETE_WORK_ITEM, woitRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, config.getNodeName(), true ); executor.completeWorkItem( woinRefNum, woitRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1,3", RESULT_KEY, HUMAN_TASK_RESULT ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTED, null, false ); assertActiveWoitsCount( woinRefNum, 0 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.COMPLETED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); } @Test public void start_complete_error_retry_complete(){ Graph graph = GraphFactory.INSTANCE.human_task_one_pre_post(); GraphRepository repo = engineFactory.getSingletonInstance().getRepository(); repo.addGraph( graph ); String name = graph.getName(); Integer version = graph.getVersion(); Map<String, Object> envMap; long woinRefNum = workflowInstanceService.create( name, version, INITIAL_ENV, LABEL1, LABEL2 ).getRefNum(); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, null, false ); simulatePollLockAssign( woinRefNum, WorkType.START_WORKFLOW, null ); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, config.getNodeName(), true ); executor.startWorkflow( woinRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1" ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, null, false ); assertActiveWoitsCount( woinRefNum, 1 ); long woitRefNum = getActiveWoitRefNum( woinRefNum, 1 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.NEW, ROLE, USER, HUMAN_TASK_ARGUMENTS, null ); submitHumanTask( woitRefNum, HUMAN_TASK_RESULT ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); simulatePollLockAssign( woinRefNum, WorkType.COMPLETE_WORK_ITEM, woitRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, config.getNodeName(), true ); RecordPathScript.startThrowingException(); executor.completeWorkItem( woinRefNum, woitRefNum ); RecordPathScript.stopThrowingException(); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING_ERROR, config.getNodeName(), true ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.COMPLETING_ERROR, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); assertExer( woinRefNum, woitRefNum, RecordPathScript.EXCEPTION_MESSAGE ); retryService.retry( woinRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, null, false ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); assertNoExer( woinRefNum ); simulatePollLockAssign( woinRefNum, WorkType.COMPLETE_WORK_ITEM, woitRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, config.getNodeName(), true ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); executor.completeWorkItem( woinRefNum, woitRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1,3", RESULT_KEY, HUMAN_TASK_RESULT ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTED, null, false ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.COMPLETED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); assertActiveWoitsCount( woinRefNum, 0 ); } @Test public void start_abort(){ Graph graph = GraphFactory.INSTANCE.human_task_one_pre_post(); GraphRepository repo = engineFactory.getSingletonInstance().getRepository(); repo.addGraph( graph ); String name = graph.getName(); Integer version = graph.getVersion(); Map<String, Object> envMap; long woinRefNum = workflowInstanceService.create( name, version, INITIAL_ENV, LABEL1, LABEL2 ).getRefNum(); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, null, false ); simulatePollLockAssign( woinRefNum, WorkType.START_WORKFLOW, null ); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, config.getNodeName(), true ); executor.startWorkflow( woinRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1" ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, null, false ); assertActiveWoitsCount( woinRefNum, 1 ); long woitRefNum = getActiveWoitRefNum( woinRefNum, 1 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.NEW, ROLE, USER, HUMAN_TASK_ARGUMENTS, null ); submitHumanTask( woitRefNum, HUMAN_TASK_RESULT ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); abortService.abort( woinRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORT, null, false ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); simulatePollLockAssign( woinRefNum, WorkType.ABORT_WORKFLOW, null ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORT, config.getNodeName(), true ); executor.abortWorkflow( woinRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORTED, null, false ); assertActiveWoitsCount( woinRefNum, 0 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.CANCELLED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); } @Test public void start_complete_error_abort(){ Graph graph = GraphFactory.INSTANCE.human_task_one_pre_post(); GraphRepository repo = engineFactory.getSingletonInstance().getRepository(); repo.addGraph( graph ); String name = graph.getName(); Integer version = graph.getVersion(); Map<String, Object> envMap; long woinRefNum = workflowInstanceService.create( name, version, INITIAL_ENV, LABEL1, LABEL2 ).getRefNum(); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, null, false ); simulatePollLockAssign( woinRefNum, WorkType.START_WORKFLOW, null ); assertWoin( woinRefNum, name, version, INITIAL_ENV, true, LABEL1, LABEL2, WorkflowInstanceStatus.NEW, config.getNodeName(), true ); executor.startWorkflow( woinRefNum ); envMap = createMap( INITIAL_ARGUMENT_KEY, INITIAL_ARGUMENT_VALUE, "path", "1" ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, null, false ); assertActiveWoitsCount( woinRefNum, 1 ); long woitRefNum = getActiveWoitRefNum( woinRefNum, 1 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.NEW, ROLE, USER, HUMAN_TASK_ARGUMENTS, null ); submitHumanTask( woitRefNum, HUMAN_TASK_RESULT ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); simulatePollLockAssign( woinRefNum, WorkType.COMPLETE_WORK_ITEM, woitRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING, config.getNodeName(), true ); RecordPathScript.startThrowingException(); executor.completeWorkItem( woinRefNum, woitRefNum ); RecordPathScript.stopThrowingException(); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.EXECUTING_ERROR, config.getNodeName(), true ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.COMPLETING_ERROR, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); assertExer( woinRefNum, woitRefNum, RecordPathScript.EXCEPTION_MESSAGE ); abortService.abort( woinRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORT, null, false ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); simulatePollLockAssign( woinRefNum, WorkType.ABORT_WORKFLOW, null ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORT, config.getNodeName(), true ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.EXECUTED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); executor.abortWorkflow( woinRefNum ); assertWoin( woinRefNum, name, version, envMap, false, LABEL1, LABEL2, WorkflowInstanceStatus.ABORTED, null, false ); assertActiveWoitsCount( woinRefNum, 0 ); assertHumanTaskWoit( woitRefNum, woinRefNum, 1, WorkItemStatus.CANCELLED, ROLE, USER, HUMAN_TASK_ARGUMENTS, HUMAN_TASK_RESULT ); } }