|
24 | 24 |
|
25 | 25 | package org.jenkinsci.plugins.workflow.steps.scm;
|
26 | 26 |
|
| 27 | +import hudson.FilePath; |
| 28 | +import hudson.Launcher; |
27 | 29 | import hudson.model.Label;
|
| 30 | +import hudson.model.Run; |
| 31 | +import hudson.model.TaskListener; |
| 32 | +import hudson.scm.ChangeLogParser; |
28 | 33 | import hudson.scm.ChangeLogSet;
|
| 34 | +import hudson.scm.NullSCM; |
29 | 35 | import hudson.scm.PollingResult;
|
| 36 | +import hudson.scm.RepositoryBrowser; |
| 37 | +import hudson.scm.SCMRevisionState; |
30 | 38 | import hudson.scm.SubversionSCM;
|
31 | 39 | import hudson.triggers.SCMTrigger;
|
32 | 40 | import hudson.util.StreamTaskListener;
|
33 | 41 | import java.io.File;
|
| 42 | +import java.io.IOException; |
34 | 43 | import java.util.Iterator;
|
35 | 44 | import java.util.List;
|
| 45 | +import jenkins.model.Jenkins; |
36 | 46 |
|
37 | 47 | import jenkins.plugins.git.GitSampleRepoRule;
|
38 | 48 | import jenkins.scm.impl.subversion.SubversionSampleRepoRule;
|
|
49 | 59 | import org.jvnet.hudson.test.BuildWatcher;
|
50 | 60 | import org.jvnet.hudson.test.Issue;
|
51 | 61 | import org.jvnet.hudson.test.RestartableJenkinsRule;
|
| 62 | +import org.jvnet.hudson.test.TestExtension; |
| 63 | +import org.kohsuke.stapler.DataBoundConstructor; |
| 64 | +import org.xml.sax.SAXException; |
52 | 65 |
|
53 | 66 | public class SCMStepTest {
|
54 | 67 |
|
@@ -150,8 +163,39 @@ public void scmVars() throws Exception {
|
150 | 163 | assertPolling(p, PollingResult.Change.SIGNIFICANT);
|
151 | 164 | });
|
152 | 165 | }
|
| 166 | + |
| 167 | + @Issue(value = { "JENKINS-57918", "JENKINS-59560" }) |
| 168 | + @Test public void scmParsesUmodifiedChangelogFile() { |
| 169 | + rr.then(r -> { |
| 170 | + WorkflowJob p = r.jenkins.createProject(WorkflowJob.class, "p"); |
| 171 | + p.setDefinition(new CpsFlowDefinition( |
| 172 | + "node() {\n" + |
| 173 | + " checkout([$class: 'InvalidChangelogSCM'])\n" + |
| 174 | + "}", true)); |
| 175 | + r.buildAndAssertSuccess(p); |
| 176 | + }); |
| 177 | + } |
| 178 | + |
153 | 179 | private static void assertPolling(WorkflowJob p, PollingResult.Change expectedChange) {
|
154 | 180 | assertEquals(expectedChange, p.poll(StreamTaskListener.fromStdout()).change);
|
155 | 181 | }
|
156 | 182 |
|
| 183 | + public static class InvalidChangelogSCM extends NullSCM { |
| 184 | + @DataBoundConstructor |
| 185 | + public InvalidChangelogSCM() { } |
| 186 | + @Override public void checkout(Run<?,?> build, Launcher launcher, FilePath workspace, TaskListener listener, File changelogFile, SCMRevisionState baseline) throws IOException, InterruptedException { |
| 187 | + // Unlike the superclass, which adds an XML header to the file, we just ignore the file. |
| 188 | + } |
| 189 | + @Override public ChangeLogParser createChangeLogParser() { |
| 190 | + return new ChangeLogParser() { |
| 191 | + public ChangeLogSet<? extends ChangeLogSet.Entry> parse(Run build, RepositoryBrowser<?> browser, File changelogFile) throws IOException, SAXException { |
| 192 | + Jenkins.XSTREAM2.fromXML(changelogFile); |
| 193 | + throw new AssertionError("The previous line should always fail because the file is empty"); |
| 194 | + } |
| 195 | + }; |
| 196 | + } |
| 197 | + @TestExtension("scmParsesUmodifiedChangelogFile") |
| 198 | + public static class DescriptorImpl extends NullSCM.DescriptorImpl { } |
| 199 | + } |
| 200 | + |
157 | 201 | }
|
0 commit comments