package hudson.model; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.SortedMap; import java.util.TreeMap; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; /** * Unit test for {@link Job}. */ @SuppressWarnings("rawtypes") public class SimpleJobTest { @Rule public JenkinsRule rule = new JenkinsRule(); @Test public void testGetEstimatedDuration() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); TestBuild previousPreviousBuild = new TestBuild(project, Result.SUCCESS, 20, null); runs.put(3, previousPreviousBuild); TestBuild previousBuild = new TestBuild(project, Result.SUCCESS, 15, previousPreviousBuild); runs.put(2, previousBuild); TestBuild lastBuild = new TestBuild(project, Result.SUCCESS, 42, previousBuild); runs.put(1, lastBuild); // without assuming to know too much about the internal calculation // we can only assume that the result is between the maximum and the minimum assertTrue("Expected < 42, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() < 42); assertTrue("Expected > 15, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() > 15); } @Test public void testGetEstimatedDurationWithOneRun() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); TestBuild lastBuild = new TestBuild(project, Result.SUCCESS, 42, null); runs.put(1, lastBuild); assertEquals(42, project.getEstimatedDuration()); } public void testGetEstimatedDurationWithFailedRun() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); TestBuild lastBuild = new TestBuild(project, Result.FAILURE, 42, null); runs.put(1, lastBuild); assertEquals(-1, project.getEstimatedDuration()); } @Test public void testGetEstimatedDurationWithNoRuns() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); assertEquals(-1, project.getEstimatedDuration()); } @Test public void testGetEstimatedDurationIfPrevious3BuildsFailed() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); TestBuild prev5Build = new TestBuild(project, Result.UNSTABLE, 1, null); runs.put(6, prev5Build); TestBuild prev4Build = new TestBuild(project, Result.SUCCESS, 1, prev5Build); runs.put(5, prev4Build); TestBuild prev3Build = new TestBuild(project, Result.SUCCESS, 1, prev4Build); runs.put(4, prev3Build); TestBuild previous2Build = new TestBuild(project, Result.FAILURE, 50, prev3Build); runs.put(3, previous2Build); TestBuild previousBuild = new TestBuild(project, Result.FAILURE, 50, previous2Build); runs.put(2, previousBuild); TestBuild lastBuild = new TestBuild(project, Result.FAILURE, 50, previousBuild); runs.put(1, lastBuild); // failed builds must not be used, if there are successfulBuilds available. assertEquals(1, project.getEstimatedDuration()); } @Test public void testGetEstimatedDurationIfNoSuccessfulBuildTakeDurationOfFailedBuild() throws IOException { final SortedMap<Integer, TestBuild> runs = new TreeMap<Integer, TestBuild>(); Job project = createMockProject(runs); TestBuild lastBuild = new TestBuild(project, Result.FAILURE, 50, null); runs.put(1, lastBuild); assertEquals(50, project.getEstimatedDuration()); } private Job createMockProject(final SortedMap<Integer, TestBuild> runs) { return new TestJob(runs); } @SuppressWarnings("unchecked") private static class TestBuild extends Run { public TestBuild(Job project, Result result, long duration, TestBuild previousBuild) throws IOException { super(project); this.result = result; this.duration = duration; this.previousBuild = previousBuild; } @Override public int compareTo(Run o) { return 0; } @Override public Result getResult() { return result; } @Override public boolean isBuilding() { return false; } } @SuppressWarnings("unchecked") private class TestJob extends Job implements TopLevelItem { int i; private final SortedMap<Integer, TestBuild> runs; public TestJob(SortedMap<Integer, TestBuild> runs) { super(rule.jenkins, "name"); this.runs = runs; i = 1; } @Override public int assignBuildNumber() throws IOException { return i++; } @Override public SortedMap<Integer, ? extends Run> _getRuns() { return runs; } @Override public boolean isBuildable() { return true; } @Override protected void removeRun(Run run) { } public TopLevelItemDescriptor getDescriptor() { throw new AssertionError(); } } }