From 2100439cf0625cb1e4b480de2d90d7105443a6ef Mon Sep 17 00:00:00 2001 From: Jan Sievers Date: Tue, 4 Sep 2012 16:02:52 +0200 Subject: [PATCH] POC 386481 update maven surefire to latest version 2.17 while SUREFIRE-825 and SUREFIRE-876 are fixed, there are several new problems: 1. The junit47 provider is broken again (probably due to junit bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=318299 2. the internal structure of surefire chnaged significantly (new jars need to be pulled into OSGi, the Surefire booter/starter API changed, directory scanning must now be done in the TestMojo already 3. The most sever issue here is that we don't have the dependencies of surefire under control and what used to be more or less self-contained (surefire-api and surefire-booter) now drags in lots of dependencies which we don't really want to wrap in OSGi. I only added those actually needed by what we are using, the correct list of dependent jars would be much longer. Change-Id: Ibcb439a24add880c4cdafe67b42e29ca3cb14ff1 --- .../META-INF/MANIFEST.MF | 2 +- .../build.properties | 2 +- .../META-INF/MANIFEST.MF | 2 +- .../build.properties | 2 +- .../META-INF/MANIFEST.MF | 7 +++-- .../build.properties | 2 +- .../org.eclipse.tycho.surefire.junit47/pom.xml | 10 ++++++ .../junitcore/OsgiEnabledJUnitCoreProvider.java | 4 +-- .../META-INF/MANIFEST.MF | 6 ++-- .../org.eclipse.tycho.surefire.osgibooter/pom.xml | 10 ++++++ .../surefire/osgibooter/OsgiSurefireBooter.java | 36 ++++++++++++++-------- .../osgibooter/TychoClasspathConfiguration.java | 35 +++++++++++++++------ tycho-surefire/pom.xml | 2 +- tycho-surefire/tycho-surefire-plugin/pom.xml | 5 +++ .../java/org/eclipse/tycho/surefire/TestMojo.java | 29 +++++++++++++++-- .../surefire/provider/impl/JUnit47Provider.java | 2 +- 16 files changed, 118 insertions(+), 38 deletions(-) diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit/META-INF/MANIFEST.MF b/tycho-surefire/org.eclipse.tycho.surefire.junit/META-INF/MANIFEST.MF index a2522b5..0063b71 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit/META-INF/MANIFEST.MF +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit/META-INF/MANIFEST.MF @@ -7,5 +7,5 @@ Fragment-Host: org.eclipse.tycho.surefire.osgibooter;bundle-version="0.14.0" Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6 Require-Bundle: org.junit;bundle-version="[3.8.0,4.0.0)" -Bundle-ClassPath: jars/surefire-junit3-2.10.jar +Bundle-ClassPath: jars/surefire-junit3-2.15.jar Bundle-Vendor: %providerName diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit/build.properties b/tycho-surefire/org.eclipse.tycho.surefire.junit/build.properties index 499ce76..fe88b19 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit/build.properties +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit/build.properties @@ -9,5 +9,5 @@ # Sonatype Inc. - initial API and implementation ############################################################################### bin.includes = META-INF/,\ - jars/surefire-junit3-2.10.jar,\ + jars/,\ plugin.properties diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit4/META-INF/MANIFEST.MF b/tycho-surefire/org.eclipse.tycho.surefire.junit4/META-INF/MANIFEST.MF index 8597932..861e0d7 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit4/META-INF/MANIFEST.MF +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit4/META-INF/MANIFEST.MF @@ -6,7 +6,7 @@ Bundle-Version: 0.21.0 Fragment-Host: org.eclipse.tycho.surefire.osgibooter;bundle-version="0.14.0" Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6 -Bundle-ClassPath: jars/surefire-junit4-2.10.jar +Bundle-ClassPath: jars/surefire-junit4-2.15.jar Import-Package: junit.framework;version="3.0.0", org.junit;version="4.0.0", org.junit.runner;version="4.0.0", diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit4/build.properties b/tycho-surefire/org.eclipse.tycho.surefire.junit4/build.properties index b787149..fe88b19 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit4/build.properties +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit4/build.properties @@ -9,5 +9,5 @@ # Sonatype Inc. - initial API and implementation ############################################################################### bin.includes = META-INF/,\ - jars/surefire-junit4-2.10.jar,\ + jars/,\ plugin.properties diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit47/META-INF/MANIFEST.MF b/tycho-surefire/org.eclipse.tycho.surefire.junit47/META-INF/MANIFEST.MF index a26db94..6e0cebb 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit47/META-INF/MANIFEST.MF +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit47/META-INF/MANIFEST.MF @@ -6,11 +6,14 @@ Bundle-Version: 0.21.0 Fragment-Host: org.eclipse.tycho.surefire.osgibooter;bundle-version="0.16.0" Bundle-RequiredExecutionEnvironment: J2SE-1.5 Bundle-ClassPath: ., - jars/surefire-junit47-2.10.jar + jars/surefire-junit47-2.15.jar, + jars/common-junit48-2.15.jar, + jars/surefire-grouper-2.15.jar Import-Package: junit.framework;version="3.0.0", org.junit;version="[4.7,5)", org.junit.runner;version="[4.7,5)", org.junit.runner.notification;version="[4.7,5)", org.junit.runners;version="[4.7,5)", - org.junit.runners.model;version="[4.7,5)" + org.junit.runners.model;version="[4.7,5)", + org.junit.runner.manipulation;version="[4.7,5)" Bundle-Vendor: %providerName diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit47/build.properties b/tycho-surefire/org.eclipse.tycho.surefire.junit47/build.properties index 61905c2..41bdc39 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit47/build.properties +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit47/build.properties @@ -10,7 +10,7 @@ ############################################################################### bin.includes = .,\ META-INF/,\ - jars/surefire-junit47-2.10.jar,\ + jars/,\ plugin.properties,\ about.html,\ about_files/ diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit47/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.junit47/pom.xml index 9e0bfb6..e217cdf 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit47/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit47/pom.xml @@ -44,6 +44,16 @@ surefire-junit47 ${surefire-version} + + org.apache.maven.surefire + common-junit48 + ${surefire-version} + + + org.apache.maven.surefire + surefire-grouper + ${surefire-version} + diff --git a/tycho-surefire/org.eclipse.tycho.surefire.junit47/src/main/java/org/apache/maven/surefire/junitcore/OsgiEnabledJUnitCoreProvider.java b/tycho-surefire/org.eclipse.tycho.surefire.junit47/src/main/java/org/apache/maven/surefire/junitcore/OsgiEnabledJUnitCoreProvider.java index eaa8dc4..3b8ca14 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.junit47/src/main/java/org/apache/maven/surefire/junitcore/OsgiEnabledJUnitCoreProvider.java +++ b/tycho-surefire/org.eclipse.tycho.surefire.junit47/src/main/java/org/apache/maven/surefire/junitcore/OsgiEnabledJUnitCoreProvider.java @@ -105,7 +105,7 @@ public class OsgiEnabledJUnitCoreProvider } final Map testSetMap = new ConcurrentHashMap(); - RunListener listener = ConcurrentReporterManager.createInstance( testSetMap, reporterFactory, + RunListener listener = ConcurrentRunListener.createInstance( testSetMap, reporterFactory, jUnitCoreParameters.isParallelClasses(), jUnitCoreParameters.isParallelBoth(), consoleLogger ); @@ -115,7 +115,7 @@ public class OsgiEnabledJUnitCoreProvider org.junit.runner.notification.RunListener jUnit4RunListener = new OsgiEnabledJUnitCoreRunListener( listener, testSetMap ); customRunListeners.add( 0, jUnit4RunListener ); - JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners ); + JUnitCoreWrapper.execute( testsToRun, jUnitCoreParameters, customRunListeners, org.junit.runner.manipulation.Filter.ALL ); return reporterFactory.close(); } diff --git a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/META-INF/MANIFEST.MF b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/META-INF/MANIFEST.MF index fb1165d..6d4b688 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/META-INF/MANIFEST.MF +++ b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/META-INF/MANIFEST.MF @@ -4,8 +4,10 @@ Require-Bundle: org.eclipse.osgi;bundle-version="3.2.2", org.eclipse.core.runtime;bundle-version="3.2.0" Eclipse-AutoStart: true Bundle-ClassPath: ., - jars/surefire-booter-2.10.jar, - jars/surefire-api-2.10.jar + jars/surefire-booter-2.15.jar, + jars/surefire-api-2.15.jar, + jars/maven-surefire-common-2.15.jar, + jars/plexus-utils-3.0.jar Bundle-Version: 0.21.0 Bundle-Name: Tycho Surefire OSGi Booter Eclipse Application (Incubation) Bundle-ManifestVersion: 2 diff --git a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/pom.xml b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/pom.xml index 36b75b6..27aa6f6 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/pom.xml +++ b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/pom.xml @@ -52,6 +52,16 @@ surefire-booter ${surefire-version} + + org.apache.maven.surefire + maven-surefire-common + ${surefire-version} + + + org.codehaus.plexus + plexus-utils + 3.0 + diff --git a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/OsgiSurefireBooter.java b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/OsgiSurefireBooter.java index c1de8ec..b81b853 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/OsgiSurefireBooter.java +++ b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/OsgiSurefireBooter.java @@ -19,20 +19,25 @@ import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; +import org.apache.maven.plugin.surefire.StartupReportConfiguration; +import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; import org.apache.maven.surefire.booter.ClassLoaderConfiguration; +import org.apache.maven.surefire.booter.ForkedBooter; import org.apache.maven.surefire.booter.ProviderConfiguration; +import org.apache.maven.surefire.booter.ProviderFactory; import org.apache.maven.surefire.booter.StartupConfiguration; -import org.apache.maven.surefire.booter.StartupReportConfiguration; -import org.apache.maven.surefire.booter.SurefireStarter; import org.apache.maven.surefire.report.ReporterConfiguration; +import org.apache.maven.surefire.report.ReporterFactory; import org.apache.maven.surefire.suite.RunResult; import org.apache.maven.surefire.testset.DirectoryScannerParameters; +import org.apache.maven.surefire.testset.RunOrderParameters; import org.apache.maven.surefire.testset.TestRequest; import org.apache.maven.surefire.util.RunOrder; import org.eclipse.core.runtime.CoreException; @@ -57,7 +62,7 @@ public class OsgiSurefireBooter { List includes = getIncludesExcludes(testProps.getProperty("includes")); List excludes = getIncludesExcludes(testProps.getProperty("excludes")); - String forkMode = "never"; + boolean forkRequested = true; boolean inForkedVM = true; boolean trimStacktrace = true; boolean useSystemClassloader = false; @@ -66,26 +71,31 @@ public class OsgiSurefireBooter { boolean printSummary = true; boolean disableXmlReport = false; ClassLoader testClassLoader = getBundleClassLoader(plugin); - ClassLoader surefireClassLoader = SurefireStarter.class.getClassLoader(); + ClassLoader surefireClassLoader = ForkedBooter.class.getClassLoader(); TychoClasspathConfiguration classPathConfig = new TychoClasspathConfiguration(testClassLoader, surefireClassLoader); StartupConfiguration startupConfiguration = new StartupConfiguration(provider, classPathConfig, - new ClassLoaderConfiguration(useSystemClassloader, useManifestOnlyJar), forkMode, inForkedVM); + new ClassLoaderConfiguration(useSystemClassloader, useManifestOnlyJar), forkRequested, inForkedVM); DirectoryScannerParameters dirScannerParams = new DirectoryScannerParameters(testClassesDir, includes, - excludes, failIfNoTests, RunOrder.valueOf(runOrder)); + excludes, Collections.emptyList(), failIfNoTests, RunOrder.valueOf(runOrder).toString()); ReporterConfiguration reporterConfig = new ReporterConfiguration(reportsDir, trimStacktrace); TestRequest testRequest = new TestRequest(null, testClassesDir, null); - ProviderConfiguration providerConfiguration = new ProviderConfiguration(dirScannerParams, failIfNoTests, - reporterConfig, null, testRequest, extractProviderProperties(testProps), null); + ProviderConfiguration providerConfiguration = new ProviderConfiguration(dirScannerParams, + new RunOrderParameters((String) null, null), failIfNoTests, reporterConfig, null, testRequest, + extractProviderProperties(testProps), null, false); StartupReportConfiguration startupReportConfig = new StartupReportConfiguration(useFile, printSummary, StartupReportConfiguration.PLAIN_REPORT_FORMAT, redirectTestOutputToFile, disableXmlReport, reportsDir, - trimStacktrace); - SurefireStarter surefireStarter = new SurefireStarter(startupConfiguration, providerConfiguration, - startupReportConfig); + trimStacktrace, null, "TESTHASH", false); - RunResult result = surefireStarter.runSuitesInProcess(); - return result.getForkedProcessCode(); + RunResult result = ProviderFactory.invokeProvider(null, classPathConfig.createMergedClassLoader(), + createReporterFactory(startupReportConfig), providerConfiguration, false, startupConfiguration, true); + + return result.getFailsafeCode() == null ? 0 : result.getFailsafeCode(); + } + + private static ReporterFactory createReporterFactory(StartupReportConfiguration startupReportConfig) { + return new DefaultReporterFactory(startupReportConfig); } /* diff --git a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/TychoClasspathConfiguration.java b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/TychoClasspathConfiguration.java index c94d3ea..fc606b0 100644 --- a/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/TychoClasspathConfiguration.java +++ b/tycho-surefire/org.eclipse.tycho.surefire.osgibooter/src/main/java/org/eclipse/tycho/surefire/osgibooter/TychoClasspathConfiguration.java @@ -25,18 +25,35 @@ public class TychoClasspathConfiguration extends ClasspathConfiguration { } @Override - public ClassLoader createSurefireClassLoader(ClassLoader parent) throws SurefireExecutionException { - return surefireClassLoader; + public ClassLoader createMergedClassLoader() throws SurefireExecutionException { + return new MergedClassLoader(null, new ClassLoader[] { testClassLoader, surefireClassLoader }); } - @Override - public ClassLoader createTestClassLoader() throws SurefireExecutionException { - return testClassLoader; - } + private class MergedClassLoader extends ClassLoader { + + private ClassLoader[] delegateClassLoaders; + + public MergedClassLoader(ClassLoader parent, ClassLoader[] delegateClassLoaders) { + super(parent); + this.delegateClassLoaders = delegateClassLoaders; + } + + @Override + public Class loadClass(String name) throws ClassNotFoundException { + return findClass(name); + } + + @Override + protected Class findClass(String name) throws ClassNotFoundException { + for (ClassLoader delegate : delegateClassLoaders) { + try { + return delegate.loadClass(name); + } catch (ClassNotFoundException e) { + } + } + throw new ClassNotFoundException(); + } - @Override - public ClassLoader createTestClassLoader(boolean childDelegation) throws SurefireExecutionException { - return testClassLoader; } } diff --git a/tycho-surefire/pom.xml b/tycho-surefire/pom.xml index 476ffd9..6e16c20 100644 --- a/tycho-surefire/pom.xml +++ b/tycho-surefire/pom.xml @@ -26,7 +26,7 @@ Tycho Surefire Parent (Incubation) - 2.10 + 2.15 diff --git a/tycho-surefire/tycho-surefire-plugin/pom.xml b/tycho-surefire/tycho-surefire-plugin/pom.xml index 0106500..c7a601a 100644 --- a/tycho-surefire/tycho-surefire-plugin/pom.xml +++ b/tycho-surefire/tycho-surefire-plugin/pom.xml @@ -106,5 +106,10 @@ tycho-p2-facade ${project.version} + + org.apache.maven.surefire + maven-surefire-common + ${surefire-version} + diff --git a/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/TestMojo.java b/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/TestMojo.java index 2305a2a..bd0cf5c 100644 --- a/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/TestMojo.java +++ b/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/TestMojo.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -40,9 +41,10 @@ import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.plugin.surefire.util.DirectoryScanner; import org.apache.maven.project.MavenProject; import org.apache.maven.repository.RepositorySystem; -import org.apache.maven.surefire.suite.RunResult; +import org.apache.maven.surefire.util.DefaultScanResult; import org.apache.maven.toolchain.Toolchain; import org.apache.maven.toolchain.ToolchainManager; import org.codehaus.plexus.util.FileUtils; @@ -858,6 +860,27 @@ public class TestMojo extends AbstractMojo { result.put("perCoreThreadCount", String.valueOf(perCoreThreadCount)); result.put("useUnlimitedThreads", String.valueOf(useUnlimitedThreads)); } + + List defaultIncludes = Arrays.asList("**/Test*.class", "**/*Test.class", "**/*TestCase.class"); + List defaultExcludes = Arrays.asList("**/Abstract*Test.class", "**/Abstract*TestCase.class", "**/*$*"); + List includeList; + if (test != null) { + String test = this.test; + test = test.replace('.', '/'); + test = test.endsWith(".class") ? test : test + ".class"; + test = test.startsWith("**/") ? test : "**/" + test; + includeList = Collections.singletonList(test); + } else if (testClass != null) { + includeList = Collections.singletonList(testClass.replace('.', '/') + ".class"); + } else if (includes != null) { + includeList = includes; + } else { + includeList = defaultIncludes; + } + DirectoryScanner scanner = new DirectoryScanner(testClassesDirectory, includeList, excludes != null ? excludes + : defaultExcludes, Collections. emptyList()); + DefaultScanResult scanResult = scanner.scan(); + scanResult.writeTo(result); return result; } @@ -902,7 +925,7 @@ public class TestMojo extends AbstractMojo { case 0: getLog().info("All tests passed!"); break; - case RunResult.NO_TESTS: + case 254/* RunResult.NO_TESTS */: String message = "No tests found."; if (failIfNoTests) { throw new MojoFailureException(message); @@ -910,7 +933,7 @@ public class TestMojo extends AbstractMojo { getLog().warn(message); } break; - case RunResult.FAILURE: + case 255/* RunResult.FAILURE */: String errorMessage = "There are test failures.\n\nPlease refer to " + reportsDirectory + " for the individual test results."; if (testFailureIgnore) { diff --git a/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/provider/impl/JUnit47Provider.java b/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/provider/impl/JUnit47Provider.java index edcc46a..5d62d3d 100644 --- a/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/provider/impl/JUnit47Provider.java +++ b/tycho-surefire/tycho-surefire-plugin/src/main/java/org/eclipse/tycho/surefire/provider/impl/JUnit47Provider.java @@ -44,7 +44,7 @@ public class JUnit47Provider extends AbstractJUnitProvider { } public String getSurefireProviderClassName() { - return "org.apache.maven.surefire.junitcore.OsgiEnabledJUnitCoreProvider"; + return "org.apache.maven.surefire.junitcore.JUnitCoreProvider"; } public Version getVersion() { -- 1.9.3