diff --git a/pom.xml b/pom.xml index d6d6f3d5..83065062 100644 --- a/pom.xml +++ b/pom.xml @@ -1,4 +1,5 @@ - + 4.0.0 org.jenkins-ci.plugins @@ -65,7 +66,7 @@ org.jenkins-ci.plugins matrix-project 1.4 - false + true org.jenkins-ci.plugins @@ -79,6 +80,12 @@ 1.18 test + + org.jenkins-ci.plugins + credentials + 1.22 + test + diff --git a/src/main/java/jenkins/advancedqueue/PriorityConfiguration.java b/src/main/java/jenkins/advancedqueue/PriorityConfiguration.java index 9a11d79e..f9712a0c 100644 --- a/src/main/java/jenkins/advancedqueue/PriorityConfiguration.java +++ b/src/main/java/jenkins/advancedqueue/PriorityConfiguration.java @@ -26,6 +26,7 @@ import hudson.DescriptorExtensionList; import hudson.Extension; import hudson.ExtensionList; +import hudson.Plugin; import hudson.matrix.MatrixConfiguration; import hudson.matrix.MatrixProject; import hudson.model.Describable; @@ -79,6 +80,7 @@ public class PriorityConfiguration extends Descriptor imp private final static Logger LOGGER = Logger.getLogger(PriorityConfiguration.class.getName()); transient private Map id2jobGroup; + transient private PriorityConfigurationMatrixHelper priorityConfigurationMatrixHelper; private List jobGroups; public PriorityConfiguration() { @@ -101,6 +103,13 @@ public int compare(JobGroup.PriorityStrategyHolder o1, JobGroup.PriorityStrategy } }); } + // + Plugin plugin = Jenkins.getInstance().getPlugin("matrix-project"); + if(plugin == null || !plugin.getWrapper().isEnabled()){ + priorityConfigurationMatrixHelper = null; + } else { + priorityConfigurationMatrixHelper = new PriorityConfigurationMatrixHelper(); + } } public String getIconFileName() { @@ -207,23 +216,9 @@ private PriorityConfigurationCallback getPriorityInternal(Queue.Item item, Prior } Job job = (Job) item.task; - - // [JENKINS-8597] - // For MatrixConfiguration use the latest assigned Priority from the - // MatrixProject - if (job instanceof MatrixConfiguration) { - MatrixProject matrixProject = ((MatrixConfiguration) job).getParent(); - priorityCallback.addDecisionLog(0, "Job is MatrixConfiguration [" + matrixProject.getName() + "] ..."); - ItemInfo itemInfo = QueueItemCache.get().getItem(matrixProject.getName()); - // Can be null (for example) at startup when the MatrixBuild got - // lost (was running at - // restart) - if (itemInfo != null) { - priorityCallback.addDecisionLog(0, "MatrixProject found in cache, using priority from queue-item [" + itemInfo.getItemId() + "]"); - return priorityCallback.setPrioritySelection(itemInfo.getPriority(), itemInfo.getJobGroupId(), itemInfo.getPriorityStrategy()); - } - priorityCallback.addDecisionLog(0, "MatrixProject not found in cache, assigning global default priority"); - return priorityCallback.setPrioritySelection(PrioritySorterConfiguration.get().getStrategy().getDefaultPriority()); + + if (priorityConfigurationMatrixHelper != null && priorityConfigurationMatrixHelper.isMatrixConfiguration(job)) { + return priorityConfigurationMatrixHelper.getPriority((MatrixConfiguration) job, priorityCallback); } // diff --git a/src/main/java/jenkins/advancedqueue/PriorityConfigurationCallback.java b/src/main/java/jenkins/advancedqueue/PriorityConfigurationCallback.java index 800e02fe..753501c5 100644 --- a/src/main/java/jenkins/advancedqueue/PriorityConfigurationCallback.java +++ b/src/main/java/jenkins/advancedqueue/PriorityConfigurationCallback.java @@ -7,5 +7,7 @@ public interface PriorityConfigurationCallback extends DecisionLogger { PriorityConfigurationCallback setPrioritySelection(int priority); PriorityConfigurationCallback setPrioritySelection(int priority, int jobGroupId, PriorityStrategy reason); - + + PriorityConfigurationCallback setPrioritySelection(int priority, long sortAsInQueueSince, int jobGroupId, PriorityStrategy reason); + } diff --git a/src/main/java/jenkins/advancedqueue/PriorityConfigurationMatrixHelper.java b/src/main/java/jenkins/advancedqueue/PriorityConfigurationMatrixHelper.java new file mode 100644 index 00000000..7c1abae0 --- /dev/null +++ b/src/main/java/jenkins/advancedqueue/PriorityConfigurationMatrixHelper.java @@ -0,0 +1,36 @@ +package jenkins.advancedqueue; + +import jenkins.advancedqueue.sorter.ItemInfo; +import jenkins.advancedqueue.sorter.QueueItemCache; +import hudson.matrix.MatrixConfiguration; +import hudson.matrix.MatrixProject; +import hudson.model.Job; + +class PriorityConfigurationMatrixHelper { + + boolean isMatrixConfiguration(Job job) { + return job instanceof MatrixConfiguration; + } + + PriorityConfigurationCallback getPriority(MatrixConfiguration matrixConfiguration, + PriorityConfigurationCallback priorityCallback) { + // [JENKINS-8597] + // For MatrixConfiguration use the latest assigned Priority from the + // MatrixProject + MatrixProject matrixProject = matrixConfiguration.getParent(); + priorityCallback.addDecisionLog(0, "Job is MatrixConfiguration [" + matrixProject.getName() + "] ..."); + ItemInfo itemInfo = QueueItemCache.get().getItem(matrixProject.getName()); + // Can be null (for example) at startup when the MatrixBuild got + // lost (was running at restart) + if (itemInfo != null) { + priorityCallback.addDecisionLog(0, "MatrixProject found in cache, using priority from queue-item [" + + itemInfo.getItemId() + "]"); + return priorityCallback.setPrioritySelection(itemInfo.getPriority(), itemInfo.getJobGroupId(), + itemInfo.getPriorityStrategy()); + } + priorityCallback.addDecisionLog(0, "MatrixProject not found in cache, assigning global default priority"); + return priorityCallback.setPrioritySelection(PrioritySorterConfiguration.get().getStrategy() + .getDefaultPriority()); + + } +} diff --git a/src/main/java/jenkins/advancedqueue/RunExclusiveThrottler.java b/src/main/java/jenkins/advancedqueue/RunExclusiveThrottler.java index c08fcef7..faa51739 100644 --- a/src/main/java/jenkins/advancedqueue/RunExclusiveThrottler.java +++ b/src/main/java/jenkins/advancedqueue/RunExclusiveThrottler.java @@ -34,6 +34,11 @@ public PriorityConfigurationCallback setPrioritySelection(int priority) { public PriorityConfigurationCallback addDecisionLog(int indent, String log) { return this; } + + public PriorityConfigurationCallback setPrioritySelection(int priority, long sortAsInQueueSince, + int jobGroupId, PriorityStrategy reason) { + return this; + } }; @Extension diff --git a/src/main/java/jenkins/advancedqueue/priority/strategy/PriorityJobProperty.java b/src/main/java/jenkins/advancedqueue/priority/strategy/PriorityJobProperty.java index 3bc586d8..d0caf535 100644 --- a/src/main/java/jenkins/advancedqueue/priority/strategy/PriorityJobProperty.java +++ b/src/main/java/jenkins/advancedqueue/priority/strategy/PriorityJobProperty.java @@ -95,6 +95,11 @@ public PriorityConfigurationCallback setPrioritySelection(int priority) { public PriorityConfigurationCallback addDecisionLog(int indent, String log) { return this; } + + public PriorityConfigurationCallback setPrioritySelection(int priority, long sortAsInQueueSince, + int jobGroupId, PriorityStrategy reason) { + return this; + } }; @Override diff --git a/src/main/java/jenkins/advancedqueue/sorter/AdvancedQueueSorter.java b/src/main/java/jenkins/advancedqueue/sorter/AdvancedQueueSorter.java index ca2b304b..f635e4f8 100644 --- a/src/main/java/jenkins/advancedqueue/sorter/AdvancedQueueSorter.java +++ b/src/main/java/jenkins/advancedqueue/sorter/AdvancedQueueSorter.java @@ -75,30 +75,17 @@ public void sortBuildableItems(List items) { Collections.sort(items, new Comparator() { public int compare(BuildableItem o1, BuildableItem o2) { - float o1weight = getCalculatedWeight(o1); - float o2weight = getCalculatedWeight(o2); - if (o1weight > o2weight) { - return 1; - } - if (o1weight < o2weight) { - return -1; - } - // Same weights sort on time in queue - if(o1.getInQueueSince() > o2.getInQueueSince()) { - return 1; - } - if(o1.getInQueueSince() < o2.getInQueueSince()) { - return -1; - } - // Having same time-stamp is not likely - but maybe it can happen ... - return new Integer(o1.id).compareTo(o2.id); + ItemInfo item1 = QueueItemCache.get().getItem(o1.id); + ItemInfo item2 = QueueItemCache.get().getItem(o2.id); + return item1.compareTo(item2); } }); // if (items.size() > 0 && LOGGER.isLoggable(Level.FINE)) { float minWeight = QueueItemCache.get().getItem(items.get(0).id).getWeight(); float maxWeight = QueueItemCache.get().getItem(items.get(items.size() - 1).id).getWeight(); - LOGGER.log(Level.FINE, "Sorted {0} Buildable Items with Min Weight {1} and Max Weight {2}", new Object[] { items.size(), minWeight, maxWeight }); + LOGGER.log(Level.FINE, "Sorted {0} Buildable Items with Min Weight {1} and Max Weight {2}", new Object[] { + items.size(), minWeight, maxWeight }); } // if (items.size() > 0 && LOGGER.isLoggable(Level.FINER)) { @@ -109,11 +96,13 @@ public int compare(BuildableItem o1, BuildableItem o2) { for (BuildableItem item : items) { ItemInfo itemInfo = QueueItemCache.get().getItem(item.id); String jobName = itemInfo.getJobName(); - if(jobName.length() > 21) { - jobName = jobName.substring(0, 9) + "..." + jobName.substring(jobName.length() - 9 , jobName.length()); + if (jobName.length() > 21) { + jobName = jobName.substring(0, 9) + "..." + + jobName.substring(jobName.length() - 9, jobName.length()); } - queueStr.append(String.format("| %10d | %20s | %8d | %20.5f |\n", item.id, jobName, itemInfo.getPriority(), itemInfo.getWeight())); - + queueStr.append(String.format("| %10d | %20s | %8d | %20.5f |\n", item.id, jobName, + itemInfo.getPriority(), itemInfo.getWeight())); + } queueStr.append("+----------------------------------------------------------------------+"); LOGGER.log(Level.FINER, queueStr.toString()); diff --git a/src/main/java/jenkins/advancedqueue/sorter/ItemInfo.java b/src/main/java/jenkins/advancedqueue/sorter/ItemInfo.java index 312e4b5e..75098a8c 100644 --- a/src/main/java/jenkins/advancedqueue/sorter/ItemInfo.java +++ b/src/main/java/jenkins/advancedqueue/sorter/ItemInfo.java @@ -45,6 +45,8 @@ public class ItemInfo implements PriorityConfigurationCallback, DecisionLogger, private int itemId; private long inQueueSince; + + private Long sortAsInQueueSince = null; private int jobGroupId; @@ -74,6 +76,14 @@ public PriorityConfigurationCallback setPrioritySelection(int priority, int jobG return this; } + public PriorityConfigurationCallback setPrioritySelection(int priority, long sortAsInQueueSince, int jobGroupId, PriorityStrategy reason) { + this.priority = priority; + this.sortAsInQueueSince = sortAsInQueueSince; + this.jobGroupId = jobGroupId; + this.priorityStrategy = reason; + return this; + } + public PriorityConfigurationCallback addDecisionLog(int indent, String log) { this.decisionLog.add(String.format("%"+ ((indent + 1) * 2) + "s%s", "", log)); return this; @@ -107,6 +117,13 @@ public long getInQueueSince() { return inQueueSince; } + public long getSortableInQueueSince() { + if(sortAsInQueueSince != null) { + return sortAsInQueueSince; + } + return inQueueSince; + } + public int getJobGroupId() { return jobGroupId; } @@ -133,7 +150,7 @@ public ItemStatus getItemStatus() { public int compareTo(ItemInfo o) { if(this.getWeight() == o.getWeight()) { - if(this.getInQueueSince() == o.getInQueueSince()) { + if(this.getSortableInQueueSince() == o.getSortableInQueueSince()) { return Integer.compare(this.getItemId(), o.getItemId()); } return Long.compare(this.getInQueueSince(), o.getInQueueSince()); diff --git a/src/test/java/jenkins/advancedqueue/test/BasicTest.java b/src/test/java/jenkins/advancedqueue/test/BasicTest.java index f32d22a7..97fa0bd5 100644 --- a/src/test/java/jenkins/advancedqueue/test/BasicTest.java +++ b/src/test/java/jenkins/advancedqueue/test/BasicTest.java @@ -17,27 +17,11 @@ public class BasicTest { private JobHelper jobHelper = new JobHelper(j); - @Test - public void simple_with_no_configuration() throws Exception { - TestRunListener.init(new ExpectedItem("Job 0", 3)); - jobHelper.scheduleProjects(new UserIdCause()); - j.waitUntilNoActivity(); - TestRunListener.assertStartedItems(); - } - - @Test - public void simple_two_jobs_with_no_configuration() throws Exception { - TestRunListener.init(new ExpectedItem("Job 0", 3), new ExpectedItem("Job 1", 3)); - jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()); - j.waitUntilNoActivity(); - TestRunListener.assertStartedItems(); - } - @Test @LocalData public void simple_two_jobs_with_basic_configuration() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 9), new ExpectedItem("Job 1", 9)); - jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()); + jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -46,7 +30,7 @@ public void simple_two_jobs_with_basic_configuration() throws Exception { @LocalData public void simple_with_basic_configuration() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 9)); - jobHelper.scheduleProjects(new UserIdCause()); + jobHelper.scheduleProjects(new UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } diff --git a/src/test/java/jenkins/advancedqueue/test/JobPatternGroupTest.java b/src/test/java/jenkins/advancedqueue/test/JobPatternGroupTest.java index 81e17a83..c3bbc1d0 100644 --- a/src/test/java/jenkins/advancedqueue/test/JobPatternGroupTest.java +++ b/src/test/java/jenkins/advancedqueue/test/JobPatternGroupTest.java @@ -21,7 +21,7 @@ public class JobPatternGroupTest { @LocalData public void test_job_pattern_1() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 3)); - jobHelper.scheduleProjects(new UserIdCause()); + jobHelper.scheduleProjects(new UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -30,7 +30,7 @@ public void test_job_pattern_1() throws Exception { @LocalData public void test_job_pattern_2() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 3), new ExpectedItem("Job 1", 9)); - jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()); + jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -40,7 +40,7 @@ public void test_job_pattern_2() throws Exception { public void test_job_pattern_3() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 3), new ExpectedItem("Job 3", 3), new ExpectedItem("Job 1", 9), new ExpectedItem("Job 2", 9)); - jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause(), new UserIdCause(), new UserIdCause()); + jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause(), new UserIdCause(), new UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } diff --git a/src/test/java/jenkins/advancedqueue/test/MatrixTest.java b/src/test/java/jenkins/advancedqueue/test/MatrixTest.java new file mode 100644 index 00000000..99099e84 --- /dev/null +++ b/src/test/java/jenkins/advancedqueue/test/MatrixTest.java @@ -0,0 +1,73 @@ +package jenkins.advancedqueue.test; + +import hudson.cli.BuildCommand.CLICause; +import hudson.model.Cause.UserIdCause; +import jenkins.advancedqueue.testutil.ExpectedItem; +import jenkins.advancedqueue.testutil.JobHelper; +import jenkins.advancedqueue.testutil.TestRunListener; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; + +public class MatrixTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + private JobHelper jobHelper = new JobHelper(j); + + @Test + @LocalData + public void simple_matrix_with_no_configuration() throws Exception { + TestRunListener.init( + new ExpectedItem("Matrix 0", 1), + new ExpectedItem("0A1=0A.", 1), new ExpectedItem("0A1=0A.", 1) + ); + jobHelper.scheduleMatrixProjects(new UserIdCause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } + + @Test + @LocalData + public void simple_two_matrix_with_no_configuration() throws Exception { + TestRunListener.init( + new ExpectedItem("Matrix 0", 1), new ExpectedItem("Matrix 1", 1), + new ExpectedItem("0A1=0A.", 1), new ExpectedItem("0A1=0A.", 1), + new ExpectedItem("1A1=1A.", 1), new ExpectedItem("1A1=1A.", 1) + ); + jobHelper.scheduleMatrixProjects(new UserIdCause(), new UserIdCause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } + + @Test + @LocalData + public void matrix_and_jobs_with_no_configuration() throws Exception { + TestRunListener.init( + new ExpectedItem("Matrix 0", 1), new ExpectedItem("Matrix 1", 5), + new ExpectedItem("0A1=0A.", 1), new ExpectedItem("0A1=0A.", 1), + new ExpectedItem("Job 0", 5), + new ExpectedItem("1A1=1A.", 5), new ExpectedItem("1A1=1A.", 5) + ); + jobHelper.scheduleProjects(new CLICause()).scheduleMatrixProjects(new UserIdCause(), new CLICause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } + + @Test + @LocalData + public void matrix_and_jobs_with_no_configuration_reverse() throws Exception { + TestRunListener.init( + new ExpectedItem("Matrix 0", 1), new ExpectedItem("Matrix 1", 5), + new ExpectedItem("0A1=0A.", 1), new ExpectedItem("0A1=0A.", 1), + new ExpectedItem("1A1=1A.", 5), new ExpectedItem("1A1=1A.", 5), + new ExpectedItem("Job 0", 5) + ); + jobHelper.scheduleMatrixProjects(new UserIdCause(), new CLICause()).scheduleProjects(new CLICause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } +} diff --git a/src/test/java/jenkins/advancedqueue/test/MultipleMatchJobGroupTest.java b/src/test/java/jenkins/advancedqueue/test/MultipleMatchJobGroupTest.java index 994ee037..fb1ba1f6 100644 --- a/src/test/java/jenkins/advancedqueue/test/MultipleMatchJobGroupTest.java +++ b/src/test/java/jenkins/advancedqueue/test/MultipleMatchJobGroupTest.java @@ -25,7 +25,7 @@ public void multiple_job_group_matches() throws Exception { // Job 0 and 1 matched only All -> priorities are 3 and 4 TestRunListener.init(new ExpectedItem("Job 2", 1), new ExpectedItem("Job 3", 2), new ExpectedItem("Job 0", 3), new ExpectedItem("Job 1", 4)); - jobHelper.scheduleProjects(new CLICause(), new Cause.UserIdCause(), new CLICause(), new Cause.UserIdCause()); + jobHelper.scheduleProjects(new CLICause(), new Cause.UserIdCause(), new CLICause(), new Cause.UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } diff --git a/src/test/java/jenkins/advancedqueue/test/OneJobGroupTest.java b/src/test/java/jenkins/advancedqueue/test/OneJobGroupTest.java index 3d4e0131..0d0c2ea8 100644 --- a/src/test/java/jenkins/advancedqueue/test/OneJobGroupTest.java +++ b/src/test/java/jenkins/advancedqueue/test/OneJobGroupTest.java @@ -29,7 +29,7 @@ public void default_job_group_priority() throws Exception { public String getShortDescription() { return "Dummy Cause"; } - }); + }).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -38,7 +38,7 @@ public String getShortDescription() { @LocalData public void test_UserIdCause() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 4)); - jobHelper.scheduleProjects(new Cause.UserIdCause()); + jobHelper.scheduleProjects(new Cause.UserIdCause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -47,7 +47,7 @@ public void test_UserIdCause() throws Exception { @LocalData public void test_CLICause() throws Exception { TestRunListener.init(new ExpectedItem("Job 0", 5)); - jobHelper.scheduleProjects(new CLICause()); + jobHelper.scheduleProjects(new CLICause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } @@ -61,7 +61,7 @@ public void test_multiple_strategies() throws Exception { public String getShortDescription() { return "Dummy Cause"; } - }); + }).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } diff --git a/src/test/java/jenkins/advancedqueue/test/SectionedViewTest.java b/src/test/java/jenkins/advancedqueue/test/SectionedViewTest.java index a6105fda..dba2ae2f 100644 --- a/src/test/java/jenkins/advancedqueue/test/SectionedViewTest.java +++ b/src/test/java/jenkins/advancedqueue/test/SectionedViewTest.java @@ -24,7 +24,7 @@ public void sectioned_view_test() throws Exception { // Job 1 matches View1 and All -> View1 is before All -> priority is 2 // Job 0 matched only All -> priority is 3 TestRunListener.init(new ExpectedItem("Job 2", 1), new ExpectedItem("Job 1", 2), new ExpectedItem("Job 0", 3)); - jobHelper.scheduleProjects(new CLICause(), new CLICause(), new CLICause()); + jobHelper.scheduleProjects(new CLICause(), new CLICause(), new CLICause()).go(); j.waitUntilNoActivity(); TestRunListener.assertStartedItems(); } diff --git a/src/test/java/jenkins/advancedqueue/test/SimpleTest.java b/src/test/java/jenkins/advancedqueue/test/SimpleTest.java new file mode 100644 index 00000000..522a0af3 --- /dev/null +++ b/src/test/java/jenkins/advancedqueue/test/SimpleTest.java @@ -0,0 +1,39 @@ +package jenkins.advancedqueue.test; + +import hudson.model.Cause.UserIdCause; +import jenkins.advancedqueue.sorter.QueueItemCache; +import jenkins.advancedqueue.testutil.ExpectedItem; +import jenkins.advancedqueue.testutil.JobHelper; +import jenkins.advancedqueue.testutil.TestRunListener; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.recipes.LocalData; + +public class SimpleTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + private JobHelper jobHelper = new JobHelper(j); + + @Test + @LocalData + public void simple_with_no_configuration() throws Exception { + TestRunListener.init(new ExpectedItem("Job 0", 3)); + jobHelper.scheduleProjects(new UserIdCause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } + + @Test + @LocalData + public void simple_two_jobs_with_no_configuration() throws Exception { + TestRunListener.init(new ExpectedItem("Job 0", 3), new ExpectedItem("Job 1", 3)); + jobHelper.scheduleProjects(new UserIdCause(), new UserIdCause()).go(); + j.waitUntilNoActivity(); + TestRunListener.assertStartedItems(); + } + +} diff --git a/src/test/java/jenkins/advancedqueue/testutil/JobHelper.java b/src/test/java/jenkins/advancedqueue/testutil/JobHelper.java index 80ff749a..3553ae38 100644 --- a/src/test/java/jenkins/advancedqueue/testutil/JobHelper.java +++ b/src/test/java/jenkins/advancedqueue/testutil/JobHelper.java @@ -1,10 +1,14 @@ package jenkins.advancedqueue.testutil; import hudson.Launcher; -import hudson.model.AbstractBuild; +import hudson.matrix.AxisList; +import hudson.matrix.MatrixProject; +import hudson.matrix.TextAxis; import hudson.model.BuildListener; +import hudson.model.AbstractBuild; import hudson.model.Cause; import hudson.model.FreeStyleProject; +import hudson.model.Project; import hudson.tasks.Builder; import java.io.IOException; @@ -53,17 +57,44 @@ public List createProjects(int numberOfProjects) throws Except return projects; } - public void scheduleProjects(Cause... causes) throws Exception { + public List createMatrixProjects(int numberOfProjects) throws Exception { + List projects = new ArrayList(numberOfProjects); + for (int i = 0; i < numberOfProjects; i++) { + MatrixProject project = j.createMatrixProject("Matrix " + i); + project.getBuildersList().add(new TestBuilder(100)); + AxisList axes = new AxisList(); + axes.add(new TextAxis(i + "A1", i + "A2", i + "A3")); + project.setAxes(axes); + projects.add(project); + } + return projects; + } + + public JobHelper scheduleMatrixProjects(Cause... causes) throws Exception { + List projects = createMatrixProjects(causes.length); + // Scheduling executors is zero + for (int i = 0; i < causes.length; i++) { + projects.get(i).scheduleBuild(0, causes[i]); + Thread.sleep(100); + } + return this; + } + + public JobHelper scheduleProjects(Cause... causes) throws Exception { List projects = createProjects(causes.length); // Scheduling executors is zero for (int i = 0; i < causes.length; i++) { projects.get(i).scheduleBuild(0, causes[i]); Thread.sleep(100); } + return this; + } + + public void go() throws Exception { // Set the executors to one and restart Jenkins.getInstance().setNumExecutors(1); // TODO: is there any other way to make the 1 take effect than a reload? - Jenkins.getInstance().reload(); + Jenkins.getInstance().reload(); } - + } diff --git a/src/test/java/jenkins/advancedqueue/testutil/TestRunListener.java b/src/test/java/jenkins/advancedqueue/testutil/TestRunListener.java index 2b749170..4354f5ee 100644 --- a/src/test/java/jenkins/advancedqueue/testutil/TestRunListener.java +++ b/src/test/java/jenkins/advancedqueue/testutil/TestRunListener.java @@ -1,12 +1,11 @@ package jenkins.advancedqueue.testutil; import hudson.Extension; -import hudson.model.Run; import hudson.model.TaskListener; +import hudson.model.Run; import hudson.model.listeners.RunListener; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; @@ -20,35 +19,35 @@ public class TestRunListener extends RunListener { private final static Logger LOGGER = Logger.getLogger(TestRunListener.class.getName()); - + static private List actual; static private ExpectedItem[] expected; - - static public void init(ExpectedItem...expected) { + + static public void init(ExpectedItem... expected) { TestRunListener.expected = expected; actual = new ArrayList(expected.length); } - + @Override public void onStarted(Run r, TaskListener listener) { LOGGER.info("ON STARTED: " + r.getParent().getName()); - LOGGER.info("ON STARTED: " + QueueItemCache.get()); - LOGGER.info("ON STARTED: " + QueueItemCache.get().getItem(r.getParent().getName())); try { ItemInfo item = QueueItemCache.get().getItem(r.getParent().getName()); actual.add(item); - } catch(Throwable e) { - LOGGER.log(Level.INFO, "###########", e); + } catch (Throwable e) { + LOGGER.log(Level.INFO, "###########", e); } } - + static public void assertStartedItems() { Assert.assertEquals("Wrong number of started items", expected.length, actual.size()); for (int i = 0; i < actual.size(); i++) { LOGGER.info("Validating Build " + i); - Assert.assertEquals("Job mismatch", expected[i].getJobName(), actual.get(i).getJobName()); - Assert.assertEquals("Priority mismatch", expected[i].getPriority(), actual.get(i).getPriority()); + Assert.assertTrue("Job mismatch at position [" + i + "] expected <" + expected[i].getJobName() + "> was <" + + actual.get(i).getJobName() + ">", actual.get(i).getJobName().matches(expected[i].getJobName())); + Assert.assertEquals("Priority mismatch at position [" + i + "]", expected[i].getPriority(), actual.get(i) + .getPriority()); } } - + } diff --git a/src/test/resources/jenkins/advancedqueue/test/BasicTest/config.xml b/src/test/resources/jenkins/advancedqueue/test/BasicTest/config.xml index 51b5d779..1e5190f2 100644 --- a/src/test/resources/jenkins/advancedqueue/test/BasicTest/config.xml +++ b/src/test/resources/jenkins/advancedqueue/test/BasicTest/config.xml @@ -4,7 +4,7 @@ OldData 1.520 - 1 + 0 NORMAL true diff --git a/src/test/resources/jenkins/advancedqueue/test/MatrixTest/config.xml b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/config.xml new file mode 100644 index 00000000..c3e917e7 --- /dev/null +++ b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/config.xml @@ -0,0 +1,39 @@ + + + + OldData + + 1.520 + 0 + NORMAL + true + + + + ${ITEM_ROOTDIR}/workspace + ${ITEM_ROOTDIR}/builds + + false + + + + + + + 5 + 0 + + + + All + false + false + + + + All + 0 + + + + \ No newline at end of file diff --git a/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PriorityConfiguration.xml b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PriorityConfiguration.xml new file mode 100644 index 00000000..16158755 --- /dev/null +++ b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PriorityConfiguration.xml @@ -0,0 +1,22 @@ + + + + + 0 + 5 + All + false + false + .* + true + + + 0 + + 1 + + + + + + \ No newline at end of file diff --git a/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PrioritySorterConfiguration.xml b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PrioritySorterConfiguration.xml new file mode 100644 index 00000000..4cf62b99 --- /dev/null +++ b/src/test/resources/jenkins/advancedqueue/test/MatrixTest/jenkins.advancedqueue.PrioritySorterConfiguration.xml @@ -0,0 +1,18 @@ + + + false + 2147483647 + -2147483648 + true + + + + + + 0 + 0 + + 10 + 5 + + \ No newline at end of file diff --git a/src/test/resources/jenkins/advancedqueue/test/SimpleTest/config.xml b/src/test/resources/jenkins/advancedqueue/test/SimpleTest/config.xml new file mode 100644 index 00000000..c3e917e7 --- /dev/null +++ b/src/test/resources/jenkins/advancedqueue/test/SimpleTest/config.xml @@ -0,0 +1,39 @@ + + + + OldData + + 1.520 + 0 + NORMAL + true + + + + ${ITEM_ROOTDIR}/workspace + ${ITEM_ROOTDIR}/builds + + false + + + + + + + 5 + 0 + + + + All + false + false + + + + All + 0 + + + + \ No newline at end of file