package alien4cloud.paas.wf;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import alien4cloud.paas.wf.util.WorkflowUtils;
import alien4cloud.paas.wf.validation.CycleDetection;
@Slf4j
public class CycleDetectionTest extends AbstractValidationTest<CycleDetection> {
private CycleDetection cycleDetectionRule = new CycleDetection();
@Override
protected CycleDetection getRule() {
return cycleDetectionRule;
}
/**
* <pre>
*
* a -- b
*
* </pre>
*/
@Test
public void testNoCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
WorkflowUtils.linkSteps(a, b);
processValidation(false, 0);
}
/**
* <pre>
*
* /--|
* a -- b |
* \--|
*
* </pre>
*/
@Test()
public void testAutoCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, b);
processValidation(true, 1);
}
/**
* <pre>
* --
* / \
* a b
* \ /
* --
* </pre>
*/
@Test
public void test2StepsCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, a);
processValidation(true, 1);
}
/**
* <pre>
*
* o --- c --- d
*
* --
* / \
* a b
* \ /
* --
* </pre>
*/
@Test
public void testOrphanCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
SimpleStep d = wf.addStep(new SimpleStep("d"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, a);
WorkflowUtils.linkSteps(c, d);
processValidation(true, 1);
}
/**
* <pre>
* --
* / \
* a -- b c
* \ /
* --
* </pre>
*/
@Test
public void testIndirectCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, c);
WorkflowUtils.linkSteps(c, b);
processValidation(true, 1);
}
/**
* <pre>
* -- b
* /
* a --
* \
* -- c -- d -- e
* </pre>
*/
@Test
public void testForkJoinNoCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
SimpleStep d = wf.addStep(new SimpleStep("d"));
SimpleStep e = wf.addStep(new SimpleStep("e"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(a, c);
WorkflowUtils.linkSteps(c, d);
WorkflowUtils.linkSteps(d, e);
processValidation(false, 0);
}
/**
* <pre>
* -- b
* /
* a -- e
* \ / \
* -- c -- d --
* </pre>
*/
@Test()
public void testForkJoinCycle() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
SimpleStep d = wf.addStep(new SimpleStep("d"));
SimpleStep e = wf.addStep(new SimpleStep("e"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(a, c);
WorkflowUtils.linkSteps(c, d);
WorkflowUtils.linkSteps(d, e);
WorkflowUtils.linkSteps(e, c);
processValidation(true, 1);
}
/**
* <pre>
* --- c
* / \
* -- b ----- d
* /
* a -- f
* \ / \
* -- e -- g
*
* </pre>
*/
@Test()
public void testTwoParallelCycles() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
SimpleStep d = wf.addStep(new SimpleStep("d"));
SimpleStep e = wf.addStep(new SimpleStep("e"));
SimpleStep f = wf.addStep(new SimpleStep("f"));
SimpleStep g = wf.addStep(new SimpleStep("g"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, c);
WorkflowUtils.linkSteps(c, d);
WorkflowUtils.linkSteps(d, b);
WorkflowUtils.linkSteps(a, e);
WorkflowUtils.linkSteps(a, e);
WorkflowUtils.linkSteps(e, f);
WorkflowUtils.linkSteps(f, g);
WorkflowUtils.linkSteps(g, e);
processValidation(true, 2);
}
/**
* <pre>
*
* c f
* / \ / \
* a -- b -- d -- e -- g
*
* </pre>
*/
@Test()
public void testTwoSequencedCycles() {
SimpleStep a = wf.addStep(new SimpleStep("a"));
SimpleStep b = wf.addStep(new SimpleStep("b"));
SimpleStep c = wf.addStep(new SimpleStep("c"));
SimpleStep d = wf.addStep(new SimpleStep("d"));
SimpleStep e = wf.addStep(new SimpleStep("e"));
SimpleStep f = wf.addStep(new SimpleStep("f"));
SimpleStep g = wf.addStep(new SimpleStep("g"));
WorkflowUtils.linkSteps(a, b);
WorkflowUtils.linkSteps(b, d);
WorkflowUtils.linkSteps(d, c);
WorkflowUtils.linkSteps(c, b);
WorkflowUtils.linkSteps(d, e);
WorkflowUtils.linkSteps(e, g);
WorkflowUtils.linkSteps(g, f);
WorkflowUtils.linkSteps(f, e);
processValidation(true, 2);
}
}