package net.serenitybdd.integration.jenkins.environment.rules;
import com.smartcodeltd.aether.ArtifactTransporter;
import net.serenitybdd.integration.jenkins.JenkinsArtifactTransporter;
import net.serenitybdd.integration.jenkins.JenkinsInstance;
import net.serenitybdd.integration.jenkins.client.JenkinsClient;
import net.serenitybdd.integration.jenkins.client.JenkinsClientExecutor;
import net.serenitybdd.integration.jenkins.process.JenkinsProcess;
import net.serenitybdd.integration.utils.CommandLineTools;
import org.junit.rules.TestRule;
import org.junit.rules.TestWatcher;
import org.junit.runner.Description;
import java.io.IOException;
import java.nio.file.Path;
public class ManageJenkinsServer implements ApplicativeTestRule<JenkinsInstance> {
private final Path javaExecutable;
private final ArtifactTransporter transporter;
public ManageJenkinsServer() {
this(JenkinsArtifactTransporter.create());
}
public ManageJenkinsServer(ArtifactTransporter transporter) {
this(CommandLineTools.java(), transporter);
}
public ManageJenkinsServer(Path javaExecutable, ArtifactTransporter artifactTransporter) {
this.javaExecutable = javaExecutable;
this.transporter = artifactTransporter;
}
@Override
public TestRule applyTo(final JenkinsInstance jenkins) {
return new TestWatcher() {
private JenkinsProcess process;
@Override
protected void starting(Description description) {
process = jenkinsProcessFor(jenkins, warFileOf(jenkins));
try {
process.start();
} catch (IOException e) {
throw new RuntimeException("Couldn't start Jenkins", e);
}
JenkinsClientExecutor executor = new JenkinsClientExecutor(jenkins.url());
jenkins.setClient(new JenkinsClient(executor, process));
}
@Override
protected void finished(Description description) {
process.stop();
}
};
}
private Path warFileOf(JenkinsInstance jenkins) {
return transporter.get("org.jenkins-ci.main", "jenkins-war", jenkins.version(), "war");
}
private JenkinsProcess jenkinsProcessFor(JenkinsInstance jenkins, Path war) {
Path java = CommandLineTools.java();
return new JenkinsProcess(java, war, jenkins.port(), jenkins.home());
}
}