Return-Path: Delivered-To: apmail-maven-surefire-commits-archive@www.apache.org Received: (qmail 77452 invoked from network); 3 Nov 2010 19:48:09 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 3 Nov 2010 19:48:09 -0000 Received: (qmail 26996 invoked by uid 500); 3 Nov 2010 19:48:40 -0000 Delivered-To: apmail-maven-surefire-commits-archive@maven.apache.org Received: (qmail 26959 invoked by uid 500); 3 Nov 2010 19:48:40 -0000 Mailing-List: contact surefire-commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: surefire-dev@maven.apache.org Delivered-To: mailing list surefire-commits@maven.apache.org Received: (qmail 26949 invoked by uid 99); 3 Nov 2010 19:48:39 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Nov 2010 19:48:39 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Nov 2010 19:48:38 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 0B71123888C2; Wed, 3 Nov 2010 19:47:25 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1030636 - in /maven/surefire/trunk/surefire-booter/src/main/java/org/apache/maven/surefire/booter: ./ output/ Date: Wed, 03 Nov 2010 19:47:24 -0000 To: surefire-commits@maven.apache.org From: krosenvold@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20101103194725.0B71123888C2@eris.apache.org> 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 + *

+ * 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 ) ); } }