package hudson.tools;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlFormUtil;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import hudson.tools.JDKInstaller.DescriptorImpl;
import org.junit.Assume;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import hudson.model.JDK;
import hudson.model.FreeStyleProject;
import hudson.model.FreeStyleBuild;
import hudson.model.TaskListener;
import hudson.tasks.Shell;
import hudson.util.StreamTaskListener;
import hudson.tools.JDKInstaller.Platform;
import hudson.tools.JDKInstaller.CPU;
import hudson.FilePath;
import hudson.Functions;
import hudson.Launcher.LocalLauncher;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;
import java.util.logging.Logger;
import org.junit.rules.TemporaryFolder;
import org.jvnet.hudson.test.Issue;
import org.jvnet.hudson.test.JenkinsRule;
import org.xml.sax.SAXException;
/**
* @author Kohsuke Kawaguchi
*/
public class JDKInstallerTest {
@Rule
public JenkinsRule j = new JenkinsRule();
@Rule
public TemporaryFolder tmp = new TemporaryFolder();
@Before
public void setUp() throws Exception {
File f = new File(new File(System.getProperty("user.home")),".jenkins-ci.org");
if (!f.exists()) {
LOGGER.warning(f+" doesn't exist. Skipping JDK installation tests");
} else {
Properties prop = new Properties();
FileInputStream in = new FileInputStream(f);
try {
prop.load(in);
String u = prop.getProperty("oracle.userName");
String p = prop.getProperty("oracle.password");
if (u==null || p==null) {
LOGGER.warning(f+" doesn't contain oracle.userName and oracle.password. Skipping JDK installation tests.");
} else {
DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class);
d.doPostCredential(u,p);
}
} finally {
in.close();
}
}
}
@Test
public void enterCredential() throws Exception {
HtmlPage p = j.createWebClient().goTo("descriptorByName/hudson.tools.JDKInstaller/enterCredential");
HtmlForm form = p.getFormByName("postCredential");
form.getInputByName("username").setValueAttribute("foo");
form.getInputByName("password").setValueAttribute("bar");
HtmlFormUtil.submit(form, null);
DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class);
assertEquals("foo",d.getUsername());
assertEquals("bar",d.getPassword().getPlainText());
}
/**
* Tests the configuration round trip.
*/
@Test
public void configRoundtrip() throws Exception {
JDKInstaller installer = new JDKInstaller("jdk-6u13-oth-JPR@CDS-CDS_Developer", true);
j.jenkins.getJDKs().add(new JDK("test",tmp.getRoot().getAbsolutePath(), Arrays.asList(
new InstallSourceProperty(Arrays.<ToolInstaller>asList(installer)))));
j.submit(j.createWebClient().goTo("configureTools").getFormByName("config"));
JDK jdk = j.jenkins.getJDK("test");
InstallSourceProperty isp = jdk.getProperties().get(InstallSourceProperty.class);
assertEquals(1,isp.installers.size());
j.assertEqualBeans(installer, isp.installers.get(JDKInstaller.class), "id,acceptLicense");
}
/**
* Can we locate the bundles?
*/
@Test
public void locate() throws Exception {
Assume.assumeTrue("this is a really time consuming test, so only run it when we really want", Boolean.getBoolean("jenkins.testJDKInstaller"));
retrieveUpdateCenterData();
JDKInstaller i = new JDKInstaller("jdk-7u3-oth-JPR", true);
StreamTaskListener listener = StreamTaskListener.fromStdout();
i.locate(listener, Platform.LINUX, CPU.i386);
i.locate(listener, Platform.WINDOWS, CPU.amd64);
i.locate(listener, Platform.SOLARIS, CPU.Sparc);
}
private void retrieveUpdateCenterData() throws IOException, SAXException {
j.createWebClient().goTo("/"); // make sure data is loaded
}
/**
* Tests the auto installation.
*/
@Test
public void autoInstallation6u13() throws Exception {
doTestAutoInstallation("jdk-6u13-oth-JPR@CDS-CDS_Developer", "1.6.0_13-b03");
}
/**
* JDK7 is distributed as a gzip file
*/
@Test
public void autoInstallation7() throws Exception {
doTestAutoInstallation("jdk-7-oth-JPR", "1.7.0-b147");
}
@Test
@Issue("JENKINS-3989")
public void autoInstallation142_17() throws Exception {
doTestAutoInstallation("j2sdk-1.4.2_17-oth-JPR@CDS-CDS_Developer", "1.4.2_17-b06");
}
/**
* End-to-end installation test.
*/
private void doTestAutoInstallation(String id, String fullversion) throws Exception {
Assume.assumeTrue("this is a really time consuming test, so only run it when we really want", Boolean.getBoolean("jenkins.testJDKInstaller"));
retrieveUpdateCenterData();
JDKInstaller installer = new JDKInstaller(id, true);
JDK jdk = new JDK("test", tmp.getRoot().getAbsolutePath(), Arrays.asList(
new InstallSourceProperty(Arrays.<ToolInstaller>asList(installer))));
j.jenkins.getJDKs().add(jdk);
FreeStyleProject p = j.createFreeStyleProject();
p.setJDK(jdk);
p.getBuildersList().add(new Shell("java -fullversion\necho $JAVA_HOME"));
FreeStyleBuild b = j.buildAndAssertSuccess(p);
@SuppressWarnings("deprecation") String log = b.getLog();
System.out.println(log);
// make sure it runs with the JDK that just got installed
assertTrue(log.contains(fullversion));
assertTrue(log.contains(tmp.getRoot().getAbsolutePath()));
}
/**
* Fake installation on Unix.
*/
@Test
public void fakeUnixInstall() throws Exception {
Assume.assumeFalse("If we're on Windows, don't bother doing this", Functions.isWindows());
File bundle = File.createTempFile("fake-jdk-by-hudson","sh");
try {
new FilePath(bundle).write(
"#!/bin/bash -ex\n" +
"mkdir -p jdk1.6.0_dummy/bin\n" +
"touch jdk1.6.0_dummy/bin/java","ASCII");
TaskListener l = StreamTaskListener.fromStdout();
new JDKInstaller("",true).install(new LocalLauncher(l),Platform.LINUX,
new JDKInstaller.FilePathFileSystem(j.jenkins),l,tmp.getRoot().getPath(),bundle.getPath());
assertTrue(new File(tmp.getRoot(),"bin/java").exists());
} finally {
bundle.delete();
}
}
private static final Logger LOGGER = Logger.getLogger(JDKInstallerTest.class.getName());
}