package hudson.plugins.build_timeout;
import hudson.model.Cause;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.Result;
import hudson.plugins.build_timeout.operations.AbortOperation;
import hudson.plugins.build_timeout.operations.FailOperation;
import hudson.tasks.Builder;
import hudson.util.IOUtils;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertFalse;
public class BuildStepWithTimeoutTest {
@Rule
public BuildTimeOutJenkinsRule j = new BuildTimeOutJenkinsRule();
private final static long TINY_DELAY = 100L;
private final static long HUGE_DELAY = 5000L;
@Before
public void before() {
// this allows timeout shorter than 3 minutes.
BuildTimeoutWrapper.MINIMUM_TIMEOUT_MILLISECONDS = 100;
}
@Test
public void testTimeoutWasNotTriggered() throws Exception {
final FreeStyleProject project = createProjectWithBuildStepWithTimeout(TINY_DELAY, null);
final FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserIdCause()).get();
j.assertBuildStatusSuccess(build);
j.assertLogContains("Test", build);
}
@Test
public void testTimeoutWasTriggeredWithoutAction() throws Exception {
final FreeStyleProject project = createProjectWithBuildStepWithTimeout(HUGE_DELAY, null);
final FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserIdCause()).get();
j.assertBuildStatus(Result.ABORTED, build);
assertLogDoesNotContain("Test", build);
}
@Test
public void testTimeoutWasTriggeredWithAbortOperation() throws Exception {
final FreeStyleProject project = createProjectWithBuildStepWithTimeout(HUGE_DELAY, new AbortOperation());
final FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserIdCause()).get();
j.assertBuildStatus(Result.ABORTED, build);
assertLogDoesNotContain("Test", build);
}
@Test
public void testTimeoutWasTriggeredWithFailOperation() throws Exception {
final FreeStyleProject project = createProjectWithBuildStepWithTimeout(HUGE_DELAY, new FailOperation());
final FreeStyleBuild build = project.scheduleBuild2(0, new Cause.UserIdCause()).get();
j.assertBuildStatus(Result.FAILURE, build);
assertLogDoesNotContain("Test", build);
}
private FreeStyleProject createProjectWithBuildStepWithTimeout(long delay, BuildTimeOutOperation operation) throws IOException {
final FreeStyleProject project = j.createFreeStyleProject();
final List<BuildTimeOutOperation> operations;
if (operation!=null) {
operations = new ArrayList<BuildTimeOutOperation>();
operations.add(operation);
}
else {
operations = null;
}
final Builder step = new BuildStepWithTimeout(new FakeBuildStep(delay),
new QuickBuildTimeOutStrategy(500), operations);
project.getBuildersList().add(step);
return project;
}
private static void assertLogDoesNotContain(String text, FreeStyleBuild build) throws IOException {
assertFalse(IOUtils.toString(build.getLogReader()).contains(text));
}
}