[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:
Jon authored and Oleg Nenashev committed 2017-10-14 11:49:22 +02:00
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;