Skip to content

Commit

Permalink
JENKINS-30801 fix ConcurrentModificationException, add test
Browse files Browse the repository at this point in the history
  • Loading branch information
Dan Alvizu committed Oct 13, 2015
1 parent 439eeab commit fb49ded
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
Expand Up @@ -60,6 +60,7 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
Expand Down Expand Up @@ -598,7 +599,9 @@ private List<Action> filterActions(final List<Action> actions) {
if (action instanceof CauseAction) {
final CauseAction causeAction = (CauseAction) action;
filterOutUserIdCause(causeAction);
retval.add(causeAction);
if (!causeAction.getCauses().isEmpty()) {
retval.add(causeAction);
}
} else if (action instanceof ParametersAction) {
retval.add(action);
}
Expand All @@ -616,9 +619,11 @@ private List<Action> filterActions(final List<Action> actions) {
* the causeAction to remove UserIdCause from
*/
private void filterOutUserIdCause(CauseAction causeAction) {
for (final Cause cause : causeAction.getCauses()) {
final Iterator<Cause> it = causeAction.getCauses().iterator();
while (it.hasNext()) {
final Cause cause = it.next();
if (cause instanceof UserIdCause) {
causeAction.getCauses().remove(cause);
it.remove();
}
}
}
Expand Down
Expand Up @@ -49,6 +49,7 @@
import org.jvnet.hudson.test.recipes.LocalData;

import static org.junit.Assert.*;
import static org.mockito.Mockito.mock;

/**
* Test Build Pipeline View
Expand Down Expand Up @@ -428,6 +429,35 @@ public boolean perform(AbstractBuild<?, ?> abstractBuild, Launcher launcher, Bui
assertEquals(mockScmTriggerCause, upstreamCause.getUpstreamCauses().get(0));
}

@Test
public void testFilterUserIdCause() throws Exception {
final FreeStyleProject upstreamBuild = jenkins.createFreeStyleProject("upstream");
final FreeStyleProject downstreamBuild = jenkins.createFreeStyleProject("downstream");
upstreamBuild.getPublishersList().add(new BuildPipelineTrigger("downstream", null));
// Important; we must do this step to ensure that the dependency graphs
// are updated
Hudson.getInstance().rebuildDependencyGraph();
Cause mockUserIdCause = mock(Cause.UserIdCause.class);
upstreamBuild.scheduleBuild2(0, mockUserIdCause);
jenkins.waitUntilNoActivity();
UpstreamCause upstreamCause = new hudson.model.Cause.UpstreamCause(
(Run<?, ?>) upstreamBuild.getLastBuild());
downstreamBuild.scheduleBuild2(0, upstreamCause);
jenkins.waitUntilNoActivity();

BuildPipelineView pipeline = BuildPipelineViewFactory.getBuildPipelineView("pipeline", "",
new DownstreamProjectGridBuilder(upstreamBuild.getFullName()), "1", false);
jenkins.getInstance().addView(pipeline);
assertNotNull(downstreamBuild.getLastBuild());
// re-run the build as if we clicked re-run in the UI
pipeline.rerunBuild(upstreamBuild.getLastBuild().getExternalizableId());
jenkins.waitUntilNoActivity();
assertEquals(2, upstreamBuild.getBuilds().size());
assertNotNull(upstreamBuild.getLastBuild().getCause(Cause.UserIdCause.class));
assertNotSame(upstreamBuild.getLastBuild().getCause(Cause.UserIdCause.class),
mockUserIdCause);
}

public static class MockAction implements Action, Serializable {

private static final long serialVersionUID = 5677631606354259250L;
Expand Down

0 comments on commit fb49ded

Please sign in to comment.