package alien4cloud.paas.wf;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import alien4cloud.paas.plan.ToscaNodeLifecycleConstants;
import alien4cloud.paas.wf.util.WorkflowUtils;
import alien4cloud.paas.wf.validation.StateSequenceValidation;
@Slf4j
public class StateSequenceValidationTest extends AbstractValidationTest<StateSequenceValidation> {
private StateSequenceValidation rule = new StateSequenceValidation();
@Override
protected StateSequenceValidation getRule() {
return rule;
}
/**
* a_ini -- a_cre
*/
@Test
public void testSimple() {
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
WorkflowUtils.linkSteps(a_ini, a_cre);
processValidation(false, 0);
}
/**
* a_cre -- a_ini
*/
@Test
public void testSimpleBadOrderFail() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
WorkflowUtils.linkSteps(a_cre, a_ini);
processValidation(true, 1);
}
/**
* a_cre -- b_ini
*/
@Test
public void testSimple2Nodes() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
AbstractStep b_ini = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.INITIAL);
WorkflowUtils.linkSteps(a_cre, b_ini);
processValidation(false, 0);
}
/**
* <pre>
* -- a_cre --
* / \
* --- --
* \ /
* -- a_ini --
* </pre>
*/
@Test
public void testSimpleParallelFail() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
processValidation(true, 1);
}
/**
* a_ini -- step2 -- a_cre
*/
@Test
public void testSimpleMixed() {
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
SimpleStep step2 = wf.addStep(new SimpleStep("step2"));
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
WorkflowUtils.linkSteps(a_ini, step2);
WorkflowUtils.linkSteps(step2, a_cre);
processValidation(false, 0);
}
/**
* <pre>
* -- a_ini -- -- step3
* / \ /
* step1 a_cre
* \ / \
* -- step2 -- -- a_con
* </pre>
*/
@Test
public void testComplexe() {
SimpleStep step1 = wf.addStep(new SimpleStep("step1"));
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
SimpleStep step2 = wf.addStep(new SimpleStep("step2"));
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
SimpleStep step3 = wf.addStep(new SimpleStep("step3"));
AbstractStep a_con = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CONFIGURING);
WorkflowUtils.linkSteps(step1, a_ini);
WorkflowUtils.linkSteps(step1, step2);
WorkflowUtils.linkSteps(a_ini, a_cre);
WorkflowUtils.linkSteps(step2, a_cre);
WorkflowUtils.linkSteps(a_cre, step3);
WorkflowUtils.linkSteps(a_cre, a_con);
processValidation(false, 0);
}
/**
* <pre>
* -- a_ini -- -- step3
* / \ /
* step1 a_con
* \ / \
* -- step2 -- -- a_cre
* </pre>
*/
@Test
public void testComplexeFailure() {
SimpleStep step1 = wf.addStep(new SimpleStep("step1"));
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
SimpleStep step2 = wf.addStep(new SimpleStep("step2"));
AbstractStep a_con = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CONFIGURING);
SimpleStep step3 = wf.addStep(new SimpleStep("step3"));
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATING);
WorkflowUtils.linkSteps(step1, a_ini);
WorkflowUtils.linkSteps(step1, step2);
WorkflowUtils.linkSteps(a_ini, a_con);
WorkflowUtils.linkSteps(step2, a_con);
WorkflowUtils.linkSteps(a_con, step3);
WorkflowUtils.linkSteps(a_con, a_cre);
processValidation(true, 1);
}
/**
* <pre>
* -- a_cre --- a_con --- a_sta
* /
* /
* /
* -- b_cre --- b_con --- b_sta
* </pre>
*/
@Test
public void testComplexe2Nodes() {
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep a_con = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep a_sta = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.STARTED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_sta = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.STARTED);
WorkflowUtils.linkSteps(a_cre, a_con);
WorkflowUtils.linkSteps(a_con, a_sta);
WorkflowUtils.linkSteps(b_cre, b_con);
WorkflowUtils.linkSteps(b_con, b_sta);
WorkflowUtils.linkSteps(b_cre, a_con);
processValidation(false, 0);
}
/**
* <pre>
* -- a_cre --- b_con --
*
* -- b_cre --- b_sta --
* </pre>
*/
@Test
public void testParallel() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_sta = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.STARTED);
WorkflowUtils.linkSteps(a_cre, b_con);
WorkflowUtils.linkSteps(b_cre, b_sta);
processValidation(true, 1);
}
/**
* <pre>
* / -- a_cre --- b_con
* / / \
* o / \ o
* \ / \ /
* \ -- b_cre ------- b_sta /
* </pre>
*/
@Test()
public void test3() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_sta = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.STARTED);
WorkflowUtils.linkSteps(a_cre, b_con);
WorkflowUtils.linkSteps(b_cre, b_sta);
WorkflowUtils.linkSteps(b_cre, b_con);
WorkflowUtils.linkSteps(b_con, b_sta);
processValidation(false, 0);
}
/**
* <pre>
* / -- a_cre --- b_con --
* / / \
* o / o
* \ / /
* \ -- b_cre ------- b_sta /
* </pre>
*/
@Test
public void test33() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_sta = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.STARTED);
WorkflowUtils.linkSteps(a_cre, b_con);
WorkflowUtils.linkSteps(b_cre, b_sta);
WorkflowUtils.linkSteps(b_cre, b_con);
processValidation(true, 1);
}
/**
* <pre>
* / -- a_cre --- a_ini ---
* / / \
* o / o
* \ / /
* \ -- b_cre ---- b_ini ---/
* </pre>
*/
@Test
public void test2errors() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep a_ini = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.INITIAL);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_init = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.INITIAL);
WorkflowUtils.linkSteps(a_cre, a_ini);
WorkflowUtils.linkSteps(b_cre, b_init);
WorkflowUtils.linkSteps(b_cre, a_ini);
processValidation(true, 2);
}
/**
* <pre>
* / -- a_cre --- a_con --
* / / \
* o / o
* \ / /
* \ -- b_cre ------- b_con /
* </pre>
*/
@Test()
public void test333() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep a_con = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
WorkflowUtils.linkSteps(a_cre, a_con);
WorkflowUtils.linkSteps(b_cre, b_con);
WorkflowUtils.linkSteps(b_cre, a_con);
processValidation(false, 0);
}
/**
* <pre>
* / -- a_cre --- a_con --
* / / \
* o / \
* \ / \
* \ -- b_cre --- b_con -- b_sta --- o
* </pre>
*/
@Test()
public void test3333() {
AbstractStep a_cre = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CREATED);
AbstractStep a_con = buildStateStep(wf, "nodeA", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_cre = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CREATED);
AbstractStep b_con = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.CONFIGURED);
AbstractStep b_sta = buildStateStep(wf, "nodeB", ToscaNodeLifecycleConstants.STARTED);
WorkflowUtils.linkSteps(a_cre, a_con);
WorkflowUtils.linkSteps(b_cre, b_con);
WorkflowUtils.linkSteps(b_cre, a_con);
WorkflowUtils.linkSteps(b_con, b_sta);
WorkflowUtils.linkSteps(a_con, b_sta);
processValidation(false, 0);
}
private NodeActivityStep buildStateStep(Workflow wf, String nodeId, String stateName) {
NodeActivityStep step = new NodeActivityStep();
step.setNodeId(nodeId);
SetStateActivity activity = new SetStateActivity();
activity.setNodeId(nodeId);
activity.setStateName(stateName);
step.setActivity(activity);
step.setName(WorkflowUtils.buildStepName(wf, step, 0));
return wf.addStep(step);
}
}