List<FlowNode> sorted = scanner.filteredNodes(exec.getCurrentHeads(), (Predicate) Predicates.alwaysTrue()); Collections.sort(sorted, new Comparator<FlowNode>() { @Override
static void verifySucceededCleanly(Jenkins j, WorkflowRun run) throws Exception { Assert.assertEquals(Result.SUCCESS, run.getResult()); int outputHash = run.getLog().hashCode(); FlowExecution exec = run.getExecution(); verifyCompletedCleanly(j, run); // Confirm the flow graph is fully navigable and contains the heads with appropriate ending DepthFirstScanner scan = new DepthFirstScanner(); List<FlowNode> allNodes = scan.allNodes(exec); FlowNode endNode = exec.getCurrentHeads().get(0); Assert.assertEquals(FlowEndNode.class, endNode.getClass()); assert allNodes.contains(endNode); Assert.assertEquals(8, allNodes.size()); // Graph structure assertions Assert.assertEquals(2, scan.filteredNodes(endNode, (Predicate)(Predicates.instanceOf(StepStartNode.class))).size()); Assert.assertEquals(2, scan.filteredNodes(endNode, (Predicate)(Predicates.instanceOf(StepEndNode.class))).size()); Assert.assertEquals(1, scan.filteredNodes(endNode, (Predicate)(Predicates.instanceOf(FlowStartNode.class))).size()); Predicate<FlowNode> sleepOrSemaphoreMatch = Predicates.or( new NodeStepNamePredicate(StepDescriptor.byFunctionName("semaphore").getId()), new NodeStepNamePredicate(StepDescriptor.byFunctionName("sleep").getId()) ); Assert.assertEquals(1, scan.filteredNodes(endNode, sleepOrSemaphoreMatch).size()); Assert.assertEquals(1, scan.filteredNodes(endNode, new NodeStepNamePredicate(StepDescriptor.byFunctionName("echo").getId())).size()); for (FlowNode node : (List<FlowNode>)(scan.filteredNodes(endNode, (Predicate)(Predicates.instanceOf(StepNode.class))))) { Assert.assertNotNull("Node: "+node.toString()+" does not have a TimingAction", node.getAction(TimingAction.class)); } assertHasTimingAction(run.getExecution()); }
@Test public void metastepConsoleRaw() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "node {\n" + " wrap(new org.jenkinsci.plugins.configfiles.buildwrapper.ConfigFileBuildWrapper([])) {\n" + " writeFile text: '''<testsuite name='a'><testcase name='c'><error>failed</error></testcase></testsuite>''', file: 'x.xml'\n" + " step(new hudson.tasks.ArtifactArchiver('x.xml'))\n" + " }\n" + "}", false)); WorkflowRun b = r.buildAndAssertSuccess(p); List<FlowNode> coreStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), new NodeStepTypePredicate("step")); assertThat(coreStepNodes, hasSize(1)); assertEquals("archiveArtifacts", coreStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ArtifactArchiver.class).getDisplayName(), coreStepNodes.get(0).getDisplayName()); List<FlowNode> coreWrapperStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), Predicates.and(new NodeStepTypePredicate("wrap"), new Predicate<FlowNode>() { @Override public boolean apply(FlowNode n) { return n instanceof StepStartNode && !((StepStartNode) n).isBody(); } })); assertThat(coreWrapperStepNodes, hasSize(1)); assertEquals("configFileProvider", coreWrapperStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ConfigFileBuildWrapper.class).getDisplayName() + " : Start", coreWrapperStepNodes.get(0).getDisplayName()); r.assertLogContains("[Pipeline] archiveArtifacts", b); r.assertLogContains("[Pipeline] configFileProvider", b); r.assertLogContains("[Pipeline] // configFileProvider", b); }
@Ignore("TODO ArgumentsAction.getResolvedArguments does not yet handle NotStoredReason sensibly") @Test public void metastepConsoleNotStoredArgument() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); String spaces = StringUtils.repeat(" ", 1025); // cf. ArgumentsAction.MAX_RETAINED_LENGTH p.setDefinition(new CpsFlowDefinition( "node {\n" + " configFileProvider([]) {\n" + " writeFile text: '''<testsuite name='a'><testcase name='c'><error>failed</error></testcase></testsuite>''', file: 'x.xml'\n" + " junit 'x.xml," + spaces + "'\n" + " }\n" + "}", true)); WorkflowRun b = r.assertBuildStatus(Result.UNSTABLE, p.scheduleBuild2(0)); List<FlowNode> coreStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), new NodeStepTypePredicate("step")); assertThat(coreStepNodes, hasSize(1)); assertEquals("junit", coreStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(JUnitResultArchiver.class).getDisplayName(), coreStepNodes.get(0).getDisplayName()); List<FlowNode> coreWrapperStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), Predicates.and(new NodeStepTypePredicate("wrap"), new Predicate<FlowNode>() { @Override public boolean apply(FlowNode n) { return n instanceof StepStartNode && !((StepStartNode) n).isBody(); } })); assertThat(coreWrapperStepNodes, hasSize(1)); assertEquals("configFileProvider", coreWrapperStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ConfigFileBuildWrapper.class).getDisplayName() + " : Start", coreWrapperStepNodes.get(0).getDisplayName()); r.assertLogContains("[Pipeline] junit", b); r.assertLogContains("[Pipeline] configFileProvider", b); r.assertLogContains("[Pipeline] // configFileProvider", b); }
@Issue("JENKINS-45109") @Test public void metastepConsole() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "node {\n" + " configFileProvider([]) {\n" + " writeFile text: '''<testsuite name='a'><testcase name='c'><error>failed</error></testcase></testsuite>''', file: 'x.xml'\n" + " archiveArtifacts 'x.xml'\n" + " }\n" + "}", true)); WorkflowRun b = r.buildAndAssertSuccess(p); List<FlowNode> coreStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), new NodeStepTypePredicate("step")); assertThat(coreStepNodes, hasSize(1)); assertEquals("archiveArtifacts", coreStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ArtifactArchiver.class).getDisplayName(), coreStepNodes.get(0).getDisplayName()); List<FlowNode> coreWrapperStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), Predicates.and(new NodeStepTypePredicate("wrap"), new Predicate<FlowNode>() { @Override public boolean apply(FlowNode n) { return n instanceof StepStartNode && !((StepStartNode) n).isBody(); } })); assertThat(coreWrapperStepNodes, hasSize(1)); assertEquals("configFileProvider", coreWrapperStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ConfigFileBuildWrapper.class).getDisplayName() + " : Start", coreWrapperStepNodes.get(0).getDisplayName()); r.assertLogContains("[Pipeline] archiveArtifacts", b); r.assertLogContains("[Pipeline] configFileProvider", b); r.assertLogContains("[Pipeline] // configFileProvider", b); }
@Test public void metastepConsoleShellClass() throws Exception { WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); p.setDefinition(new CpsFlowDefinition( "node {\n" + " wrap([$class: 'ConfigFileBuildWrapper', managedFiles: []]) {\n" + " writeFile text: '''<testsuite name='a'><testcase name='c'><error>failed</error></testcase></testsuite>''', file: 'x.xml'\n" + " step([$class: 'ArtifactArchiver', artifacts: 'x.xml'])\n" + " }\n" + "}", true)); WorkflowRun b = r.buildAndAssertSuccess(p); List<FlowNode> coreStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), new NodeStepTypePredicate("step")); assertThat(coreStepNodes, hasSize(1)); assertEquals("archiveArtifacts", coreStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ArtifactArchiver.class).getDisplayName(), coreStepNodes.get(0).getDisplayName()); List<FlowNode> coreWrapperStepNodes = new DepthFirstScanner().filteredNodes(b.getExecution(), Predicates.and(new NodeStepTypePredicate("wrap"), new Predicate<FlowNode>() { @Override public boolean apply(FlowNode n) { return n instanceof StepStartNode && !((StepStartNode) n).isBody(); } })); assertThat(coreWrapperStepNodes, hasSize(1)); assertEquals("configFileProvider", coreWrapperStepNodes.get(0).getDisplayFunctionName()); assertEquals(r.jenkins.getDescriptor(ConfigFileBuildWrapper.class).getDisplayName() + " : Start", coreWrapperStepNodes.get(0).getDisplayName()); r.assertLogContains("[Pipeline] archiveArtifacts", b); r.assertLogContains("[Pipeline] configFileProvider", b); r.assertLogContains("[Pipeline] // configFileProvider", b); }