package net.serenitybdd.integration.jenkins.environment.rules; import com.google.common.base.Joiner; import net.serenitybdd.integration.jenkins.JenkinsInstance; import org.junit.rules.TestRule; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import static com.google.common.base.Preconditions.checkArgument; import static java.util.Arrays.asList; public class InstallPluginsFromDisk implements ApplicativeTestRule<JenkinsInstance> { private static final Logger Log = LoggerFactory.getLogger(InstallPluginsFromDisk.class); private final List<Path> pluginsToInstall; public InstallPluginsFromDisk(Path... pluginsToInstall) { this.pluginsToInstall = asList(pluginsToInstall); } @Override public TestRule applyTo(final JenkinsInstance jenkins) { return new TestWatcher() { @Override protected void starting(Description description) { Path pluginsDir = jenkins.home().resolve("plugins"); String plugins = Joiner.on(", ").join(pluginsToInstall); Log.info("Installing {} into {}", plugins, pluginsDir); try { Files.createDirectories(jenkins.home().resolve("plugins")); for (Path plugin : pluginsToInstall) { Files.copy(existing(plugin), pluginsDir.resolve(plugin.getFileName())); } } catch (IOException e) { throw new RuntimeException(String.format("Couldn't install '%s' under '%s'", plugins, pluginsDir.toAbsolutePath())); } } private Path existing(Path plugin) { checkArgument(Files.exists(plugin), String.format("Plugin file '%s' doesn't exist and couldn't be installed.", plugin)); return plugin; } }; } }