package hudson.model; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.io.IOException; import hudson.EnvVars; import hudson.matrix.MatrixProject; import hudson.maven.MavenModuleSet; import hudson.tasks.Maven.MavenInstallation; import hudson.util.StreamTaskListener; import jenkins.model.Jenkins; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.ToolInstallations; /** * Tests that getEnvironment() calls outside of builds are safe. * * @author kutzi */ @Issue("JENKINS-11592") public class GetEnvironmentOutsideBuildTest extends HudsonTestCase { private int oldExecNum; @Override protected void runTest() throws Throwable { // Disable tests // It's unfortunately not working, yet, as whenJenkinsMasterHasNoExecutors is not working as expected } public void setUp() throws Exception { super.setUp(); this.oldExecNum = Jenkins.getInstance().getNumExecutors(); } public void tearDown() throws Exception { restoreOldNumExecutors(); super.tearDown(); } private void restoreOldNumExecutors() throws IOException { Jenkins.getInstance().setNumExecutors(this.oldExecNum); assertNotNull(Jenkins.getInstance().toComputer()); } private MavenModuleSet createSimpleMavenProject() throws Exception { MavenModuleSet project = jenkins.createProject(MavenModuleSet.class, "mms"); MavenInstallation mi = ToolInstallations.configureMaven3(); project.setScm(new ExtractResourceSCM(getClass().getResource( "/simple-projects.zip"))); project.setMaven(mi.getName()); project.setGoals("validate"); return project; } private void whenJenkinsMasterHasNoExecutors() throws IOException { Jenkins.getInstance().setNumExecutors(0); assertNull(Jenkins.getInstance().toComputer()); } public void testMaven() throws Exception { MavenModuleSet m = createSimpleMavenProject(); assertGetEnvironmentCallOutsideBuildWorks(m); } public void testFreestyle() throws Exception { FreeStyleProject project = createFreeStyleProject(); assertGetEnvironmentCallOutsideBuildWorks(project); } public void testMatrix() throws Exception { MatrixProject createMatrixProject = jenkins.createProject(MatrixProject.class, "mp"); assertGetEnvironmentCallOutsideBuildWorks(createMatrixProject); } @SuppressWarnings({"rawtypes", "unchecked"}) private void assertGetEnvironmentCallOutsideBuildWorks(AbstractProject job) throws Exception { AbstractBuild build = buildAndAssertSuccess(job); assertGetEnvironmentWorks(build); } @SuppressWarnings("rawtypes") private void assertGetEnvironmentWorks(Run build) throws IOException, InterruptedException { whenJenkinsMasterHasNoExecutors(); // and getEnvironment is called outside of build EnvVars envVars = build.getEnvironment(StreamTaskListener.fromStdout()); // then it should still succeed - i.e. no NPE o.s.l.t. assertNotNull(envVars); } }