From 178315eea8c952de7594f4258d35e11e3b2f006a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Fri, 23 Jan 2015 20:40:13 +0100 Subject: [PATCH 1/4] [JENKINS-26583] Reproduce in unittest --- .../envinject/EnvInjectActionTest.java | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java diff --git a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java new file mode 100644 index 00000000..927734b8 --- /dev/null +++ b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java @@ -0,0 +1,163 @@ +/* + * 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.jenkinsci.plugins.envinject; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import hudson.EnvVars; +import hudson.Extension; +import hudson.Launcher; +import hudson.model.BuildListener; +import hudson.model.FreeStyleBuild; +import hudson.model.TaskListener; +import hudson.model.AbstractBuild; +import hudson.model.EnvironmentContributor; +import hudson.model.FreeStyleProject; +import hudson.model.Run; +import hudson.slaves.DumbSlave; +import hudson.tasks.BuildWrapper; +import hudson.tasks.Shell; + +import java.io.IOException; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.TestBuilder; +import org.jvnet.hudson.test.TestExtension; + +public class EnvInjectActionTest { + + @Rule public JenkinsRule j = new JenkinsRule(); + + @SuppressWarnings("deprecation") + @Test public void doNotOverrideWrapperEnvVar() throws Exception { + FreeStyleProject p = setupProjectWithDefaultEnvValue(); + + p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); + + FreeStyleBuild build = build(p); + assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); + assertTrue(build.getLog().contains("actual=BUILD_VAL")); + } + + @SuppressWarnings("deprecation") + @Test public void doNotOverrideContributorEnvVar() throws Exception { + FreeStyleProject p = setupProjectWithDefaultEnvValue(); + + p.getBuildersList().add(new ContributingBuilder("DISPLAY", "BUILD_VAL")); + + FreeStyleBuild build = build(p); + assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); + assertTrue(build.getLog().contains("actual=BUILD_VAL")); + } + + private FreeStyleBuild build(FreeStyleProject p) throws InterruptedException, ExecutionException { + p.getBuildersList().add(new Shell("echo actual=$DISPLAY")); + return p.scheduleBuild2(0).get(); + } + + private FreeStyleProject setupProjectWithDefaultEnvValue()throws Exception, IOException { + DumbSlave slave = slaveContributing("DISPLAY", "SLAVE_VAL"); + FreeStyleProject p = j.jenkins.createProject(FreeStyleProject.class, "project"); + p.setAssignedNode(slave); + return p; + } + + private DumbSlave slaveContributing(String key, String value) throws Exception { + return j.createOnlineSlave(null, new EnvVars(key, value)); + } + + private static final class ContributingWrapper extends BuildWrapper { + private final String value; + private final String key; + + private ContributingWrapper(String key, String value) { + this.value = value; + this.key = key; + } + + @Override + public Environment setUp( + AbstractBuild build, Launcher launcher, BuildListener listener + ) throws IOException, InterruptedException { + return new Environment() { + @Override + public void buildEnvVars(Map env) { + env.put(key, value); + } + }; + } + + @Extension + public static class Descriptor extends hudson.model.Descriptor { + @Override + public String getDisplayName() { + return null; + } + } + } + + private static final class ContributingBuilder extends TestBuilder { + private final String value; + private final String key; + + private ContributingBuilder(String key, String value) { + this.value = value; + this.key = key; + } + + @Override + public boolean perform( + AbstractBuild build, Launcher launcher, BuildListener listener + ) throws InterruptedException, IOException { + // Start serving envvar from EnvironmentContributor + ContributingExtension.values(key, value); + return true; + } + } + + @TestExtension + public static final class ContributingExtension extends EnvironmentContributor { + private static String value = null; + private static String key = null; + + private static void values(String k, String v) { + value = v; + key = k; + } + + @SuppressWarnings("rawtypes") + @Override + public void buildEnvironmentFor( + Run r, EnvVars envs, TaskListener listener + ) throws IOException, InterruptedException { + if (key != null && value != null) { + envs.put(key, value); + } + } + } +} From 1ab1de604bb3c3b7e291d3c581553cb75827bfbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sat, 24 Jan 2015 14:39:22 +0100 Subject: [PATCH 2/4] [JENKINS-26583] More tests --- .../envinject/EnvInjectActionTest.java | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java index 927734b8..0b3becda 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java @@ -41,7 +41,6 @@ import java.io.IOException; import java.util.Map; -import java.util.concurrent.ExecutionException; import org.junit.Rule; import org.junit.Test; @@ -53,31 +52,62 @@ public class EnvInjectActionTest { @Rule public JenkinsRule j = new JenkinsRule(); - @SuppressWarnings("deprecation") @Test public void doNotOverrideWrapperEnvVar() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); - FreeStyleBuild build = build(p); - assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); - assertTrue(build.getLog().contains("actual=BUILD_VAL")); + validate(p); } - @SuppressWarnings("deprecation") @Test public void doNotOverrideContributorEnvVar() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); p.getBuildersList().add(new ContributingBuilder("DISPLAY", "BUILD_VAL")); - FreeStyleBuild build = build(p); - assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); - assertTrue(build.getLog().contains("actual=BUILD_VAL")); + validate(p); + } + + @Test public void doNotOverrideWithBuildStep() throws Exception { + FreeStyleProject p = setupProjectWithDefaultEnvValue(); + p.getBuildersList().add(new EnvInjectBuilder(null, "IRRELEVANT_VAR=true")); + + p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); + + validate(p); + } + + @Test public void doNotOverrideWithBuildWrapper() throws Exception { + FreeStyleProject p = setupProjectWithDefaultEnvValue(); + final EnvInjectBuildWrapper wrapper = new EnvInjectBuildWrapper(); + p.getBuildWrappersList().add(wrapper); + wrapper.setInfo(new EnvInjectJobPropertyInfo( + null, "IRRELEVANT_VAR=true", null, null, null, false)); + + p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); + + validate(p); + } + + @Test public void doNotOverrideWithPasswordWrapper() throws Exception { + FreeStyleProject p = setupProjectWithDefaultEnvValue(); + final EnvInjectPasswordWrapper wrapper = new EnvInjectPasswordWrapper(); + wrapper.setPasswordEntries(new EnvInjectPasswordEntry[] { + new EnvInjectPasswordEntry("IRRELEVANT", "value") + }); + p.getBuildWrappersList().add(wrapper); + + p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); + + validate(p); } - private FreeStyleBuild build(FreeStyleProject p) throws InterruptedException, ExecutionException { + @SuppressWarnings("deprecation") + private void validate(FreeStyleProject p) throws Exception { p.getBuildersList().add(new Shell("echo actual=$DISPLAY")); - return p.scheduleBuild2(0).get(); + FreeStyleBuild build = p.scheduleBuild2(0).get(); + assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); + assertTrue(build.getLog(), build.getLog().contains("actual=BUILD_VAL")); } private FreeStyleProject setupProjectWithDefaultEnvValue()throws Exception, IOException { From 2948c711b05b68c6a94c334c26fe4e6fdcecda9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sat, 24 Jan 2015 18:53:33 +0100 Subject: [PATCH 3/4] [FIXED JENKINS-26583] Do not capture slave variables --- .../plugins/envinject/EnvInjectListener.java | 24 +------------- .../envinject/BuildCauseRetrieverTest.java | 1 - .../envinject/EnvInjectActionTest.java | 32 +++++++++++-------- 3 files changed, 20 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectListener.java b/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectListener.java index a75ce111..1be52026 100644 --- a/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectListener.java +++ b/src/main/java/org/jenkinsci/plugins/envinject/EnvInjectListener.java @@ -10,6 +10,7 @@ import hudson.model.listeners.RunListener; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; + import org.jenkinsci.lib.envinject.EnvInjectException; import org.jenkinsci.lib.envinject.EnvInjectLogger; import org.jenkinsci.plugins.envinject.model.EnvInjectJobPropertyContributor; @@ -33,19 +34,12 @@ public Environment setUpEnvironment(AbstractBuild build, Launcher launcher, Buil EnvInjectLogger logger = new EnvInjectLogger(listener); try { - //Process environment variables at node level - Node buildNode = build.getBuiltOn(); - if (buildNode != null) { - loadEnvironmentVariablesNode(build, buildNode, logger); - } - //Load job envinject job property if (isEnvInjectJobPropertyActive(build)) { return setUpEnvironmentJobPropertyObject(build, launcher, listener, logger); } else { return setUpEnvironmentWithoutJobPropertyObject(build, launcher, listener); } - } catch (Run.RunnerAbortedException rre) { logger.info("Fail the build."); throw new Run.RunnerAbortedException(); @@ -75,22 +69,6 @@ private boolean isEligibleJobType(AbstractBuild build) { } - private void loadEnvironmentVariablesNode(AbstractBuild build, Node buildNode, EnvInjectLogger logger) throws EnvInjectException { - - EnvironmentVariablesNodeLoader environmentVariablesNodeLoader = new EnvironmentVariablesNodeLoader(); - Map configNodeEnvVars = environmentVariablesNodeLoader.gatherEnvironmentVariablesNode(build, buildNode, logger); - EnvInjectActionSetter envInjectActionSetter = new EnvInjectActionSetter(buildNode.getRootPath()); - try { - envInjectActionSetter.addEnvVarsToEnvInjectBuildAction(build, configNodeEnvVars); - - } catch (IOException ioe) { - throw new EnvInjectException(ioe); - } catch (InterruptedException ie) { - throw new EnvInjectException(ie); - } - } - - private boolean isEnvInjectJobPropertyActive(AbstractBuild build) { EnvInjectVariableGetter variableGetter = new EnvInjectVariableGetter(); EnvInjectJobProperty envInjectJobProperty = variableGetter.getEnvInjectJobProperty(build); diff --git a/src/test/java/org/jenkinsci/plugins/envinject/BuildCauseRetrieverTest.java b/src/test/java/org/jenkinsci/plugins/envinject/BuildCauseRetrieverTest.java index 344da9d4..f0b4bc93 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/BuildCauseRetrieverTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/BuildCauseRetrieverTest.java @@ -106,7 +106,6 @@ private void checkBuildCauses(FreeStyleBuild build, String expectedMainCauseValu Assert.assertNotNull(envVars); String causeValue = envVars.get("BUILD_CAUSE"); - Assert.assertNotNull(causeValue); Assert.assertEquals(expectedMainCauseValue, causeValue); String rootCauseValue = envVars.get("ROOT_BUILD_CAUSE"); diff --git a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java index 0b3becda..256fdf19 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java @@ -24,12 +24,10 @@ package org.jenkinsci.plugins.envinject; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher; import hudson.model.BuildListener; -import hudson.model.FreeStyleBuild; import hudson.model.TaskListener; import hudson.model.AbstractBuild; import hudson.model.EnvironmentContributor; @@ -37,13 +35,14 @@ import hudson.model.Run; import hudson.slaves.DumbSlave; import hudson.tasks.BuildWrapper; -import hudson.tasks.Shell; import java.io.IOException; import java.util.Map; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import org.jvnet.hudson.test.TestExtension; @@ -102,12 +101,12 @@ public class EnvInjectActionTest { validate(p); } - @SuppressWarnings("deprecation") private void validate(FreeStyleProject p) throws Exception { - p.getBuildersList().add(new Shell("echo actual=$DISPLAY")); - FreeStyleBuild build = p.scheduleBuild2(0).get(); - assertEquals("BUILD_VAL", build.getEnvironment().get("DISPLAY")); - assertTrue(build.getLog(), build.getLog().contains("actual=BUILD_VAL")); + CaptureEnvironmentBuilder capture = new CaptureEnvironmentBuilder(); + p.getBuildersList().add(capture); + + p.scheduleBuild2(0).get(); + assertEquals("BUILD_VAL", capture.getEnvVars().get("DISPLAY")); } private FreeStyleProject setupProjectWithDefaultEnvValue()throws Exception, IOException { @@ -165,17 +164,24 @@ public boolean perform( AbstractBuild build, Launcher launcher, BuildListener listener ) throws InterruptedException, IOException { // Start serving envvar from EnvironmentContributor - ContributingExtension.values(key, value); + contributor.values(key, value); return true; } } @TestExtension - public static final class ContributingExtension extends EnvironmentContributor { - private static String value = null; - private static String key = null; + public static final Contributor contributor = new Contributor(); + + @Before + public void setUp() { + contributor.values(null, null); + } + + private static class Contributor extends EnvironmentContributor { + private String value = null; + private String key = null; - private static void values(String k, String v) { + private void values(String k, String v) { value = v; key = k; } From 6f6a8dddec047dbe35a6ff90a2ad7c13f732eb9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Tue, 5 May 2015 11:58:24 +0200 Subject: [PATCH 4/4] [JENKINS-26583] style --- .../envinject/EnvInjectActionTest.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java index 256fdf19..ae4a424e 100644 --- a/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java +++ b/src/test/java/org/jenkinsci/plugins/envinject/EnvInjectActionTest.java @@ -49,34 +49,39 @@ public class EnvInjectActionTest { - @Rule public JenkinsRule j = new JenkinsRule(); + @Rule + public JenkinsRule j = new JenkinsRule(); - @Test public void doNotOverrideWrapperEnvVar() throws Exception { + @Test + public void doNotOverrideWrapperEnvVar() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); - validate(p); + assertValueInjected(p); } - @Test public void doNotOverrideContributorEnvVar() throws Exception { + @Test + public void doNotOverrideContributorEnvVar() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); p.getBuildersList().add(new ContributingBuilder("DISPLAY", "BUILD_VAL")); - validate(p); + assertValueInjected(p); } - @Test public void doNotOverrideWithBuildStep() throws Exception { + @Test + public void doNotOverrideWithBuildStep() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); p.getBuildersList().add(new EnvInjectBuilder(null, "IRRELEVANT_VAR=true")); p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); - validate(p); + assertValueInjected(p); } - @Test public void doNotOverrideWithBuildWrapper() throws Exception { + @Test + public void doNotOverrideWithBuildWrapper() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); final EnvInjectBuildWrapper wrapper = new EnvInjectBuildWrapper(); p.getBuildWrappersList().add(wrapper); @@ -85,10 +90,11 @@ public class EnvInjectActionTest { p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); - validate(p); + assertValueInjected(p); } - @Test public void doNotOverrideWithPasswordWrapper() throws Exception { + @Test + public void doNotOverrideWithPasswordWrapper() throws Exception { FreeStyleProject p = setupProjectWithDefaultEnvValue(); final EnvInjectPasswordWrapper wrapper = new EnvInjectPasswordWrapper(); wrapper.setPasswordEntries(new EnvInjectPasswordEntry[] { @@ -98,10 +104,10 @@ public class EnvInjectActionTest { p.getBuildWrappersList().add(new ContributingWrapper("DISPLAY", "BUILD_VAL")); - validate(p); + assertValueInjected(p); } - private void validate(FreeStyleProject p) throws Exception { + private void assertValueInjected(FreeStyleProject p) throws Exception { CaptureEnvironmentBuilder capture = new CaptureEnvironmentBuilder(); p.getBuildersList().add(capture);