Search in sources :

Example 1 with PluginSourcesUnavailableException

use of org.jenkins.tools.test.exception.PluginSourcesUnavailableException in project plugin-compat-tester by jenkinsci.

the class PluginRemoting method retrievePomContentFromHpi.

private String retrievePomContentFromHpi() throws PluginSourcesUnavailableException {
    try (InputStream pluginUrlStream = new URL(hpiRemoteUrl).openStream();
        ZipInputStream zin = new ZipInputStream(pluginUrlStream)) {
        ZipEntry zipEntry = zin.getNextEntry();
        while (!zipEntry.getName().startsWith("META-INF/maven") || !zipEntry.getName().endsWith("pom.xml")) {
            zin.closeEntry();
            zipEntry = zin.getNextEntry();
        }
        StringBuilder sb = new StringBuilder();
        byte[] buf = new byte[1024];
        int n;
        while ((n = zin.read(buf, 0, 1024)) > -1) sb.append(new String(buf, 0, n));
        return sb.toString();
    } catch (Exception e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem while retrieving pom content in hpi !", e);
    }
}
Also used : ZipInputStream(java.util.zip.ZipInputStream) ZipInputStream(java.util.zip.ZipInputStream) StringInputStream(org.apache.tools.ant.filters.StringInputStream) InputStream(java.io.InputStream) ZipEntry(java.util.zip.ZipEntry) PluginSourcesUnavailableException(org.jenkins.tools.test.exception.PluginSourcesUnavailableException) URL(java.net.URL) XPathExpressionException(javax.xml.xpath.XPathExpressionException) IOException(java.io.IOException) PluginSourcesUnavailableException(org.jenkins.tools.test.exception.PluginSourcesUnavailableException) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) SAXException(org.xml.sax.SAXException)

Example 2 with PluginSourcesUnavailableException

use of org.jenkins.tools.test.exception.PluginSourcesUnavailableException in project plugin-compat-tester by jenkinsci.

the class PluginRemoting method retrievePomData.

public PomData retrievePomData() throws PluginSourcesUnavailableException {
    String scmConnection = null;
    String artifactId = null;
    String pomContent = this.retrievePomContent();
    MavenCoordinates parent;
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
    try {
        DocumentBuilder builder = docBuilderFactory.newDocumentBuilder();
        Document doc = builder.parse(new StringInputStream(pomContent));
        XPathFactory xpathFactory = XPathFactory.newInstance();
        XPath xpath = xpathFactory.newXPath();
        XPathExpression scmConnectionXPath = xpath.compile("/project/scm/connection/text()");
        XPathExpression artifactIdXPath = xpath.compile("/project/artifactId/text()");
        scmConnection = (String) scmConnectionXPath.evaluate(doc, XPathConstants.STRING);
        artifactId = (String) artifactIdXPath.evaluate(doc, XPathConstants.STRING);
        parent = new MavenCoordinates(xpath.evaluate("/project/parent/groupId/text()", doc), xpath.evaluate("/project/parent/artifactId/text()", doc), xpath.evaluate("/project/parent/version/text()", doc));
    } catch (ParserConfigurationException e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem during pom.xml parsing", e);
    } catch (SAXException e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem during pom.xml parsing", e);
    } catch (IOException e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem during pom.xml parsing", e);
    } catch (XPathExpressionException e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem while retrieving plugin's scm connection", e);
    }
    PomData pomData = new PomData(artifactId, scmConnection, parent);
    computeScmConnection(pomData);
    return pomData;
}
Also used : XPath(javax.xml.xpath.XPath) XPathExpression(javax.xml.xpath.XPathExpression) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) XPathExpressionException(javax.xml.xpath.XPathExpressionException) IOException(java.io.IOException) Document(org.w3c.dom.Document) SAXException(org.xml.sax.SAXException) XPathFactory(javax.xml.xpath.XPathFactory) StringInputStream(org.apache.tools.ant.filters.StringInputStream) DocumentBuilder(javax.xml.parsers.DocumentBuilder) ParserConfigurationException(javax.xml.parsers.ParserConfigurationException) PluginSourcesUnavailableException(org.jenkins.tools.test.exception.PluginSourcesUnavailableException)

Example 3 with PluginSourcesUnavailableException

use of org.jenkins.tools.test.exception.PluginSourcesUnavailableException in project plugin-compat-tester by jenkinsci.

the class PluginCompatTester method testPluginAgainst.

