mirror of
https://github.com/jenkinsci/jenkins.git
synced 2026-11-15 13:02:19 +00:00
[JENKINS-46759] Fixed bug in build queue filtering for views (#3008)
* [JENKINS-46759] Fixed bug related to views which filters build queue, jobs which has multiple sub steps were filtered incorrectly. * Added test case for build queue filtering in views. * [JENKINS-46759] Improved code based on feedback from PR; Fixed logic bug, moved logic to separate method and added limit to number of iteration when looking for owner task.
This commit is contained in:
1 parent
02b8e7f356
commit
ce2d0f97bd
3 files changed
+98
-12
No files matched your search
@@ -37,6 +37,10 @@ public class MockItem extends Queue.Item {
|
||||
super(null, Collections.<Action>emptyList(), id, null);
|
||||
}
|
||||
|
||||
public MockItem(Queue.Task task) {
|
||||
super(task, Collections.emptyList(), -1, null);
|
||||
}
|
||||
|
||||
public MockItem(Queue.Task task, List<Action> actions, long id) {
|
||||
super(task, actions, id, null);
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ import org.junit.Test;
|
||||
import org.kohsuke.stapler.StaplerRequest;
|
||||
import org.kohsuke.stapler.StaplerResponse;
|
||||
import org.mockito.Mockito;
|
||||
import org.powermock.reflect.Whitebox;
|
||||
|
||||
public class ViewTest {
|
||||
|
||||
@@ -112,6 +113,62 @@ public class ViewTest {
|
||||
return rootJob;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void buildQueueFiltering() throws Exception {
|
||||
// Mimic a freestyle job
|
||||
FreeStyleProject singleItemJob = Mockito.mock(FreeStyleProject.class);
|
||||
Mockito.when(singleItemJob.getOwnerTask()).thenReturn(singleItemJob);
|
||||
Queue.Item singleItemQueueItem = new MockItem(singleItemJob);
|
||||
|
||||
// Mimic pattern of a Matrix job, i.e. with root item in view and sub
|
||||
// items in queue.
|
||||
FreeStyleProject multiItemJob = Mockito.mock(FreeStyleProject.class);
|
||||
Project multiItemSubJob = Mockito.mock(Project.class);
|
||||
Mockito.when(multiItemSubJob.getRootProject()).thenReturn(multiItemJob);
|
||||
Mockito.when(multiItemSubJob.getOwnerTask()).thenReturn(multiItemSubJob);
|
||||
Queue.Item multiItemQueueItem = new MockItem(multiItemSubJob);
|
||||
|
||||
// Mimic pattern of a Pipeline job, i.e. with item in view and
|
||||
// sub-steps in queue.
|
||||
BuildableTopLevelItem multiStepJob
|
||||
= Mockito.mock(BuildableTopLevelItem.class);
|
||||
Mockito.when(multiStepJob.getOwnerTask()).thenReturn(multiStepJob);
|
||||
BuildableItem multiStepSubStep = Mockito.mock(BuildableItem.class);
|
||||
Mockito.when(multiStepSubStep.getOwnerTask()).thenReturn(multiStepJob);
|
||||
Queue.Item multiStepQueueItem = new MockItem(multiStepSubStep);
|
||||
|
||||
// Construct the view
|
||||
View view = Mockito.mock(View.class);
|
||||
List<Queue.Item> queue = Arrays.asList(singleItemQueueItem,
|
||||
multiItemQueueItem, multiStepQueueItem);
|
||||
Mockito.when(view.isFilterQueue()).thenReturn(true);
|
||||
|
||||
// Positive test, ensure that queue items are included
|
||||
List<TopLevelItem> viewJobs = Arrays.asList(singleItemJob, multiItemJob, multiStepJob);
|
||||
Mockito.when(view.getItems()).thenReturn(viewJobs);
|
||||
assertEquals(
|
||||
Arrays.asList(singleItemQueueItem,
|
||||
multiItemQueueItem, multiStepQueueItem),
|
||||
Whitebox.invokeMethod(view, "filterQueue", queue)
|
||||
);
|
||||
|
||||
// Negative test, ensure that queue items are excluded
|
||||
Mockito.when(view.getItems()).thenReturn(Collections.emptyList());
|
||||
List<Queue.Item> expected = Arrays.asList(singleItemQueueItem,
|
||||
multiItemQueueItem, multiStepQueueItem);
|
||||
assertEquals(
|
||||
Collections.emptyList(),
|
||||
Whitebox.<List<Queue.Item>>invokeMethod(view, "filterQueue", queue)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* This interface fulfills both TopLevelItem and BuildableItem interface,
|
||||
* this allows it for being present in a view as well as the build queue!
|
||||
*/
|
||||
private interface BuildableTopLevelItem extends TopLevelItem, BuildableItem {
|
||||
}
|
||||
|
||||
public static class CompositeView extends View implements ViewGroup {
|
||||
|
||||
private View[] views;
|
||||
|
||||
Reference in new issue
Block a user