From be240968327a3594248d9f9838fce8a04f3b5824 Mon Sep 17 00:00:00 2001 From: Stuart Rowe Date: Sat, 31 May 2025 01:12:19 -0700 Subject: [PATCH 1/5] Consider findWorstWarningBetween for branches of running builds --- .../pipelinegraphview/analysis/StatusAndTiming.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTiming.java b/src/main/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTiming.java index 38f318b69..6154e5587 100644 --- a/src/main/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTiming.java +++ b/src/main/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTiming.java @@ -282,7 +282,12 @@ public static GenericStatus computeChunkStatus2( && lastNode instanceof BlockEndNode) { // Check to see if all the action is on other branches BlockStartNode start = ((BlockEndNode) lastNode).getStartNode(); if (start.getAction(ThreadNameAction.class) != null) { - return (lastNode.getError() == null) ? GenericStatus.SUCCESS : GenericStatus.FAILURE; + GenericStatus status = GenericStatus.SUCCESS; + WarningAction warningAction = findWorstWarningBetween(start, lastNode); + if (warningAction != null) { + status = GenericStatus.fromResult(warningAction.getResult()); + } + return (lastNode.getError() != null) ? GenericStatus.FAILURE : status; } } From 8998bd0749c2499f4057e74e0d358a155b37ab2a Mon Sep 17 00:00:00 2001 From: Stuart Rowe Date: Sat, 31 May 2025 18:19:24 -0700 Subject: [PATCH 2/5] Add test case for GH Issue#794 --- .../analysis/StatusAndTimingTest.java | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java index 1dd6e1128..4eccabc42 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java @@ -364,6 +364,201 @@ void testBasicParallelFail() throws Exception { assertEquals(totalBranchTiming, finalTiming.getTotalDurationMillis()); } + @Issue("GH#794") + @Test + void testParallelFailInProgress() throws Exception { + WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, "Fails"); + job.setDefinition(new CpsFlowDefinition( + """ + pipeline { + agent any + stages { + stage('Tests') { + parallel { + stage('Failure caught') { + steps { + catchError(buildResult: 'SUCCESS', catchInterruptions: false, stageResult: 'FAILURE') { + sh 'exit 1' + } + } + } + stage('Fails') { + steps { + sh 'exit 1' + } + } + stage('Passes') { + steps { + sh 'sleep 10s' + } + } + } + } + } + post { + always { + semaphore 'wait' + } + } + } + """, + true)); + + /* + Node dump follows, format: + [ID]{parent,ids}(millisSinceStartOfRun) flowNodeClassName stepDisplayName [st=startId if a block end node] + Action format: + - actionClassName actionDisplayName + ------------------------------------------------------------------------------------------ + [2]{}FlowStartNode Start of Pipeline + [3]{2}StepStartNode Allocate node : Start + -LogStorageAction Console Output + -QueueItemActionImpl null + -WorkspaceActionImpl Workspace + [4]{3}StepStartNode Allocate node : Body : Start + -BodyInvocationAction null + [5]{4}StepStartNode Stage : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [6]{5}StepStartNode Tests + -BodyInvocationAction null + -LabelAction Tests + -TagsAction Tags + [7]{6}StepStartNode Execute in parallel : Start + -LogStorageAction Console Output + [10]{7}StepStartNode Branch: Failure caught + -BodyInvocationAction null + -ParallelLabelAction Branch: Failure caught + [11]{7}StepStartNode Branch: Fails + -BodyInvocationAction null + -ParallelLabelAction Branch: Fails + -TagsAction Tags + [12]{7}StepStartNode Branch: Passes + -BodyInvocationAction null + -ParallelLabelAction Branch: Passes + [13]{10}StepStartNode Stage : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [14]{13}StepStartNode Failure caught + -BodyInvocationAction null + -LabelAction Failure caught + [15]{11}StepStartNode Stage : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [16]{15}StepStartNode Fails + -BodyInvocationAction null + -LabelAction Fails + -TagsAction Tags + [17]{12}StepStartNode Stage : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [18]{17}StepStartNode Passes + -BodyInvocationAction null + -LabelAction Passes + [19]{14}StepStartNode Catch error and set build result to failure : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [20]{19}StepStartNode Catch error and set build result to failure : Body : Start + -BodyInvocationAction null + [21]{16}StepAtomNode Shell Script + -ArgumentsActionImpl null + -LogStorageAction Console Output + -ErrorAction script returned exit code 1 + [22]{18}StepAtomNode Shell Script + -ArgumentsActionImpl null + -LogStorageAction Console Output + [23]{20}StepAtomNode Shell Script + -ArgumentsActionImpl null + -LogStorageAction Console Output + -ErrorAction script returned exit code 1 + [24]{21}StepEndNode Stage : Body : End [st=16] + -BodyInvocationAction null + -ErrorAction script returned exit code 1 + [25]{24}StepEndNode Stage : End [st=15] + -ErrorAction script returned exit code 1 + [26]{25}StepEndNode Execute in parallel : Body : End [st=11] + -BodyInvocationAction null + -ErrorAction script returned exit code 1 + -LogStorageAction Console Output + [27]{23}StepEndNode Catch error and set build result to failure : Body : End [st=20] + -BodyInvocationAction null + -ErrorAction script returned exit code 1 + -LogStorageAction Console Output + -WarningAction Warning + [28]{27}StepEndNode Catch error and set build result to failure : End [st=19] + [29]{28}StepEndNode Stage : Body : End [st=14] + -BodyInvocationAction null + [30]{29}StepEndNode Stage : End [st=13] + [31]{30}StepEndNode Execute in parallel : Body : End [st=10] + -BodyInvocationAction null + [32]{22}StepEndNode Stage : Body : End [st=18] + -BodyInvocationAction null + [33]{32}StepEndNode Stage : End [st=17] + [34]{33}StepEndNode Execute in parallel : Body : End [st=12] + -BodyInvocationAction null + [35]{31,26,34}StepEndNode Execute in parallel : End [st=7] + -ErrorAction script returned exit code 1 + [36]{35}StepEndNode Stage : Body : End [st=6] + -BodyInvocationAction null + -ErrorAction script returned exit code 1 + [37]{36}StepEndNode Stage : End [st=5] + -ErrorAction script returned exit code 1 + [38]{37}StepStartNode Stage : Start + -LogStorageAction Console Output + -ArgumentsActionImpl null + [39]{38}StepStartNode Declarative: Post Actions + -BodyInvocationAction null + -LabelAction Declarative: Post Actions + -TagsAction Tags + [40]{39}StepAtomNode Test step + -ArgumentsActionImpl null + -LogStorageAction Console Output + */ + + WorkflowRun run = job.scheduleBuild2(0).waitForStart(); + SemaphoreStep.waitForStart("wait/1", run); + + FlowExecution exec = run.getExecution(); + + // Failure Caught branch + assertEquals( + GenericStatus.FAILURE, + StatusAndTiming.computeChunkStatus2( + run, exec.getNode("7"), exec.getNode("10"), exec.getNode("31"), exec.getNode("35"))); + + // Failing branch + assertEquals( + GenericStatus.FAILURE, + StatusAndTiming.computeChunkStatus2( + run, exec.getNode("7"), exec.getNode("11"), exec.getNode("26"), exec.getNode("35"))); + + // Passing branch + assertEquals( + GenericStatus.SUCCESS, + StatusAndTiming.computeChunkStatus2( + run, exec.getNode("7"), exec.getNode("12"), exec.getNode("34"), exec.getNode("35"))); + + // Check that branch statuses match + List parallelStarts = + Arrays.asList((BlockStartNode) exec.getNode("10"), (BlockStartNode) exec.getNode("11"), (BlockStartNode) + exec.getNode("12")); + List parallelEnds = Arrays.asList(exec.getNode("31"), exec.getNode("26"), exec.getNode("34")); + Map branchStatuses = StatusAndTiming.computeBranchStatuses2( + run, exec.getNode("7"), parallelStarts, parallelEnds, exec.getNode("35")); + + assertEquals(3, branchStatuses.size()); + String[] branches = {"Fails", "Failure caught", "Passes"}; + List outputBranchList = new ArrayList<>(branchStatuses.keySet()); + Collections.sort(outputBranchList); + assertArrayEquals(branches, outputBranchList.toArray()); + assertEquals(GenericStatus.FAILURE, branchStatuses.get("Fails")); + assertEquals(GenericStatus.FAILURE, branchStatuses.get("Failure caught")); + assertEquals(GenericStatus.SUCCESS, branchStatuses.get("Passes")); + + SemaphoreStep.success("wait/1", null); + j.assertBuildStatus(Result.FAILURE, run); + } + @Test void testInProgress() throws Exception { WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, "Fails"); From a15e7e53259527e78524ea2f7e400ba0da6a1751 Mon Sep 17 00:00:00 2001 From: Stuart Rowe Date: Sat, 31 May 2025 20:14:51 -0700 Subject: [PATCH 3/5] Update testInProgressParallel to better represent #794 by waiting in passing branch --- .../analysis/StatusAndTimingTest.java | 67 +++++++++---------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java index 4eccabc42..67fd4e877 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java @@ -389,17 +389,13 @@ void testParallelFailInProgress() throws Exception { } stage('Passes') { steps { - sh 'sleep 10s' + sleep 1 + semaphore 'wait' } } } } } - post { - always { - semaphore 'wait' - } - } } """, true)); @@ -464,7 +460,7 @@ void testParallelFailInProgress() throws Exception { -ArgumentsActionImpl null -LogStorageAction Console Output -ErrorAction script returned exit code 1 - [22]{18}StepAtomNode Shell Script + [22]{18}StepAtomNode Sleep -ArgumentsActionImpl null -LogStorageAction Console Output [23]{20}StepAtomNode Shell Script @@ -491,28 +487,29 @@ void testParallelFailInProgress() throws Exception { [30]{29}StepEndNode Stage : End [st=13] [31]{30}StepEndNode Execute in parallel : Body : End [st=10] -BodyInvocationAction null - [32]{22}StepEndNode Stage : Body : End [st=18] + [32]{22}StepAtomNode Test step + -ArgumentsActionImpl null + -LogStorageAction Console Output + [33]{32}StepEndNode Stage : Body : End [st=18] -BodyInvocationAction null - [33]{32}StepEndNode Stage : End [st=17] - [34]{33}StepEndNode Execute in parallel : Body : End [st=12] + [34]{33}StepEndNode Stage : End [st=17] + [35]{34}StepEndNode Execute in parallel : Body : End [st=12] -BodyInvocationAction null - [35]{31,26,34}StepEndNode Execute in parallel : End [st=7] + [36]{31,26,35}StepEndNode Execute in parallel : End [st=7] -ErrorAction script returned exit code 1 - [36]{35}StepEndNode Stage : Body : End [st=6] + [37]{36}StepEndNode Stage : Body : End [st=6] -BodyInvocationAction null -ErrorAction script returned exit code 1 - [37]{36}StepEndNode Stage : End [st=5] + [38]{37}StepEndNode Stage : End [st=5] -ErrorAction script returned exit code 1 - [38]{37}StepStartNode Stage : Start - -LogStorageAction Console Output - -ArgumentsActionImpl null - [39]{38}StepStartNode Declarative: Post Actions + [39]{38}StepEndNode Allocate node : Body : End [st=4] -BodyInvocationAction null - -LabelAction Declarative: Post Actions - -TagsAction Tags - [40]{39}StepAtomNode Test step - -ArgumentsActionImpl null - -LogStorageAction Console Output + -ErrorAction script returned exit code 1 + [40]{39}StepEndNode Allocate node : End [st=3] + -ErrorAction script returned exit code 1 + -ErrorAction script returned exit code 1 + [41]{40}FlowEndNode End of Pipeline [st=2] + -ErrorAction script returned exit code 1 */ WorkflowRun run = job.scheduleBuild2(0).waitForStart(); @@ -524,39 +521,37 @@ void testParallelFailInProgress() throws Exception { assertEquals( GenericStatus.FAILURE, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("10"), exec.getNode("31"), exec.getNode("35"))); + run, exec.getNode("7"), exec.getNode("10"), exec.getNode("31"), null)); // Failing branch assertEquals( GenericStatus.FAILURE, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("11"), exec.getNode("26"), exec.getNode("35"))); + run, exec.getNode("7"), exec.getNode("11"), exec.getNode("26"), null)); - // Passing branch + // In-progress Passing branch assertEquals( - GenericStatus.SUCCESS, + GenericStatus.IN_PROGRESS, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("12"), exec.getNode("34"), exec.getNode("35"))); + run, exec.getNode("7"), exec.getNode("12"), exec.getNode("32"), null)); // Check that branch statuses match List parallelStarts = - Arrays.asList((BlockStartNode) exec.getNode("10"), (BlockStartNode) exec.getNode("11"), (BlockStartNode) - exec.getNode("12")); - List parallelEnds = Arrays.asList(exec.getNode("31"), exec.getNode("26"), exec.getNode("34")); - Map branchStatuses = StatusAndTiming.computeBranchStatuses2( - run, exec.getNode("7"), parallelStarts, parallelEnds, exec.getNode("35")); + Arrays.asList((BlockStartNode) exec.getNode("10"), (BlockStartNode) exec.getNode("11")); + List parallelEnds = Arrays.asList(exec.getNode("31"), exec.getNode("26")); + Map branchStatuses = + StatusAndTiming.computeBranchStatuses2(run, exec.getNode("7"), parallelStarts, parallelEnds, null); - assertEquals(3, branchStatuses.size()); - String[] branches = {"Fails", "Failure caught", "Passes"}; + assertEquals(2, branchStatuses.size()); + String[] branches = {"Fails", "Failure caught"}; List outputBranchList = new ArrayList<>(branchStatuses.keySet()); Collections.sort(outputBranchList); assertArrayEquals(branches, outputBranchList.toArray()); assertEquals(GenericStatus.FAILURE, branchStatuses.get("Fails")); assertEquals(GenericStatus.FAILURE, branchStatuses.get("Failure caught")); - assertEquals(GenericStatus.SUCCESS, branchStatuses.get("Passes")); SemaphoreStep.success("wait/1", null); - j.assertBuildStatus(Result.FAILURE, run); + j.assertBuildStatus(Result.FAILURE, j.waitForCompletion(run)); } @Test From a3eda77071962d14c80c83326a6d9f5bb41cb0bd Mon Sep 17 00:00:00 2001 From: Stuart Rowe Date: Sat, 31 May 2025 20:50:06 -0700 Subject: [PATCH 4/5] Increase sleep in Passes branch to give Failing branches a chance to finish --- .../plugins/pipelinegraphview/analysis/StatusAndTimingTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java index 67fd4e877..f14adea80 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java @@ -389,7 +389,7 @@ void testParallelFailInProgress() throws Exception { } stage('Passes') { steps { - sleep 1 + sleep 2 semaphore 'wait' } } From 187d48bb013bb901fc7deaee68bde40f0eb48e00 Mon Sep 17 00:00:00 2001 From: Stuart Rowe Date: Sat, 31 May 2025 22:01:24 -0700 Subject: [PATCH 5/5] Use semaphores in all branches to coordinate test timing --- .../analysis/StatusAndTimingTest.java | 95 +++++++++++-------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java index f14adea80..4f4cf9d7f 100644 --- a/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java +++ b/src/test/java/io/jenkins/plugins/pipelinegraphview/analysis/StatusAndTimingTest.java @@ -35,6 +35,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; +import hudson.AbortException; import hudson.model.Queue; import hudson.model.Result; import hudson.model.queue.QueueTaskFuture; @@ -367,7 +368,7 @@ void testBasicParallelFail() throws Exception { @Issue("GH#794") @Test void testParallelFailInProgress() throws Exception { - WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, "Fails"); + WorkflowJob job = j.jenkins.createProject(WorkflowJob.class, "ParallelFailsInProgress"); job.setDefinition(new CpsFlowDefinition( """ pipeline { @@ -378,18 +379,19 @@ void testParallelFailInProgress() throws Exception { stage('Failure caught') { steps { catchError(buildResult: 'SUCCESS', catchInterruptions: false, stageResult: 'FAILURE') { - sh 'exit 1' + semaphore 'catchError' } } } stage('Fails') { steps { - sh 'exit 1' + semaphore 'error' } } stage('Passes') { steps { - sleep 2 + semaphore 'prewait' + sleep 1 semaphore 'wait' } } @@ -456,63 +458,72 @@ void testParallelFailInProgress() throws Exception { -ArgumentsActionImpl null [20]{19}StepStartNode Catch error and set build result to failure : Body : Start -BodyInvocationAction null - [21]{16}StepAtomNode Shell Script + [21]{16}StepAtomNode Test step -ArgumentsActionImpl null -LogStorageAction Console Output - -ErrorAction script returned exit code 1 - [22]{18}StepAtomNode Sleep + -ErrorAction failure + [22]{18}StepAtomNode Test step -ArgumentsActionImpl null -LogStorageAction Console Output - [23]{20}StepAtomNode Shell Script + [23]{20}StepAtomNode Test step -ArgumentsActionImpl null -LogStorageAction Console Output - -ErrorAction script returned exit code 1 + -ErrorAction failure [24]{21}StepEndNode Stage : Body : End [st=16] -BodyInvocationAction null - -ErrorAction script returned exit code 1 - [25]{24}StepEndNode Stage : End [st=15] - -ErrorAction script returned exit code 1 - [26]{25}StepEndNode Execute in parallel : Body : End [st=11] - -BodyInvocationAction null - -ErrorAction script returned exit code 1 + -ErrorAction failure + [25]{22}StepAtomNode Sleep + -ArgumentsActionImpl null -LogStorageAction Console Output - [27]{23}StepEndNode Catch error and set build result to failure : Body : End [st=20] + [26]{23}StepEndNode Catch error and set build result to failure : Body : End [st=20] -BodyInvocationAction null - -ErrorAction script returned exit code 1 + -ErrorAction failure -LogStorageAction Console Output -WarningAction Warning - [28]{27}StepEndNode Catch error and set build result to failure : End [st=19] - [29]{28}StepEndNode Stage : Body : End [st=14] + [27]{24}StepEndNode Stage : End [st=15] + -ErrorAction failure + [28]{26}StepEndNode Catch error and set build result to failure : End [st=19] + [29]{27}StepEndNode Execute in parallel : Body : End [st=11] + -BodyInvocationAction null + -ErrorAction failure + -LogStorageAction Console Output + [30]{28}StepEndNode Stage : Body : End [st=14] -BodyInvocationAction null - [30]{29}StepEndNode Stage : End [st=13] - [31]{30}StepEndNode Execute in parallel : Body : End [st=10] + [31]{30}StepEndNode Stage : End [st=13] + [32]{31}StepEndNode Execute in parallel : Body : End [st=10] -BodyInvocationAction null - [32]{22}StepAtomNode Test step + [33]{25}StepAtomNode Test step -ArgumentsActionImpl null -LogStorageAction Console Output - [33]{32}StepEndNode Stage : Body : End [st=18] + [34]{33}StepEndNode Stage : Body : End [st=18] -BodyInvocationAction null - [34]{33}StepEndNode Stage : End [st=17] - [35]{34}StepEndNode Execute in parallel : Body : End [st=12] + [35]{34}StepEndNode Stage : End [st=17] + [36]{35}StepEndNode Execute in parallel : Body : End [st=12] -BodyInvocationAction null - [36]{31,26,35}StepEndNode Execute in parallel : End [st=7] - -ErrorAction script returned exit code 1 - [37]{36}StepEndNode Stage : Body : End [st=6] + [37]{32,29,36}StepEndNode Execute in parallel : End [st=7] + -ErrorAction failure + [38]{37}StepEndNode Stage : Body : End [st=6] -BodyInvocationAction null - -ErrorAction script returned exit code 1 - [38]{37}StepEndNode Stage : End [st=5] - -ErrorAction script returned exit code 1 - [39]{38}StepEndNode Allocate node : Body : End [st=4] + -ErrorAction failure + [39]{38}StepEndNode Stage : End [st=5] + -ErrorAction failure + [40]{39}StepEndNode Allocate node : Body : End [st=4] -BodyInvocationAction null - -ErrorAction script returned exit code 1 - [40]{39}StepEndNode Allocate node : End [st=3] - -ErrorAction script returned exit code 1 - -ErrorAction script returned exit code 1 - [41]{40}FlowEndNode End of Pipeline [st=2] - -ErrorAction script returned exit code 1 + -ErrorAction failure + [41]{40}StepEndNode Allocate node : End [st=3] + -ErrorAction failure + -ErrorAction failure + [42]{41}FlowEndNode End of Pipeline [st=2] + -ErrorAction failure */ WorkflowRun run = job.scheduleBuild2(0).waitForStart(); + SemaphoreStep.waitForStart("catchError/1", run); + SemaphoreStep.failure("catchError/1", new AbortException("failure")); + SemaphoreStep.waitForStart("error/1", run); + SemaphoreStep.failure("error/1", new AbortException("failure")); + SemaphoreStep.waitForStart("prewait/1", run); + SemaphoreStep.success("prewait/1", null); SemaphoreStep.waitForStart("wait/1", run); FlowExecution exec = run.getExecution(); @@ -521,24 +532,24 @@ void testParallelFailInProgress() throws Exception { assertEquals( GenericStatus.FAILURE, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("10"), exec.getNode("31"), null)); + run, exec.getNode("7"), exec.getNode("10"), exec.getNode("32"), null)); // Failing branch assertEquals( GenericStatus.FAILURE, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("11"), exec.getNode("26"), null)); + run, exec.getNode("7"), exec.getNode("11"), exec.getNode("29"), null)); // In-progress Passing branch assertEquals( GenericStatus.IN_PROGRESS, StatusAndTiming.computeChunkStatus2( - run, exec.getNode("7"), exec.getNode("12"), exec.getNode("32"), null)); + run, exec.getNode("7"), exec.getNode("12"), exec.getNode("33"), null)); // Check that branch statuses match List parallelStarts = Arrays.asList((BlockStartNode) exec.getNode("10"), (BlockStartNode) exec.getNode("11")); - List parallelEnds = Arrays.asList(exec.getNode("31"), exec.getNode("26")); + List parallelEnds = Arrays.asList(exec.getNode("32"), exec.getNode("29")); Map branchStatuses = StatusAndTiming.computeBranchStatuses2(run, exec.getNode("7"), parallelStarts, parallelEnds, null);