|
24 | 24 |
|
25 | 25 | package org.jenkinsci.plugins.workflow.graph; |
26 | 26 |
|
| 27 | +import hudson.model.BallColor; |
| 28 | +import hudson.model.Result; |
| 29 | + |
27 | 30 | import java.lang.reflect.Method; |
28 | 31 | import java.text.MessageFormat; |
29 | 32 | import java.util.ArrayList; |
|
38 | 41 | import org.jenkinsci.plugins.workflow.flow.FlowExecution; |
39 | 42 | import org.jenkinsci.plugins.workflow.graphanalysis.DepthFirstScanner; |
40 | 43 | import org.jenkinsci.plugins.workflow.graphanalysis.FlowScanningUtils; |
| 44 | +import org.jenkinsci.plugins.workflow.graphanalysis.NodeStepTypePredicate; |
41 | 45 | import org.jenkinsci.plugins.workflow.job.WorkflowJob; |
42 | 46 | import org.jenkinsci.plugins.workflow.job.WorkflowRun; |
43 | 47 | import org.jenkinsci.plugins.workflow.test.steps.SemaphoreStep; |
44 | 48 | import org.junit.Ignore; |
45 | 49 | import org.junit.Test; |
46 | 50 |
|
| 51 | +import static org.hamcrest.Matchers.hasSize; |
47 | 52 | import static org.junit.Assert.*; |
48 | 53 | import org.junit.Rule; |
49 | 54 | import org.junit.runners.model.Statement; |
50 | 55 | import org.jvnet.hudson.test.Issue; |
51 | 56 | import org.jvnet.hudson.test.LoggerRule; |
| 57 | +import org.jvnet.hudson.test.JenkinsRule; |
52 | 58 | import org.jvnet.hudson.test.RestartableJenkinsRule; |
53 | 59 |
|
54 | 60 | public class FlowNodeTest { |
55 | 61 |
|
56 | 62 | @Rule public RestartableJenkinsRule rr = new RestartableJenkinsRule(); |
| 63 | + @Rule public JenkinsRule r = new JenkinsRule(); |
57 | 64 | @Rule public LoggerRule logging = new LoggerRule().record(FlowNode.class, Level.FINER); |
58 | 65 |
|
59 | 66 | @Issue("JENKINS-38223") |
@@ -408,6 +415,27 @@ public void evaluate() throws Throwable { |
408 | 415 | }); |
409 | 416 | } |
410 | 417 |
|
| 418 | + @Test public void useAbortedStatusWhenFailFast() throws Exception { |
| 419 | + WorkflowJob job = r.jenkins.createProject(WorkflowJob.class, "p"); |
| 420 | + job.setDefinition(new CpsFlowDefinition( |
| 421 | + "jobs = [failFast:true]\n" + |
| 422 | + "jobs['one'] = {\n" + |
| 423 | + " sleep 5\n" + |
| 424 | + "}\n" + |
| 425 | + "jobs['two'] = {\n" + |
| 426 | + " error 'failing'\n" + |
| 427 | + "}\n" + |
| 428 | + "parallel jobs", true)); |
| 429 | + WorkflowRun b = r.assertBuildStatus(Result.FAILURE, job.scheduleBuild2(0).get()); |
| 430 | + |
| 431 | + List<FlowNode> coreStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), new NodeStepTypePredicate("sleep")); |
| 432 | + assertThat(coreStepNodes, hasSize(1)); |
| 433 | + assertEquals("sleep", coreStepNodes.get(0).getDisplayFunctionName()); |
| 434 | + assertNotNull(coreStepNodes.get(0).getError()); |
| 435 | + assertNotNull(coreStepNodes.get(0).getError().getError()); |
| 436 | + assertEquals(BallColor.ABORTED, coreStepNodes.get(0).getIconColor()); |
| 437 | + } |
| 438 | + |
411 | 439 | private void assertExpectedEnclosing(FlowExecution execution, String nodeId, String enclosingId) throws Exception { |
412 | 440 | FlowNode node = execution.getNode(nodeId); |
413 | 441 | assertNotNull(node); |
|
0 commit comments