Repository: maven-surefire Updated Branches: refs/heads/master d4135dd77 -> bb99b232d
Added close in finally-blocks to avoid resource leakage on non-forced kills Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/bb99b232 Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/bb99b232 Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/bb99b232 Branch: refs/heads/master Commit: bb99b232da0e93f2772be6945a410ea9ba666c4f Parents: d4135dd Author: Kristian Rosenvold <krosenv...@apache.org> Authored: Sun Oct 25 11:47:41 2015 +0100 Committer: Kristian Rosenvold <krosenv...@apache.org> Committed: Sun Oct 25 11:47:41 2015 +0100 ---------------------------------------------------------------------- .../booterclient/ForkConfiguration.java | 60 ++++++----- .../plugin/surefire/report/FileReporter.java | 29 +++--- .../runorder/RunEntryStatisticsMap.java | 16 ++- .../report/LegacyPojoStackTraceWriter.java | 13 ++- .../apache/maven/surefire/suite/RunResult.java | 23 +++-- .../surefire/report/PojoStackTraceWriter.java | 10 +- .../maven/surefire/junit/JUnit3Provider.java | 36 ++++--- .../maven/surefire/junit4/JUnit4Provider.java | 102 ++++++++++--------- .../surefire/junitcore/JUnitCoreProvider.java | 21 ++-- .../maven/surefire/junitcore/pc/Scheduler.java | 10 +- .../junitcore/pc/SchedulingStrategy.java | 10 +- .../surefire/junitcore/JUnitCoreTester.java | 41 ++++---- .../maven/surefire/testng/TestNGProvider.java | 83 ++++++++------- 13 files changed, 269 insertions(+), 185 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkConfiguration.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkConfiguration.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkConfiguration.java index e5c8a42..1477e87 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkConfiguration.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkConfiguration.java @@ -19,6 +19,16 @@ package org.apache.maven.plugin.surefire.booterclient; * under the License. */ +import org.apache.maven.plugin.surefire.AbstractSurefireMojo; +import org.apache.maven.plugin.surefire.booterclient.lazytestprovider.OutputStreamFlushableCommandline; +import org.apache.maven.plugin.surefire.util.Relocator; +import org.apache.maven.shared.utils.StringUtils; +import org.apache.maven.surefire.booter.Classpath; +import org.apache.maven.surefire.booter.ForkedBooter; +import org.apache.maven.surefire.booter.StartupConfiguration; +import org.apache.maven.surefire.booter.SurefireBooterForkException; +import org.apache.maven.surefire.util.UrlUtils; + import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -30,16 +40,6 @@ import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; -import org.apache.maven.plugin.surefire.AbstractSurefireMojo; -import org.apache.maven.plugin.surefire.booterclient.lazytestprovider.OutputStreamFlushableCommandline; -import org.apache.maven.plugin.surefire.util.Relocator; -import org.apache.maven.shared.utils.StringUtils; -import org.apache.maven.surefire.booter.Classpath; -import org.apache.maven.surefire.booter.ForkedBooter; -import org.apache.maven.surefire.booter.StartupConfiguration; -import org.apache.maven.surefire.booter.SurefireBooterForkException; -import org.apache.maven.surefire.util.UrlUtils; - /** * Configuration for forking tests. * @@ -275,27 +275,33 @@ public class ForkConfiguration } FileOutputStream fos = new FileOutputStream( file ); JarOutputStream jos = new JarOutputStream( fos ); - jos.setLevel( JarOutputStream.STORED ); - JarEntry je = new JarEntry( "META-INF/MANIFEST.MF" ); - jos.putNextEntry( je ); + try + { + jos.setLevel( JarOutputStream.STORED ); + JarEntry je = new JarEntry( "META-INF/MANIFEST.MF" ); + jos.putNextEntry( je ); - Manifest man = new Manifest(); + Manifest man = new Manifest(); - // we can't use StringUtils.join here since we need to add a '/' to - // the end of directory entries - otherwise the jvm will ignore them. - String cp = ""; - for ( String el : classPath ) - { - // NOTE: if File points to a directory, this entry MUST end in '/'. - cp += UrlUtils.getURL( new File( el ) ).toExternalForm() + " "; - } + // we can't use StringUtils.join here since we need to add a '/' to + // the end of directory entries - otherwise the jvm will ignore them. + String cp = ""; + for ( String el : classPath ) + { + // NOTE: if File points to a directory, this entry MUST end in '/'. + cp += UrlUtils.getURL( new File( el ) ).toExternalForm() + " "; + } - man.getMainAttributes().putValue( "Manifest-Version", "1.0" ); - man.getMainAttributes().putValue( "Class-Path", cp.trim() ); - man.getMainAttributes().putValue( "Main-Class", startClassName ); + man.getMainAttributes().putValue( "Manifest-Version", "1.0" ); + man.getMainAttributes().putValue( "Class-Path", cp.trim() ); + man.getMainAttributes().putValue( "Main-Class", startClassName ); - man.write( jos ); - jos.close(); + man.write( jos ); + } + finally + { + jos.close(); + } return file; } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java ---------------------------------------------------------------------- diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java index fddb00f..2e862cf 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java @@ -19,15 +19,15 @@ package org.apache.maven.plugin.surefire.report; * under the License. */ +import org.apache.maven.surefire.report.ReportEntry; +import org.apache.maven.surefire.report.ReporterException; + import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.List; -import org.apache.maven.surefire.report.ReportEntry; -import org.apache.maven.surefire.report.ReporterException; - import static org.apache.maven.plugin.surefire.report.FileReporterUtils.stripIllegalFilenameChars; /** @@ -105,18 +105,23 @@ public class FileReporter public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetStats, List<String> testResults ) { PrintWriter writer = testSetStarting( report ); - writer.print( testSetStats.getTestSetSummary( report ) ); - - if ( testResults != null ) + try { - for ( String testResult : testResults ) + writer.print( testSetStats.getTestSetSummary( report ) ); + + if ( testResults != null ) { - writer.println( testResult ); + for ( String testResult : testResults ) + { + writer.println( testResult ); + } } - } - - writer.flush(); - writer.close(); + writer.flush(); + } + finally + { + writer.close(); + } } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/RunEntryStatisticsMap.java ---------------------------------------------------------------------- diff --git a/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/RunEntryStatisticsMap.java b/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/RunEntryStatisticsMap.java index 9e9bf10..9c110a5 100644 --- a/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/RunEntryStatisticsMap.java +++ b/surefire-api/src/main/java/org/apache/maven/plugin/surefire/runorder/RunEntryStatisticsMap.java @@ -103,13 +103,19 @@ public class RunEntryStatisticsMap { FileOutputStream fos = new FileOutputStream( file ); PrintWriter printWriter = new PrintWriter( fos ); - List<RunEntryStatistics> items = new ArrayList<RunEntryStatistics>( runEntryStatistics.values() ); - Collections.sort( items, new RunCountComparator() ); - for ( RunEntryStatistics item : items ) + try { - printWriter.println( item.toString() ); + List<RunEntryStatistics> items = new ArrayList<RunEntryStatistics>( runEntryStatistics.values() ); + Collections.sort( items, new RunCountComparator() ); + for ( RunEntryStatistics item : items ) + { + printWriter.println( item.toString() ); + } + } + finally + { + printWriter.close(); } - printWriter.close(); } public RunEntryStatistics findOrCreate( ReportEntry reportEntry ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-api/src/main/java/org/apache/maven/surefire/report/LegacyPojoStackTraceWriter.java ---------------------------------------------------------------------- diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/report/LegacyPojoStackTraceWriter.java b/surefire-api/src/main/java/org/apache/maven/surefire/report/LegacyPojoStackTraceWriter.java index d19c618..dc9c984 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/report/LegacyPojoStackTraceWriter.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/report/LegacyPojoStackTraceWriter.java @@ -20,9 +20,10 @@ package org.apache.maven.surefire.report; */ +import org.apache.maven.surefire.util.internal.StringUtils; + import java.io.PrintWriter; import java.io.StringWriter; -import org.apache.maven.surefire.util.internal.StringUtils; /** * Write the trace out for a POJO test. Java 1.5 compatible. @@ -54,8 +55,14 @@ public class LegacyPojoStackTraceWriter { StringWriter w = new StringWriter(); PrintWriter stackTrace = new PrintWriter( w ); - t.printStackTrace( stackTrace ); - stackTrace.close(); + try + { + t.printStackTrace( stackTrace ); + } + finally + { + stackTrace.close(); + } w.flush(); StringBuffer builder = w.getBuffer(); if ( isMultiLineExceptionMessage( t ) ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-api/src/main/java/org/apache/maven/surefire/suite/RunResult.java ---------------------------------------------------------------------- diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/suite/RunResult.java b/surefire-api/src/main/java/org/apache/maven/surefire/suite/RunResult.java index 793c5db..ceff77a 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/suite/RunResult.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/suite/RunResult.java @@ -19,6 +19,13 @@ package org.apache.maven.surefire.suite; * under the License. */ +import org.apache.maven.shared.utils.StringUtils; +import org.apache.maven.shared.utils.io.IOUtil; +import org.apache.maven.shared.utils.xml.PrettyPrintXMLWriter; +import org.apache.maven.shared.utils.xml.Xpp3Dom; +import org.apache.maven.shared.utils.xml.Xpp3DomBuilder; +import org.apache.maven.shared.utils.xml.Xpp3DomWriter; + import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -28,12 +35,6 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import org.apache.maven.shared.utils.StringUtils; -import org.apache.maven.shared.utils.io.IOUtil; -import org.apache.maven.shared.utils.xml.PrettyPrintXMLWriter; -import org.apache.maven.shared.utils.xml.Xpp3Dom; -import org.apache.maven.shared.utils.xml.Xpp3DomBuilder; -import org.apache.maven.shared.utils.xml.Xpp3DomWriter; /** * Represents a test-run-result; this may be from a single test run or an aggregated result. @@ -117,8 +118,14 @@ public class RunResult } ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintWriter pw = new PrintWriter( out ); - e.printStackTrace( pw ); - pw.close(); + try + { + e.printStackTrace( pw ); + } + finally + { + pw.close(); + } return new String( out.toByteArray() ); } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/PojoStackTraceWriter.java ---------------------------------------------------------------------- diff --git a/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/PojoStackTraceWriter.java b/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/PojoStackTraceWriter.java index baef627..a4646c6 100644 --- a/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/PojoStackTraceWriter.java +++ b/surefire-providers/common-java5/src/main/java/org/apache/maven/surefire/report/PojoStackTraceWriter.java @@ -50,8 +50,14 @@ public class PojoStackTraceWriter { StringWriter w = new StringWriter(); PrintWriter stackTrace = new PrintWriter( w ); - t.printStackTrace( stackTrace ); - stackTrace.close(); + try + { + t.printStackTrace( stackTrace ); + } + finally + { + stackTrace.close(); + } w.flush(); StringBuffer builder = w.getBuffer(); if ( isMultiLineExceptionMessage( t ) ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java b/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java index 01bd54b..55f89be 100644 --- a/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java +++ b/surefire-providers/surefire-junit3/src/main/java/org/apache/maven/surefire/junit/JUnit3Provider.java @@ -89,24 +89,32 @@ public class JUnit3Provider } ReporterFactory reporterFactory = providerParameters.getReporterFactory(); - final RunListener reporter = reporterFactory.createReporter(); - ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter ); - - final String smClassName = System.getProperty( "surefire.security.manager" ); - if ( smClassName != null ) + RunResult runResult; + try { - SecurityManager securityManager = - ReflectionUtils.instantiate( getClass().getClassLoader(), smClassName, SecurityManager.class ); - System.setSecurityManager( securityManager ); - } + final RunListener reporter = reporterFactory.createReporter(); + ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter ); + + final String smClassName = System.getProperty( "surefire.security.manager" ); + if ( smClassName != null ) + { + SecurityManager securityManager = + ReflectionUtils.instantiate( getClass().getClassLoader(), smClassName, SecurityManager.class ); + System.setSecurityManager( securityManager ); + } - for ( Class<?> clazz : testsToRun ) + for ( Class<?> clazz : testsToRun ) + { + SurefireTestSet surefireTestSet = createTestSet( clazz ); + executeTestSet( surefireTestSet, reporter, testClassLoader ); + } + + } + finally { - SurefireTestSet surefireTestSet = createTestSet( clazz ); - executeTestSet( surefireTestSet, reporter, testClassLoader ); + runResult = reporterFactory.close(); } - - return reporterFactory.close(); + return runResult; } private SurefireTestSet createTestSet( Class<?> clazz ) http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java index 493369d..5a3bdf6 100644 --- a/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java +++ b/surefire-providers/surefire-junit4/src/main/java/org/apache/maven/surefire/junit4/JUnit4Provider.java @@ -19,9 +19,6 @@ package org.apache.maven.surefire.junit4; * under the License. */ -import java.util.Collection; -import java.util.Set; - import org.apache.maven.surefire.booter.Command; import org.apache.maven.surefire.booter.MasterProcessListener; import org.apache.maven.surefire.booter.MasterProcessReader; @@ -51,6 +48,12 @@ import org.junit.runner.Runner; import org.junit.runner.manipulation.Filter; import org.junit.runner.notification.StoppedByUserException; +import java.util.Collection; +import java.util.Set; + +import static java.lang.reflect.Modifier.isAbstract; +import static java.lang.reflect.Modifier.isInterface; +import static java.util.Collections.unmodifiableCollection; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.cutTestClassAndMethod; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.generateFailingTests; import static org.apache.maven.surefire.common.junit4.JUnit4Reflector.createDescription; @@ -63,9 +66,6 @@ import static org.apache.maven.surefire.testset.TestListResolver.toClassFileName import static org.apache.maven.surefire.util.TestsToRun.fromClass; import static org.junit.runner.Request.aClass; import static org.junit.runner.Request.method; -import static java.lang.reflect.Modifier.isAbstract; -import static java.lang.reflect.Modifier.isInterface; -import static java.util.Collections.unmodifiableCollection; /** * @author Kristian Rosenvold @@ -98,9 +98,8 @@ public class JUnit4Provider public JUnit4Provider( ProviderParameters booterParameters ) { // don't start a thread in MasterProcessReader while we are in in-plugin process - commandsReader = booterParameters.isInsideFork() - ? MasterProcessReader.getReader().setShutdown( booterParameters.getShutdown() ) - : null; + commandsReader = booterParameters.isInsideFork() ? MasterProcessReader.getReader().setShutdown( + booterParameters.getShutdown() ) : null; providerParameters = booterParameters; testClassLoader = booterParameters.getTestClassLoader(); scanResult = booterParameters.getScanResult(); @@ -141,56 +140,64 @@ public class JUnit4Provider ReporterFactory reporterFactory = providerParameters.getReporterFactory(); - RunListener reporter = reporterFactory.createReporter(); + RunResult runResult; + try + { - startCapture( (ConsoleOutputReceiver) reporter ); + RunListener reporter = reporterFactory.createReporter(); - Notifier notifier = new Notifier( new JUnit4RunListener( reporter ), getSkipAfterFailureCount() ); - if ( isFailFast() ) - { - notifier.addListener( new JUnit4FailFastListener( notifier ) ); - } - Result result = new Result(); - notifier.addListeners( customRunListeners ) - .addListener( result.createListener() ); + startCapture( (ConsoleOutputReceiver) reporter ); - if ( isFailFast() && commandsReader != null ) - { - registerPleaseStopJunitListener( notifier ); - } + Notifier notifier = new Notifier( new JUnit4RunListener( reporter ), getSkipAfterFailureCount() ); + if ( isFailFast() ) + { + notifier.addListener( new JUnit4FailFastListener( notifier ) ); + } + Result result = new Result(); + notifier.addListeners( customRunListeners ).addListener( result.createListener() ); - try - { - notifier.fireTestRunStarted( testsToRun.allowEagerReading() - ? createTestsDescription( testsToRun ) - : createDescription( UNDETERMINED_TESTS_DESCRIPTION ) ); + if ( isFailFast() && commandsReader != null ) + { + registerPleaseStopJunitListener( notifier ); + } - if ( commandsReader != null ) + try { - commandsReader.addShutdownListener( new MasterProcessListener() + notifier.fireTestRunStarted( testsToRun.allowEagerReading() + ? createTestsDescription( testsToRun ) + : createDescription( UNDETERMINED_TESTS_DESCRIPTION ) ); + + if ( commandsReader != null ) { - public void update( Command command ) + commandsReader.addShutdownListener( new MasterProcessListener() { - testsToRun.markTestSetFinished(); - } - } ); - commandsReader.awaitStarted(); - } + public void update( Command command ) + { + testsToRun.markTestSetFinished(); + } + } ); + commandsReader.awaitStarted(); + } - for ( Class<?> aTestsToRun : testsToRun ) + for ( Class<?> aTestsToRun : testsToRun ) + { + executeTestSet( aTestsToRun, reporter, notifier ); + } + } + finally { - executeTestSet( aTestsToRun, reporter, notifier ); + notifier.fireTestRunFinished( result ); + notifier.removeListeners(); + closeCommandsReader(); } + + rethrowAnyTestMechanismFailures( result ); } finally { - notifier.fireTestRunFinished( result ); - notifier.removeListeners(); - closeCommandsReader(); + runResult = reporterFactory.close(); } - - rethrowAnyTestMechanismFailures( result ); - return reporterFactory.close(); + return runResult; } private boolean isRerunFailingTests() @@ -259,7 +266,8 @@ public class JUnit4Provider } } - private void executeWithRerun( Class<?> clazz, Notifier notifier ) throws TestSetFailedException + private void executeWithRerun( Class<?> clazz, Notifier notifier ) + throws TestSetFailedException { JUnitTestFailureListener failureListener = new JUnitTestFailureListener(); notifier.addListener( failureListener ); @@ -405,8 +413,8 @@ public class JUnit4Provider else { name = name.trim(); - return name.startsWith( "initializationError0(org.junit.runner.manipulation.Filter)" ) - || name.startsWith( "initializationError(org.junit.runner.manipulation.Filter)" ); + return name.startsWith( "initializationError0(org.junit.runner.manipulation.Filter)" ) || name.startsWith( + "initializationError(org.junit.runner.manipulation.Filter)" ); } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java index ba63f7e..9d03a85 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreProvider.java @@ -19,12 +19,6 @@ package org.apache.maven.surefire.junitcore; * under the License. */ -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - import org.apache.maven.surefire.booter.Command; import org.apache.maven.surefire.booter.MasterProcessListener; import org.apache.maven.surefire.booter.MasterProcessReader; @@ -50,10 +44,16 @@ import org.junit.runner.manipulation.Filter; import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; -import static org.apache.maven.surefire.junitcore.ConcurrentRunListener.createInstance; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import static java.util.Collections.unmodifiableCollection; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.generateFailingTests; import static org.apache.maven.surefire.common.junit4.JUnit4RunListenerFactory.createCustomListeners; -import static java.util.Collections.unmodifiableCollection; +import static org.apache.maven.surefire.junitcore.ConcurrentRunListener.createInstance; /** * @author Kristian Rosenvold @@ -125,6 +125,8 @@ public class JUnitCoreProvider final ReporterFactory reporterFactory = providerParameters.getReporterFactory(); + RunResult runResult; + final ConsoleLogger consoleLogger = providerParameters.getConsoleLogger(); Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null; @@ -189,13 +191,14 @@ public class JUnitCoreProvider core.execute( testsToRun, failingMethodsFilter ); } } - return reporterFactory.close(); } finally { + runResult = reporterFactory.close(); notifier.removeListeners(); closeCommandsReader(); } + return runResult; } private boolean isRerunFailingTests() http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/Scheduler.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/Scheduler.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/Scheduler.java index 9fa1e40..a957340 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/Scheduler.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/Scheduler.java @@ -207,8 +207,14 @@ public class Scheduler { ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintStream stream = new PrintStream( out ); - t.printStackTrace( stream ); - stream.close(); + try + { + t.printStackTrace( stream ); + } + finally + { + stream.close(); + } logger.info( out.toString() ); } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategy.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategy.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategy.java index 02e2be3..3d015a3 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategy.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategy.java @@ -136,8 +136,14 @@ public abstract class SchedulingStrategy { ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintStream stream = new PrintStream( out ); - t.printStackTrace( stream ); - stream.close(); + try + { + t.printStackTrace( stream ); + } + finally + { + stream.close(); + } logger.info( out.toString() ); } } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java index c805037..e021647 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java @@ -19,8 +19,6 @@ package org.apache.maven.surefire.junitcore; * under the License. */ -import java.util.HashMap; -import java.util.concurrent.ExecutionException; import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; import org.apache.maven.surefire.report.ConsoleOutputCapture; import org.apache.maven.surefire.report.ConsoleOutputReceiver; @@ -28,11 +26,13 @@ import org.apache.maven.surefire.report.DefaultConsoleReporter; import org.apache.maven.surefire.report.ReporterFactory; import org.apache.maven.surefire.report.RunListener; import org.apache.maven.surefire.testset.TestSetFailedException; - import org.junit.runner.Computer; import org.junit.runner.JUnitCore; import org.junit.runner.Result; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; + /** * @author Kristian Rosenvold */ @@ -56,24 +56,31 @@ public class JUnitCoreTester { ReporterFactory reporterManagerFactory = DefaultReporterFactory.defaultNoXml(); - final HashMap<String, TestSet> classMethodCounts = new HashMap<String, TestSet>(); - RunListener reporter = - ConcurrentRunListener.createInstance( classMethodCounts, reporterManagerFactory, parallelClasses, false, - new DefaultConsoleReporter( System.out ) ); - ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter ); + try + { + + final HashMap<String, TestSet> classMethodCounts = new HashMap<String, TestSet>(); + RunListener reporter = + ConcurrentRunListener.createInstance( classMethodCounts, reporterManagerFactory, parallelClasses, false, + new DefaultConsoleReporter( System.out ) ); + ConsoleOutputCapture.startCapture( (ConsoleOutputReceiver) reporter ); - JUnitCoreRunListener runListener = new JUnitCoreRunListener( reporter, classMethodCounts ); - JUnitCore junitCore = new JUnitCore(); + JUnitCoreRunListener runListener = new JUnitCoreRunListener( reporter, classMethodCounts ); + JUnitCore junitCore = new JUnitCore(); - junitCore.addListener( runListener ); - final Result run = junitCore.run( computer, classes ); - junitCore.removeListener( runListener ); - reporterManagerFactory.close(); - if ( computer instanceof ConfigurableParallelComputer ) + junitCore.addListener( runListener ); + final Result run = junitCore.run( computer, classes ); + junitCore.removeListener( runListener ); + return run; + } + finally { - ( (ConfigurableParallelComputer) computer ).close(); + reporterManagerFactory.close(); + if ( computer instanceof ConfigurableParallelComputer ) + { + ( (ConfigurableParallelComputer) computer ).close(); + } } - return run; } http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/bb99b232/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java ---------------------------------------------------------------------- diff --git a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java index 88b3d64..3c27b24 100644 --- a/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java +++ b/surefire-providers/surefire-testng/src/main/java/org/apache/maven/surefire/testng/TestNGProvider.java @@ -19,11 +19,6 @@ package org.apache.maven.surefire.testng; * under the License. */ -import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Map; - import org.apache.maven.surefire.booter.Command; import org.apache.maven.surefire.booter.MasterProcessListener; import org.apache.maven.surefire.booter.MasterProcessReader; @@ -41,6 +36,11 @@ import org.apache.maven.surefire.util.RunOrderCalculator; import org.apache.maven.surefire.util.ScanResult; import org.apache.maven.surefire.util.TestsToRun; +import java.io.File; +import java.util.Collection; +import java.util.List; +import java.util.Map; + /** * @author Kristian Rosenvold * @noinspection UnusedDeclaration @@ -87,6 +87,7 @@ public class TestNGProvider public RunResult invoke( Object forkTestSet ) throws TestSetFailedException { + RunResult runResult; try { if ( isFailFast() && commandsReader != null ) @@ -101,57 +102,65 @@ public class TestNGProvider final ReporterFactory reporterFactory = providerParameters.getReporterFactory(); - if ( isTestNGXmlTestSuite( testRequest ) ) - { - TestNGXmlTestSuite testNGXmlTestSuite = newXmlSuite(); - testNGXmlTestSuite.locateTestSets( testClassLoader ); - if ( forkTestSet != null && testRequest == null ) - { - testNGXmlTestSuite.execute( (String) forkTestSet, reporterFactory ); - } - else - { - testNGXmlTestSuite.execute( reporterFactory ); - } - } - else + try { - if ( testsToRun == null ) + + if ( isTestNGXmlTestSuite( testRequest ) ) { - if ( forkTestSet instanceof TestsToRun ) - { - testsToRun = (TestsToRun) forkTestSet; - } - else if ( forkTestSet instanceof Class ) + TestNGXmlTestSuite testNGXmlTestSuite = newXmlSuite(); + testNGXmlTestSuite.locateTestSets( testClassLoader ); + if ( forkTestSet != null && testRequest == null ) { - testsToRun = TestsToRun.fromClass( (Class<?>) forkTestSet ); + testNGXmlTestSuite.execute( (String) forkTestSet, reporterFactory ); } else { - testsToRun = scanClassPath(); + testNGXmlTestSuite.execute( reporterFactory ); } } - - if ( commandsReader != null ) + else { - commandsReader.addShutdownListener( new MasterProcessListener() + if ( testsToRun == null ) { - public void update( Command command ) + if ( forkTestSet instanceof TestsToRun ) + { + testsToRun = (TestsToRun) forkTestSet; + } + else if ( forkTestSet instanceof Class ) + { + testsToRun = TestsToRun.fromClass( (Class<?>) forkTestSet ); + } + else { - testsToRun.markTestSetFinished(); + testsToRun = scanClassPath(); } - } ); + } + + if ( commandsReader != null ) + { + commandsReader.addShutdownListener( new MasterProcessListener() + { + public void update( Command command ) + { + testsToRun.markTestSetFinished(); + } + } ); + } + TestNGDirectoryTestSuite suite = newDirectorySuite(); + suite.execute( testsToRun, reporterFactory ); } - TestNGDirectoryTestSuite suite = newDirectorySuite(); - suite.execute( testsToRun, reporterFactory ); - } - return reporterFactory.close(); + } + finally + { + runResult = reporterFactory.close(); + } } finally { closeCommandsReader(); } + return runResult; } boolean isTestNGXmlTestSuite( TestRequest testSuiteDefinition )