package hudson.model; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Result; import hudson.model.utils.AbortExceptionPublisher; import hudson.model.utils.IOExceptionPublisher; import hudson.model.utils.ResultWriterPublisher; import hudson.model.utils.TrueFalsePublisher; import hudson.tasks.ArtifactArchiver; import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import java.io.File; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * Freestyle publishers statuses tests * * @author Kanstantsin Shautsou */ public class FreestyleJobPublisherTest { @Rule public JenkinsRule j = new JenkinsRule(); /** * Execute all publishers even one of publishers return false. */ @Issue("JENKINS-26964") @Test public void testFreestyleWithFalsePublisher() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new TrueFalsePublisher(true)); // noop p.getPublishersList().add(new TrueFalsePublisher(false)); // FAIL build with false p.getPublishersList().add(new ResultWriterPublisher("result.txt")); // catch result to file final ArtifactArchiver artifactArchiver = new ArtifactArchiver("result.txt"); artifactArchiver.setOnlyIfSuccessful(false); p.getPublishersList().add(artifactArchiver); // transfer file to build dir FreeStyleBuild b = p.scheduleBuild2(0).get(); assertEquals("Build must fail, because we used FalsePublisher", b.getResult(), Result.FAILURE); File file = new File(b.getArtifactsDir(), "result.txt"); assertTrue("ArtifactArchiver is executed even prior publisher fails", file.exists()); assertTrue("Publisher, after publisher with return false status, must see FAILURE status", FileUtils.readFileToString(file).equals(Result.FAILURE.toString())); } /** * Execute all publishers even one of them throws AbortException. */ @Issue("JENKINS-26964") @Test public void testFreestyleWithExceptionPublisher() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new TrueFalsePublisher(true)); // noop p.getPublishersList().add(new AbortExceptionPublisher()); // FAIL build with AbortException p.getPublishersList().add(new ResultWriterPublisher("result.txt")); // catch result to file final ArtifactArchiver artifactArchiver = new ArtifactArchiver("result.txt"); artifactArchiver.setOnlyIfSuccessful(false); p.getPublishersList().add(artifactArchiver); // transfer file to build dir FreeStyleBuild b = p.scheduleBuild2(0).get(); assertEquals("Build must fail, because we used AbortExceptionPublisher", b.getResult(), Result.FAILURE); j.assertLogNotContains("\tat", b); // log must not contain stacktrace j.assertLogContains("Threw AbortException from publisher!", b); // log must contain exact error message File file = new File(b.getArtifactsDir(), "result.txt"); assertTrue("ArtifactArchiver is executed even prior publisher fails", file.exists()); assertTrue("Third publisher must see FAILURE status", FileUtils.readFileToString(file).equals(Result.FAILURE.toString())); } /** * Execute all publishers even one of them throws any Exceptions. */ @Issue("JENKINS-26964") @Test public void testFreestyleWithIOExceptionPublisher() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new TrueFalsePublisher(true)); // noop p.getPublishersList().add(new IOExceptionPublisher()); // fail with IOException p.getPublishersList().add(new ResultWriterPublisher("result.txt")); //catch result to file final ArtifactArchiver artifactArchiver = new ArtifactArchiver("result.txt"); artifactArchiver.setOnlyIfSuccessful(false); p.getPublishersList().add(artifactArchiver); // transfer file to build dir FreeStyleBuild b = p.scheduleBuild2(0).get(); assertEquals("Build must fail, because we used FalsePublisher", b.getResult(), Result.FAILURE); j.assertLogContains("\tat hudson.model.utils.IOExceptionPublisher", b); // log must contain stacktrace j.assertLogContains("Threw IOException from publisher!", b); // log must contain exact error message File file = new File(b.getArtifactsDir(), "result.txt"); assertTrue("ArtifactArchiver is executed even prior publisher fails", file.exists()); assertTrue("Third publisher must see FAILURE status", FileUtils.readFileToString(file).equals(Result.FAILURE.toString())); } }