private TestExecutionResult testPluginAgainst(MavenCoordinates coreCoordinates, Plugin plugin, MavenRunner.Config mconfig, PomData pomData, Map<String, Plugin> otherPlugins, Map<String, String> pluginGroupIds, PluginCompatTesterHooks pcth) throws PluginSourcesUnavailableException, PomTransformationException, PomExecutionException, IOException {
    System.out.println(String.format("%n%n%n%n%n"));
    System.out.println(String.format("#############################################"));
    System.out.println(String.format("#############################################"));
    System.out.println(String.format("##%n## Starting to test plugin %s v%s%n## against %s%n##", plugin.name, plugin.version, coreCoordinates));
    System.out.println(String.format("#############################################"));
    System.out.println(String.format("#############################################"));
    System.out.println(String.format("%n%n%n%n%n"));
    File pluginCheckoutDir = new File(config.workDirectory.getAbsolutePath() + File.separator + plugin.name + File.separator);
    try {
        // Run any precheckout hooks
        Map<String, Object> beforeCheckout = new HashMap<String, Object>();
        beforeCheckout.put("pluginName", plugin.name);
        beforeCheckout.put("plugin", plugin);
        beforeCheckout.put("pomData", pomData);
        beforeCheckout.put("config", config);
        beforeCheckout.put("runCheckout", true);
        beforeCheckout = pcth.runBeforeCheckout(beforeCheckout);
        if (beforeCheckout.get("executionResult") != null) {
            // Check if the hook returned a result
            return (TestExecutionResult) beforeCheckout.get("executionResult");
        } else if ((boolean) beforeCheckout.get("runCheckout")) {
            if (beforeCheckout.get("checkoutDir") != null) {
                pluginCheckoutDir = (File) beforeCheckout.get("checkoutDir");
            }
            if (pluginCheckoutDir.exists()) {
                System.out.println("Deleting working directory " + pluginCheckoutDir.getAbsolutePath());
                FileUtils.deleteDirectory(pluginCheckoutDir);
            }
            pluginCheckoutDir.mkdir();
            System.out.println("Created plugin checkout dir : " + pluginCheckoutDir.getAbsolutePath());
            if (localCheckoutProvided()) {
                if (!onlyOnePluginIncluded()) {
                    File localCheckoutPluginDir = new File(config.getLocalCheckoutDir(), plugin.name);
                    File pomLocalCheckoutPluginDir = new File(localCheckoutPluginDir, "pom.xml");
                    if (pomLocalCheckoutPluginDir.exists()) {
                        System.out.println("Copy plugin directory from : " + localCheckoutPluginDir.getAbsolutePath());
                        FileUtils.copyDirectoryStructure(localCheckoutPluginDir, pluginCheckoutDir);
                    } else {
                        cloneFromSCM(pomData.getConnectionUrl(), plugin.name, plugin.version, pluginCheckoutDir);
                    }
                } else {
                    // TODO this fails when it encounters symlinks (e.g. work/jobs/…/builds/lastUnstableBuild),
                    // and even up-to-date versions of org.apache.commons.io.FileUtils seem to not handle links,
                    // so may need to use something like http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java
                    System.out.println("Copy plugin directory from : " + config.getLocalCheckoutDir().getAbsolutePath());
                    FileUtils.copyDirectoryStructure(config.getLocalCheckoutDir(), pluginCheckoutDir);
                }
            } else {
                // These hooks could redirect the SCM, skip checkout (if multiple plugins use the same preloaded repo)
                cloneFromSCM(pomData.getConnectionUrl(), plugin.name, plugin.version, pluginCheckoutDir);
            }
        } else {
            // If the plugin exists in a different directory (multimodule plugins)
            if (beforeCheckout.get("pluginDir") != null) {
                pluginCheckoutDir = (File) beforeCheckout.get("checkoutDir");
            }
            System.out.println("The plugin has already been checked out, likely due to a multimodule situation. Continue.");
        }
    } catch (ComponentLookupException e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem while creating ScmManager !", e);
    } catch (Exception e) {
        System.err.println("Error : " + e.getMessage());
        throw new PluginSourcesUnavailableException("Problem while checking out plugin sources!", e);
    }
    File buildLogFile = createBuildLogFile(config.reportFile, plugin.name, plugin.version, coreCoordinates);
    // Creating log directory
    FileUtils.forceMkdir(buildLogFile.getParentFile());
    // Creating log file
    FileUtils.fileWrite(buildLogFile.getAbsolutePath(), "");
    // Ran the BeforeCompileHooks
    Map<String, Object> beforeCompile = new HashMap<String, Object>();
    beforeCompile.put("pluginName", plugin.name);
    beforeCompile.put("plugin", plugin);
    beforeCompile.put("pluginDir", pluginCheckoutDir);
    beforeCompile.put("pomData", pomData);
    beforeCompile.put("config", config);
    beforeCompile.put("core", coreCoordinates);
    Map<String, Object> hookInfo = pcth.runBeforeCompilation(beforeCompile);
    boolean ranCompile = hookInfo.containsKey(PluginCompatTesterHookBeforeCompile.OVERRIDE_DEFAULT_COMPILE) ? (boolean) hookInfo.get(PluginCompatTesterHookBeforeCompile.OVERRIDE_DEFAULT_COMPILE) : false;
    try {
        // We also skip potential javadoc execution to avoid general test failure.
        if (!ranCompile) {
            runner.run(mconfig, pluginCheckoutDir, buildLogFile, "clean", "process-test-classes", "-Dmaven.javadoc.skip");
        }
        ranCompile = true;
        // Then transform the POM and run tests against that.
        // You might think that it would suffice to run e.g.
        // -Dmaven-surefire-plugin.version=2.15 -Dmaven.test.dependency.excludes=org.jenkins-ci.main:jenkins-war -Dmaven.test.additionalClasspath=/…/org/jenkins-ci/main/jenkins-war/1.580.1/jenkins-war-1.580.1.war clean test
        // (2.15+ required for ${maven.test.dependency.excludes} and ${maven.test.additionalClasspath} to be honored from CLI)
        // but it does not work; there are lots of linkage errors as some things are expected to be in the test classpath which are not.
        // Much simpler to do use the parent POM to set up the test classpath.
        MavenPom pom = new MavenPom(pluginCheckoutDir);
        try {
            addSplitPluginDependencies(plugin.name, mconfig, pluginCheckoutDir, pom, otherPlugins, pluginGroupIds, coreCoordinates.version);
        } catch (Exception x) {
            x.printStackTrace();
            pomData.getWarningMessages().add(Functions.printThrowable(x));
        // but continue
        }
        List<String> args = new ArrayList<String>();
        args.add("--define=maven.test.redirectTestOutputToFile=false");
        args.add("--define=concurrency=1");
        args.add("hpi:resolve-test-dependencies");
        args.add("hpi:test-hpl");
        args.add("surefire:test");
        // Run preexecution hooks
        Map<String, Object> forExecutionHooks = new HashMap<String, Object>();
        forExecutionHooks.put("pluginName", plugin.name);
        forExecutionHooks.put("args", args);
        forExecutionHooks.put("pomData", pomData);
        forExecutionHooks.put("pom", pom);
        forExecutionHooks.put("coreCoordinates", coreCoordinates);
        forExecutionHooks.put("config", config);
        forExecutionHooks.put("pluginDir", pluginCheckoutDir);
        pcth.runBeforeExecution(forExecutionHooks);
        runner.run(mconfig, pluginCheckoutDir, buildLogFile, ((List<String>) forExecutionHooks.get("args")).toArray(new String[args.size()]));
        return new TestExecutionResult(((PomData) forExecutionHooks.get("pomData")).getWarningMessages());
    } catch (PomExecutionException e) {
        PomExecutionException e2 = new PomExecutionException(e);
        e2.getPomWarningMessages().addAll(pomData.getWarningMessages());
        if (ranCompile) {
            // So the status is considered to be TEST_FAILURES not COMPILATION_ERROR:
            e2.succeededPluginArtifactIds.add("maven-compiler-plugin");
        }
        throw e2;
    }
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ComponentLookupException(org.codehaus.plexus.component.repository.exception.ComponentLookupException) PomExecutionException(org.jenkins.tools.test.exception.PomExecutionException) PlexusContainerException(org.codehaus.plexus.PlexusContainerException) PluginSourcesUnavailableException(org.jenkins.tools.test.exception.PluginSourcesUnavailableException) FileNotFoundException(java.io.FileNotFoundException) ScmException(org.apache.maven.scm.ScmException) TransformerException(javax.xml.transform.TransformerException) PomExecutionException(org.jenkins.tools.test.exception.PomExecutionException) PomTransformationException(org.jenkins.tools.test.exception.PomTransformationException) ComponentLookupException(org.codehaus.plexus.component.repository.exception.ComponentLookupException) MavenEmbedderException(hudson.maven.MavenEmbedderException) IOException(java.io.IOException) MavenPom(org.jenkins.tools.test.model.MavenPom) JSONObject(net.sf.json.JSONObject) PluginSourcesUnavailableException(org.jenkins.tools.test.exception.PluginSourcesUnavailableException) JarFile(java.util.jar.JarFile) File(java.io.File) TestExecutionResult(org.jenkins.tools.test.model.TestExecutionResult)

Aggregations

IOException (java.io.IOException)3 PluginSourcesUnavailableException (org.jenkins.tools.test.exception.PluginSourcesUnavailableException)3 ParserConfigurationException (javax.xml.parsers.ParserConfigurationException)2 XPathExpressionException (javax.xml.xpath.XPathExpressionException)2 StringInputStream (org.apache.tools.ant.filters.StringInputStream)2 SAXException (org.xml.sax.SAXException)2 MavenEmbedderException (hudson.maven.MavenEmbedderException)1 File (java.io.File)1 FileNotFoundException (java.io.FileNotFoundException)1 InputStream (java.io.InputStream)1 URL (java.net.URL)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 JarFile (java.util.jar.JarFile)1 ZipEntry (java.util.zip.ZipEntry)1 ZipInputStream (java.util.zip.ZipInputStream)1 DocumentBuilder (javax.xml.parsers.DocumentBuilder)1 DocumentBuilderFactory (javax.xml.parsers.DocumentBuilderFactory)1 TransformerException (javax.xml.transform.TransformerException)1 XPath (javax.xml.xpath.XPath)1