/* * The MIT License * * Copyright (c) 2004-2010, Sun Microsystems, Inc., Tom Huybrechts * * 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 hudson.tools; import static org.junit.Assert.assertEquals; import hudson.Functions; import hudson.model.*; import hudson.model.labels.LabelAtom; import hudson.slaves.DumbSlave; import hudson.tasks.Maven; import hudson.tasks.BatchFile; import hudson.tasks.Ant; import hudson.tasks.Shell; import hudson.tasks.Ant.AntInstallation; import hudson.tasks.Maven.MavenInstallation; import hudson.EnvVars; import hudson.maven.MavenModuleSet; import java.io.IOException; import jenkins.model.Jenkins; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.SingleFileSCM; import org.jvnet.hudson.test.ExtractResourceSCM; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.ToolInstallations; /** * 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 ToolLocationNodePropertyTest { @Rule public JenkinsRule j = new JenkinsRule(); @Rule public TemporaryFolder tmp = new TemporaryFolder(); private DumbSlave slave; private FreeStyleProject project; @Test public void formRoundTrip() throws Exception { MavenInstallation.DescriptorImpl mavenDescriptor = j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class); mavenDescriptor.setInstallations(new MavenInstallation("maven", "XXX", j.NO_PROPERTIES)); AntInstallation.DescriptorImpl antDescriptor = j.jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class); antDescriptor.setInstallations(new AntInstallation("ant", "XXX", j.NO_PROPERTIES)); JDK.DescriptorImpl jdkDescriptor = j.jenkins.getDescriptorByType(JDK.DescriptorImpl.class); jdkDescriptor.setInstallations(new JDK("jdk", "XXX")); ToolLocationNodeProperty property = new ToolLocationNodeProperty( new ToolLocationNodeProperty.ToolLocation(jdkDescriptor, "jdk", "foobar"), new ToolLocationNodeProperty.ToolLocation(mavenDescriptor, "maven", "barzot"), new ToolLocationNodeProperty.ToolLocation(antDescriptor, "ant", "zotfoo")); slave.getNodeProperties().add(property); WebClient webClient = j.createWebClient(); HtmlPage page = webClient.getPage(slave, "configure"); HtmlForm form = page.getFormByName("config"); j.submit(form); assertEquals(1, slave.getNodeProperties().toList().size()); ToolLocationNodeProperty prop = slave.getNodeProperties().get(ToolLocationNodeProperty.class); assertEquals(3, prop.getLocations().size()); ToolLocationNodeProperty.ToolLocation location = prop.getLocations().get(0); assertEquals(jdkDescriptor, location.getType()); assertEquals("jdk", location.getName()); assertEquals("foobar", location.getHome()); location = prop.getLocations().get(1); assertEquals(mavenDescriptor, location.getType()); assertEquals("maven", location.getName()); assertEquals("barzot", location.getHome()); location = prop.getLocations().get(2); assertEquals(antDescriptor, location.getType()); assertEquals("ant", location.getName()); assertEquals("zotfoo", location.getHome()); } @Test public void maven() throws Exception { MavenInstallation maven = ToolInstallations.configureDefaultMaven(); String mavenPath = maven.getHome(); Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", j.NO_PROPERTIES)); project.getBuildersList().add(new Maven("--version", "maven")); configureDumpEnvBuilder(); Build build = project.scheduleBuild2(0).get(); j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); j.assertBuildStatus(Result.SUCCESS, build); } private void configureDumpEnvBuilder() throws IOException { if(Functions.isWindows()) project.getBuildersList().add(new BatchFile("set")); else project.getBuildersList().add(new Shell("export")); } @Test public void ant() throws Exception { Ant.AntInstallation ant = ToolInstallations.configureDefaultAnt(tmp); String antPath = ant.getHome(); Jenkins.getInstance().getDescriptorByType(Ant.DescriptorImpl.class).setInstallations(new AntInstallation("ant", "THIS IS WRONG")); project.setScm(new SingleFileSCM("build.xml", "<project name='foo'/>")); project.getBuildersList().add(new Ant("-version", "ant", null,null,null)); configureDumpEnvBuilder(); Build build = project.scheduleBuild2(0).get(); j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class), "ant", antPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); System.out.println(build.getLog()); j.assertBuildStatus(Result.SUCCESS, build); } @Test public void nativeMaven() throws Exception { MavenInstallation maven = ToolInstallations.configureDefaultMaven(); String mavenPath = maven.getHome(); Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", j.NO_PROPERTIES)); MavenModuleSet project = j.jenkins.createProject(MavenModuleSet.class, "p"); project.setScm(new ExtractResourceSCM(getClass().getResource( "/simple-projects.zip"))); project.setAssignedLabel(slave.getSelfLabel()); project.setJDK(j.jenkins.getJDK("default")); project.setMaven("maven"); project.setGoals("clean"); Run build = project.scheduleBuild2(0).get(); j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); System.out.println(build.getLog()); j.assertBuildStatus(Result.SUCCESS, build); } @Before public void setUp() throws Exception { EnvVars env = new EnvVars(); // we don't want Maven, Ant, etc. to be discovered in the path for this test to work, // but on Unix these tools rely on other basic Unix tools (like env) for its operation, // so empty path breaks the test. env.put("PATH", "/bin:/usr/bin"); env.put("M2_HOME", "empty"); slave = j.createSlave(new LabelAtom("slave"), env); project = j.createFreeStyleProject(); project.setAssignedLabel(slave.getSelfLabel()); } }