Author: krosenvold
Date: Wed Nov 3 19:47:24 2010
New Revision: 1030636
URL: http://svn.apache.org/viewvc?rev=1030636&view=rev
Log:
[SUREFIRE-640] Threading issue when redirectToOutputFile=true
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/SurefireBooter.java
Wed Nov 3 19:47:24 2010
@@ -186,7 +186,7 @@ public class SurefireBooter
/**
* Setting this to true will cause a failure if there are no tests to run
*
- * @param redirectTestOutputToFile
+ * @param failIfNoTests true if we should fail with no tests
*/
public void setFailIfNoTests( boolean failIfNoTests )
{
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/FileOutputConsumerProxy.java
Wed Nov 3 19:47:24 2010
@@ -39,82 +39,36 @@ public class FileOutputConsumerProxy
extends OutputConsumerProxy
{
- private static final String USER_DIR = System.getProperty( "user.dir" );
-
private static final String LINE_SEPARATOR = System.getProperty(
"line.separator" );
- private File reportsDirectory;
+ private final File reportsDirectory;
- private PrintWriter printWriter;
-
- private StringBuffer outputBuffer = new StringBuffer();
-
- /**
- * Create a consumer that will write to a {...@link File} for each test.
- * Files will be saved in working directory.
- */
- public FileOutputConsumerProxy( OutputConsumer outputConsumer )
- {
- this( outputConsumer, new File( USER_DIR ) );
- }
+ private final StringBuffer outputBuffer = new StringBuffer();
+
+ private volatile PrintWriter printWriter;
/**
* Create a consumer that will write to a {...@link File} for each test
*
+ * @param outputConsumer the output consumer
* @param reportsDirectory directory where files will be saved
*/
public FileOutputConsumerProxy( OutputConsumer outputConsumer, File
reportsDirectory )
{
super( outputConsumer );
- this.setReportsDirectory( reportsDirectory );
- }
-
- /**
- * Set the directory where reports will be saved
- *
- * @param reportsDirectory the directory
- */
- public void setReportsDirectory( File reportsDirectory )
- {
this.reportsDirectory = reportsDirectory;
}
- /**
- * Get the directory where reports will be saved
- */
- public File getReportsDirectory()
- {
- return reportsDirectory;
- }
-
- /**
- * Set the {...@link PrintWriter} used for the current test suite
- *
- * @param writer
- */
- public void setPrintWriter( PrintWriter writer )
- {
- this.printWriter = writer;
- }
-
- /**
- * Get the {...@link PrintWriter} used for the current test suite
- */
- public PrintWriter getPrintWriter()
- {
- return printWriter;
- }
-
public void testSetStarting( ReportEntry reportEntry )
{
- if ( getPrintWriter() != null )
+ if ( printWriter != null )
{
throw new IllegalStateException( "testSetStarting called twice" );
}
- File file = new File( getReportsDirectory(), reportEntry.getName() +
"-output.txt" );
+ File file = new File( reportsDirectory, reportEntry.getName() +
"-output.txt" );
try
{
- setPrintWriter( new PrintWriter( new BufferedWriter( new
FileWriter( file ) ) ) );
+ this.printWriter = new PrintWriter( new BufferedWriter( new
FileWriter( file ) ) );
}
catch ( IOException e )
{
@@ -125,41 +79,43 @@ public class FileOutputConsumerProxy
public void testSetCompleted()
{
- if ( getPrintWriter() == null )
+ if ( printWriter == null )
{
throw new IllegalStateException( "testSetCompleted called before
testSetStarting" );
}
if ( outputBuffer.length() > 0 )
{
- getPrintWriter().write( outputBuffer.toString() );
- getPrintWriter().write( LINE_SEPARATOR );
+ printWriter.write( outputBuffer.toString() );
+ printWriter.write( LINE_SEPARATOR );
outputBuffer.setLength( 0 );
}
- getPrintWriter().close();
- setPrintWriter( null );
+ printWriter.close();
+ this.printWriter = null;
super.testSetCompleted();
}
/**
* Write the output to the current test file
+ * <p/>
+ * This method may be called from multiple threads
*/
- public void consumeOutputLine( String line )
+ public synchronized void consumeOutputLine( String line )
{
- if ( getPrintWriter() == null )
+ if ( printWriter == null )
{
outputBuffer.append( line );
outputBuffer.append( LINE_SEPARATOR );
return;
}
-
+
if ( outputBuffer.length() > 0 )
{
- getPrintWriter().write( outputBuffer.toString() );
- getPrintWriter().write( LINE_SEPARATOR );
+ printWriter.write( outputBuffer.toString() );
+ printWriter.write( LINE_SEPARATOR );
outputBuffer.setLength( 0 );
}
- getPrintWriter().write( line );
- getPrintWriter().write( LINE_SEPARATOR );
+ printWriter.write( line );
+ printWriter.write( LINE_SEPARATOR );
}
}
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/ForkingStreamConsumer.java
Wed Nov 3 19:47:24 2010
@@ -39,7 +39,7 @@ public class ForkingStreamConsumer
private final static int FOOTER_PREFIX_LENGTH =
ForkingConsoleReporter.FORKING_PREFIX_FOOTER.length();
- private OutputConsumer outputConsumer;
+ private final OutputConsumer outputConsumer;
public ForkingStreamConsumer( OutputConsumer outputConsumer )
{
@@ -77,6 +77,7 @@ public class ForkingStreamConsumer
/**
* Get the underlying output consumer.
+ * @return the output consumer
*/
public OutputConsumer getOutputConsumer()
{
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/OutputConsumerProxy.java
Wed Nov 3 19:47:24 2010
@@ -32,7 +32,7 @@ public class OutputConsumerProxy
implements OutputConsumer
{
- private OutputConsumer outputConsumer;
+ private final OutputConsumer outputConsumer;
/**
* Create a output consumer that will delegate all calls to the proxied
output consumer
@@ -41,16 +41,6 @@ public class OutputConsumerProxy
*/
public OutputConsumerProxy( OutputConsumer outputConsumer )
{
- this.setOutputConsumer( outputConsumer );
- }
-
- /**
- * {...@link OutputConsumer} that calls will be delegated to
- *
- * @param outputConsumer the proxied {...@link OutputConsumer}
- */
- public void setOutputConsumer( OutputConsumer outputConsumer )
- {
this.outputConsumer = outputConsumer;
}
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/PrintWriterOutputConsumer.java
Wed Nov 3 19:47:24 2010
@@ -35,14 +35,7 @@ public class PrintWriterOutputConsumer
implements OutputConsumer
{
- private PrintWriter printWriter;
-
- /**
- * Create a consumer uninitialized, {...@link
#setPrintWriter(PrintWriter)} must be called before using it
- */
- public PrintWriterOutputConsumer()
- {
- }
+ private final PrintWriter printWriter;
/**
* Create a consumer that will write to the specified {...@link Writer}
@@ -51,21 +44,23 @@ public class PrintWriterOutputConsumer
*/
public PrintWriterOutputConsumer( Writer writer )
{
- this.setPrintWriter( new PrintWriter( writer ) );
+ this( new PrintWriter( writer ) );
}
/**
- * Set the {...@link PrintWriter} used by this object
+ * Create a consumer that will write to the specified {...@link Writer}
*
- * @param writer
+ * @param writer where to write to
*/
- public void setPrintWriter( PrintWriter writer )
+ public PrintWriterOutputConsumer( PrintWriter writer )
{
this.printWriter = writer;
}
/**
* Get the {...@link PrintWriter} used by this object
+ *
+ * @return the printWriter
*/
public PrintWriter getPrintWriter()
{
@@ -111,7 +106,7 @@ public class PrintWriterOutputConsumer
/**
* Write a line and flush
*
- * @param line
+ * @param line the content to write
*/
private void write( String line )
{
Modified:
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
URL:
http://svn.apache.org/viewvc/maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java?rev=1030636&r1=1030635&r2=1030636&view=diff
==============================================================================
---
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
(original)
+++
maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter/output/StandardOutputConsumer.java
Wed Nov 3 19:47:24 2010
@@ -37,7 +37,7 @@ public class StandardOutputConsumer
*/
public StandardOutputConsumer()
{
- setPrintWriter( new PrintWriter( System.out ) );
+ super( new PrintWriter( System.out ) );
}
}