package hudson.slaves; import static org.junit.Assert.assertEquals; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Node; import hudson.model.ParametersDefinitionProperty; import hudson.model.Result; import hudson.model.StringParameterDefinition; import hudson.slaves.EnvironmentVariablesNodeProperty.Entry; import java.io.IOException; import java.util.Collections; import java.util.Map; import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.HudsonTestCase; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * This class tests that environment variables from node properties are applied, * and that the priority is maintained: parameters > slave node properties > * master node properties */ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { private DumbSlave slave; private FreeStyleProject project; /** * Slave properties are available */ public void testSlavePropertyOnSlave() throws Exception { setVariables(slave, new Entry("KEY", "slaveValue")); Map<String, String> envVars = executeBuild(slave); assertEquals("slaveValue", envVars.get("KEY")); } /** * Master properties are available */ public void testMasterPropertyOnMaster() throws Exception { jenkins.getGlobalNodeProperties().replaceBy( Collections.singleton(new EnvironmentVariablesNodeProperty( new Entry("KEY", "masterValue")))); Map<String, String> envVars = executeBuild(jenkins); assertEquals("masterValue", envVars.get("KEY")); } /** * Both slave and master properties are available, but slave properties have priority */ public void testSlaveAndMasterPropertyOnSlave() throws Exception { jenkins.getGlobalNodeProperties().replaceBy( Collections.singleton(new EnvironmentVariablesNodeProperty( new Entry("KEY", "masterValue")))); setVariables(slave, new Entry("KEY", "slaveValue")); Map<String, String> envVars = executeBuild(slave); assertEquals("slaveValue", envVars.get("KEY")); } /** * Slave and master properties and parameters are available. * Priority: parameters > slave > master * @throws Exception */ public void testSlaveAndMasterPropertyAndParameterOnSlave() throws Exception { ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( new StringParameterDefinition("KEY", "parameterValue")); project.addProperty(pdp); setVariables(jenkins, new Entry("KEY", "masterValue")); setVariables(slave, new Entry("KEY", "slaveValue")); Map<String, String> envVars = executeBuild(slave); assertEquals("parameterValue", envVars.get("KEY")); } public void testVariableResolving() throws Exception { jenkins.getGlobalNodeProperties().replaceBy( Collections.singleton(new EnvironmentVariablesNodeProperty( new Entry("KEY1", "value"), new Entry("KEY2", "$KEY1")))); Map<String,String> envVars = executeBuild(jenkins); assertEquals("value", envVars.get("KEY1")); assertEquals("value", envVars.get("KEY2")); } public void testFormRoundTripForMaster() throws Exception { jenkins.getGlobalNodeProperties().replaceBy( Collections.singleton(new EnvironmentVariablesNodeProperty( new Entry("KEY", "value")))); WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage(jenkins, "configure"); HtmlForm form = page.getFormByName("config"); submit(form); assertEquals(1, jenkins.getGlobalNodeProperties().toList().size()); EnvironmentVariablesNodeProperty prop = jenkins.getGlobalNodeProperties().get(EnvironmentVariablesNodeProperty.class); assertEquals(1, prop.getEnvVars().size()); assertEquals("value", prop.getEnvVars().get("KEY")); } public void testFormRoundTripForSlave() throws Exception { setVariables(slave, new Entry("KEY", "value")); WebClient webClient = new WebClient(); HtmlPage page = webClient.getPage(slave, "configure"); HtmlForm form = page.getFormByName("config"); submit(form); assertEquals(1, slave.getNodeProperties().toList().size()); EnvironmentVariablesNodeProperty prop = slave.getNodeProperties().get(EnvironmentVariablesNodeProperty.class); assertEquals(1, prop.getEnvVars().size()); assertEquals("value", prop.getEnvVars().get("KEY")); } // //////////////////////// setup ////////////////////////////////////////// public void setUp() throws Exception { super.setUp(); slave = createSlave(); project = createFreeStyleProject(); } // ////////////////////// helper methods ///////////////////////////////// private void setVariables(Node node, Entry... entries) throws IOException { node.getNodeProperties().replaceBy( Collections.singleton(new EnvironmentVariablesNodeProperty( entries))); } /** * Launches project on this node, waits for the result, and returns the environment that is used */ private Map<String, String> executeBuild(Node node) throws Exception { CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder(); project.getBuildersList().add(builder); project.setAssignedLabel(node.getSelfLabel()); // use a timeout so we don't wait infinitely in case of failure FreeStyleBuild build = project.scheduleBuild2(0).get(/*10, TimeUnit.SECONDS*/); System.out.println(build.getLog()); assertEquals(Result.SUCCESS, build.getResult()); return builder.getEnvVars(); } }