/*
* Copyright 2014 Effektif GmbH.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.effektif.workflow.test.api;
import com.effektif.workflow.api.activities.NoneTask;
import com.effektif.workflow.api.activities.ReceiveTask;
import com.effektif.workflow.api.activities.SubProcess;
import com.effektif.workflow.api.model.Message;
import com.effektif.workflow.api.model.TriggerInstance;
import com.effektif.workflow.api.query.WorkflowInstanceQuery;
import com.effektif.workflow.api.types.TextType;
import com.effektif.workflow.api.workflow.ExecutableWorkflow;
import com.effektif.workflow.api.workflowinstance.ActivityInstance;
import com.effektif.workflow.api.workflowinstance.WorkflowInstance;
import com.effektif.workflow.test.WorkflowTest;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
/**
* @author Tom Baeyens
*/
public class SubProcessTest extends WorkflowTest {
@Test
public void testCallActivity() {
ExecutableWorkflow subWorkflow = new ExecutableWorkflow()
.activity("subtask", new ReceiveTask());
deploy(subWorkflow);
ExecutableWorkflow superWorkflow = new ExecutableWorkflow()
.activity("call", new SubProcess()
.subWorkflowId(subWorkflow.getId()));
deploy(superWorkflow);
WorkflowInstance superInstance = start(superWorkflow);
ActivityInstance callActivityInstance = superInstance.findOpenActivityInstance("call");
assertNotNull(callActivityInstance.getCalledWorkflowInstanceId());
WorkflowInstance subInstance = workflowEngine.findWorkflowInstances(new WorkflowInstanceQuery()
.workflowInstanceId(callActivityInstance.getCalledWorkflowInstanceId()))
.get(0);
assertNotNull(subInstance);
ActivityInstance subtaskInstance = subInstance.findOpenActivityInstance("subtask");
subInstance = workflowEngine.send(new Message()
.workflowInstanceId(subInstance.getId())
.activityInstanceId(subtaskInstance.getId()));
assertTrue(subInstance.isEnded());
superInstance = workflowEngine.findWorkflowInstances(new WorkflowInstanceQuery()
.workflowInstanceId(superInstance.getId()))
.get(0);
assertTrue(superInstance.isEnded());
}
@Test
public void testTwoCallActivitiesInSequence() {
ExecutableWorkflow subWorkflow = new ExecutableWorkflow()
.activity("auto", new NoneTask());
deploy(subWorkflow);
ExecutableWorkflow superWorkflow = new ExecutableWorkflow()
.activity("call1", new SubProcess()
.subWorkflowId(subWorkflow.getId())
.transitionToNext())
.activity("call2", new SubProcess()
.subWorkflowId(subWorkflow.getId()));
deploy(superWorkflow);
WorkflowInstance superInstance = start(superWorkflow);
assertTrue(superInstance.isEnded());
List<WorkflowInstance> workflowInstances = workflowEngine.findWorkflowInstances(new WorkflowInstanceQuery());
for (WorkflowInstance workflowInstance: workflowInstances) {
assertTrue(workflowInstance.isEnded());
}
assertEquals(3, workflowInstances.size());
}
@Test
public void testTwoCallActivitiesInParallel() {
ExecutableWorkflow subWorkflow = new ExecutableWorkflow()
.activity("auto", new NoneTask());
deploy(subWorkflow);
ExecutableWorkflow superWorkflow = new ExecutableWorkflow()
.activity("call1", new SubProcess()
.subWorkflowId(subWorkflow.getId()))
.activity("call2", new SubProcess()
.subWorkflowId(subWorkflow.getId()));
deploy(superWorkflow);
WorkflowInstance superInstance = start(superWorkflow);
assertTrue(superInstance.isEnded());
List<WorkflowInstance> workflowInstances = workflowEngine.findWorkflowInstances(new WorkflowInstanceQuery());
for (WorkflowInstance workflowInstance: workflowInstances) {
assertTrue(workflowInstance.isEnded());
}
assertEquals(3, workflowInstances.size());
}
@Test
public void testCallActivityInputValue() {
ExecutableWorkflow subWorkflow = new ExecutableWorkflow()
.variable("performer", TextType.INSTANCE)
.activity("message", msgExpression("performer"));
deploy(subWorkflow);
ExecutableWorkflow superWorkflow = new ExecutableWorkflow()
.activity("call", new SubProcess()
.inputValue("performer", "walter")
.subWorkflowId(subWorkflow.getId()));
deploy(superWorkflow);
start(superWorkflow);
assertEquals("walter", getMessage(0));
}
@Test
public void testCallActivityInputBindingVariable() {
ExecutableWorkflow subWorkflow = new ExecutableWorkflow()
.variable("performer", TextType.INSTANCE)
.activity("subtask", msgExpression("performer"));
deploy(subWorkflow);
ExecutableWorkflow superWorkflow = new ExecutableWorkflow()
.variable("guineapig", TextType.INSTANCE)
.activity("call", new SubProcess()
.inputExpression("performer", "guineapig")
.subWorkflowId(subWorkflow.getId()));
deploy(superWorkflow);
workflowEngine.start(new TriggerInstance()
.workflowId(superWorkflow.getId())
.data("guineapig", "walter")
);
assertEquals("walter", getMessage(0));
}
@Test
public void testNestedSubprocesses() {
ExecutableWorkflow innerWorkflow = new ExecutableWorkflow()
.activity("inner", msgValue("inner"));
deploy(innerWorkflow);
ExecutableWorkflow intermediateWorkflow = new ExecutableWorkflow()
.activity("intermediate before inner", msgValue("intermediate before inner").transitionToNext())
.activity("call-inner", new SubProcess()
.subWorkflowId(innerWorkflow.getId())
.transitionToNext())
.activity("intermediate after inner", msgValue("intermediate after inner"));
deploy(intermediateWorkflow);
ExecutableWorkflow outerWorkflow = new ExecutableWorkflow()
.activity("outer before intermediate", msgValue("outer before intermediate").transitionToNext())
.activity("call-intermediate", new SubProcess()
.subWorkflowId(intermediateWorkflow.getId())
.transitionToNext())
.activity("outer after intermediate", msgValue("outer after intermediate"));
deploy(outerWorkflow);
workflowEngine.start(new TriggerInstance()
.workflowId(outerWorkflow.getId())
);
List<String> expectedMessages = new ArrayList<>();
expectedMessages.add("outer before intermediate");
expectedMessages.add("intermediate before inner");
expectedMessages.add("inner");
expectedMessages.add("intermediate after inner");
expectedMessages.add("outer after intermediate");
assertEquals(expectedMessages, getMessages());
}
}