You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by kr...@apache.org on 2016/02/08 12:17:52 UTC
maven-surefire git commit: Generalized closer somewhat
Repository: maven-surefire
Updated Branches:
refs/heads/master 502d18442 -> e0bcffd05
Generalized closer somewhat
Project: http://git-wip-us.apache.org/repos/asf/maven-surefire/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-surefire/commit/e0bcffd0
Tree: http://git-wip-us.apache.org/repos/asf/maven-surefire/tree/e0bcffd0
Diff: http://git-wip-us.apache.org/repos/asf/maven-surefire/diff/e0bcffd0
Branch: refs/heads/master
Commit: e0bcffd05bb04001f97bf752de56bca7137da3e2
Parents: 502d184
Author: Kristian Rosenvold <kr...@apache.org>
Authored: Mon Feb 8 11:41:47 2016 +0100
Committer: Kristian Rosenvold <kr...@apache.org>
Committed: Mon Feb 8 11:41:47 2016 +0100
----------------------------------------------------------------------
.../surefire/booterclient/ForkStarter.java | 101 ++++++++++++-------
.../output/ThreadedStreamConsumer.java | 3 +-
2 files changed, 68 insertions(+), 36 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0bcffd0/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
----------------------------------------------------------------------
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
index 10eca6a..d43dd62 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/ForkStarter.java
@@ -33,6 +33,7 @@ import org.apache.maven.plugin.surefire.booterclient.output.ThreadedStreamConsum
import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
import org.apache.maven.shared.utils.cli.CommandLineCallable;
import org.apache.maven.shared.utils.cli.CommandLineException;
+import org.apache.maven.shared.utils.cli.ShutdownHookUtils;
import org.apache.maven.surefire.booter.Classpath;
import org.apache.maven.surefire.booter.ClasspathConfiguration;
import org.apache.maven.surefire.booter.KeyValueSource;
@@ -49,12 +50,13 @@ import org.apache.maven.surefire.suite.RunResult;
import org.apache.maven.surefire.testset.TestRequest;
import org.apache.maven.surefire.util.DefaultScanResult;
+import java.io.Closeable;
import java.io.File;
import java.io.IOException;
-import java.io.InputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
+import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Queue;
@@ -65,33 +67,33 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
+import static java.lang.StrictMath.min;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.maven.plugin.surefire.AbstractSurefireMojo.createCopyAndReplaceForkNumPlaceholder;
+import static org.apache.maven.plugin.surefire.booterclient.lazytestprovider.TestLessInputStream
+ .TestLessInputStreamBuilder;
import static org.apache.maven.shared.utils.cli.CommandLineUtils.executeCommandLineAsCallable;
import static org.apache.maven.shared.utils.cli.ShutdownHookUtils.addShutDownHook;
import static org.apache.maven.shared.utils.cli.ShutdownHookUtils.removeShutdownHook;
-import static org.apache.maven.surefire.util.internal.StringUtils.FORK_STREAM_CHARSET_NAME;
-import static org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThread;
-import static org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThreadFactory;
-import static org.apache.maven.plugin.surefire.AbstractSurefireMojo.createCopyAndReplaceForkNumPlaceholder;
-import static org.apache.maven.plugin.surefire.booterclient.lazytestprovider.
- TestLessInputStream.TestLessInputStreamBuilder;
-import static org.apache.maven.surefire.util.internal.ConcurrencyUtils.countDownToZero;
import static org.apache.maven.surefire.booter.Classpath.join;
import static org.apache.maven.surefire.booter.SystemPropertyManager.writePropertiesFile;
import static org.apache.maven.surefire.suite.RunResult.timeout;
import static org.apache.maven.surefire.suite.RunResult.failure;
import static org.apache.maven.surefire.suite.RunResult.SUCCESS;
-import static java.lang.StrictMath.min;
+import static org.apache.maven.surefire.util.internal.ConcurrencyUtils.countDownToZero;
+import static org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThread;
+import static org.apache.maven.surefire.util.internal.DaemonThreadFactory.newDaemonThreadFactory;
+import static org.apache.maven.surefire.util.internal.StringUtils.FORK_STREAM_CHARSET_NAME;
/**
* Starts the fork or runs in-process.
@@ -144,31 +146,63 @@ public class ForkStarter
private final Collection<DefaultReporterFactory> defaultReporterFactories;
/**
- * Closes an InputStream
+ * Closes stuff, with a shutdown hook to make sure things really get closed.
*/
- private static class InputStreamCloser
- implements Runnable
+ private static class CloseableCloser
+ implements Runnable, Closeable
{
- private final AtomicReference<InputStream> testProvidingInputStream;
+ private final List<AtomicReference<Closeable>> testProvidingInputStream;
- public InputStreamCloser( InputStream testProvidingInputStream )
+ private final Thread inputStreamCloserHook;
+
+ public CloseableCloser( Closeable... testProvidingInputStream )
{
- this.testProvidingInputStream = new AtomicReference<InputStream>( testProvidingInputStream );
+
+ this.testProvidingInputStream = new ArrayList<AtomicReference<Closeable>>();
+ for ( Closeable closeable : testProvidingInputStream )
+ {
+ if ( closeable != null )
+ {
+ this.testProvidingInputStream.add( new AtomicReference<Closeable>( closeable ) );
+ }
+ }
+ if ( this.testProvidingInputStream.size() > 0 )
+ {
+ inputStreamCloserHook = newDaemonThread( this, "closer-shutdown-hook" );
+ ShutdownHookUtils.addShutDownHook( inputStreamCloserHook );
+ }
+ else
+ {
+ inputStreamCloserHook = null;
+ }
}
public void run()
{
- InputStream stream = testProvidingInputStream.getAndSet( null );
- if ( stream != null )
+ for ( AtomicReference<Closeable> closeableAtomicReference : testProvidingInputStream )
{
- try
+ Closeable closeable = closeableAtomicReference.getAndSet( null );
+ if ( closeable != null )
{
- stream.close();
- }
- catch ( IOException e )
- {
- // ignore
+ try
+ {
+ closeable.close();
+ }
+ catch ( IOException e )
+ {
+ // ignore
+ }
}
+
+ }
+ }
+
+ public void close()
+ {
+ run();
+ if ( inputStreamCloserHook != null )
+ {
+ ShutdownHookUtils.removeShutdownHook( inputStreamCloserHook );
}
}
}
@@ -517,10 +551,10 @@ public class ForkStarter
OutputStreamFlushableCommandline cli =
forkConfiguration.createCommandLine( bootClasspath.getClassPath(), startupConfiguration, forkNumber );
- InputStreamCloser inputStreamCloser = new InputStreamCloser( testProvidingInputStream );
- Thread inputStreamCloserHook = newDaemonThread( inputStreamCloser, "input-stream-closer" );
- testProvidingInputStream.setFlushReceiverProvider( cli );
- addShutDownHook( inputStreamCloserHook );
+ if ( testProvidingInputStream != null )
+ {
+ testProvidingInputStream.setFlushReceiverProvider( cli );
+ }
cli.createArg().setFile( surefireProperties );
@@ -530,6 +564,7 @@ public class ForkStarter
}
ThreadedStreamConsumer threadedStreamConsumer = new ThreadedStreamConsumer( forkClient );
+ final CloseableCloser closer = new CloseableCloser( threadedStreamConsumer, testProvidingInputStream );
if ( forkConfiguration.isDebug() )
{
@@ -542,7 +577,7 @@ public class ForkStarter
{
CommandLineCallable future =
executeCommandLineAsCallable( cli, testProvidingInputStream, threadedStreamConsumer,
- threadedStreamConsumer, 0, inputStreamCloser,
+ threadedStreamConsumer, 0, closer,
Charset.forName( FORK_STREAM_CHARSET_NAME ) );
currentForkClients.add( forkClient );
@@ -565,11 +600,7 @@ public class ForkStarter
}
finally
{
- currentForkClients.remove( forkClient );
- threadedStreamConsumer.close();
- inputStreamCloser.run();
- removeShutdownHook( inputStreamCloserHook );
-
+ closer.close();
if ( runResult == null )
{
runResult = forkClient.getDefaultReporterFactory().getGlobalRunStatistics().getRunResult();
http://git-wip-us.apache.org/repos/asf/maven-surefire/blob/e0bcffd0/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
----------------------------------------------------------------------
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
index fdb88ec..3f1abd8 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
@@ -23,6 +23,7 @@ import org.apache.maven.shared.utils.cli.StreamConsumer;
import org.apache.maven.surefire.util.internal.DaemonThreadFactory;
import java.util.concurrent.BlockingQueue;
+import java.io.Closeable;
import java.util.concurrent.LinkedBlockingQueue;
/**
@@ -31,7 +32,7 @@ import java.util.concurrent.LinkedBlockingQueue;
* @author Kristian Rosenvold
*/
public final class ThreadedStreamConsumer
- implements StreamConsumer
+ implements StreamConsumer, Closeable
{
private static final String POISON = "Pioson";