From 1c781526a644e9ce43a050dab7923ab188d9ed12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 26 Mar 2015 12:17:56 +0100 Subject: [PATCH] Test BuildTrigger waits for parent completion --- .../org/jvnet/hudson/test/TestNotifier.java | 57 +++++++++++++++++++ .../java/hudson/tasks/BuildTriggerTest.java | 50 ++++++++++++++++ 2 files changed, 107 insertions(+) create mode 100644 test/src/main/java/org/jvnet/hudson/test/TestNotifier.java diff --git a/test/src/main/java/org/jvnet/hudson/test/TestNotifier.java b/test/src/main/java/org/jvnet/hudson/test/TestNotifier.java new file mode 100644 index 0000000000..7e138ee2a6 --- /dev/null +++ b/test/src/main/java/org/jvnet/hudson/test/TestNotifier.java @@ -0,0 +1,57 @@ +/* + * The MIT License + * + * Copyright (c) 2015 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package org.jvnet.hudson.test; + +import hudson.tasks.BuildStepDescriptor; +import hudson.tasks.BuildStepMonitor; +import hudson.tasks.Notifier; +import hudson.tasks.Publisher; +import hudson.model.AbstractProject; + +/** + * Partial {@link Notifier} implementation to facilitate notifier implementation for testing. + */ +public abstract class TestNotifier extends Notifier { + + @Override + public BuildStepDescriptor getDescriptor() { + return new BuildStepDescriptor() { + @Override + public boolean isApplicable(Class jobType) { + return true; + } + + @Override + public String getDisplayName() { + return "Bogus"; + } + }; + } + + public BuildStepMonitor getRequiredMonitorService() { + return BuildStepMonitor.NONE; + } + + private Object writeReplace() { return new Object(); } +} diff --git a/test/src/test/java/hudson/tasks/BuildTriggerTest.java b/test/src/test/java/hudson/tasks/BuildTriggerTest.java index 9117e6e486..9cdb1d7cc8 100644 --- a/test/src/test/java/hudson/tasks/BuildTriggerTest.java +++ b/test/src/test/java/hudson/tasks/BuildTriggerTest.java @@ -28,15 +28,19 @@ import static org.junit.Assert.*; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.Launcher; import hudson.maven.MavenModuleSet; import hudson.maven.MavenModuleSetBuild; +import hudson.model.AbstractBuild; import hudson.model.AbstractProject; +import hudson.model.BuildListener; import hudson.model.Cause; import hudson.model.Computer; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Item; import hudson.model.Result; +import hudson.model.PermalinkProjectAction.Permalink; import hudson.model.Run; import hudson.model.User; import hudson.security.ACL; @@ -47,6 +51,7 @@ import hudson.security.ProjectMatrixAuthorizationStrategy; import hudson.util.FormValidation; import java.io.File; +import java.io.IOException; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -68,8 +73,12 @@ import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; +import org.jvnet.hudson.test.TestBuilder; +import org.jvnet.hudson.test.TestNotifier; import org.jvnet.hudson.test.MockBuilder; import org.jvnet.hudson.test.MockQueueItemAuthenticator; +import org.xml.sax.SAXException; /** * Tests for hudson.tasks.BuildTrigger @@ -290,4 +299,45 @@ public class BuildTriggerTest { assertEquals(result.renderHtml(), expectedError); } } + + @Test + public void downstreamProjectShouldObserveCompletedParent() throws Exception { + final WebClient wc = j.createWebClient(); + + final FreeStyleProject us = j.createFreeStyleProject(); + us.getPublishersList().add(new BuildTrigger("downstream", true)); + us.getPublishersList().add(new TestNotifier() { + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + Thread.sleep(5000); // Build does not complete just after the BuildTrigger + return true; + } + }); + + FreeStyleProject ds = createDownstreamProject(); + ds.getBuildersList().add(new TestBuilder() { + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + // Parent should be completed by now + FreeStyleBuild upstream = us.getLastBuild(); + assertNotNull(upstream); + assertEquals(1, upstream.getNumber()); + + try { + wc.getPage(us, "lastBuild"); + } catch (SAXException ex) { + throw new AssertionError(ex); + } + return true; + } + }); + + j.jenkins.rebuildDependencyGraph(); + + j.buildAndAssertSuccess(us); + + final FreeStyleBuild dsb = ds.getBuildByNumber(1); + j.waitForCompletion(dsb); + j.assertBuildStatusSuccess(dsb); + } } -- GitLab