From 3bb83c4145ae6773dd01ca5a66de5ad3715db684 Mon Sep 17 00:00:00 2001 From: "tibor.digana" Date: Sat, 12 Feb 2022 21:30:30 +0100 Subject: [PATCH] [SUREFIRE-2011] Updated abstractions which helps associating standard out/err with a test --- .../booterclient/output/ForkClient.java | 18 ++- .../report/ConsoleOutputFileReporter.java | 7 +- .../report/DefaultReporterFactory.java | 4 +- .../surefire/report/DirectConsoleOutput.java | 11 +- .../report/NullConsoleOutputReceiver.java | 3 +- .../surefire/report/TestSetRunListener.java | 27 ++-- .../TestcycleConsoleOutputReceiver.java | 4 +- .../booterclient/ForkingRunListenerTest.java | 14 +- .../surefire/booterclient/MockReporter.java | 14 +- .../TestSetMockReporterFactory.java | 4 +- .../booterclient/output/ForkClientTest.java | 70 ++++----- .../plugin/surefire/extensions/E2ETest.java | 12 +- .../ForkedProcessEventNotifierTest.java | 15 +- .../report/DefaultReporterFactoryTest.java | 5 +- .../report/ConsoleOutputFileReporterTest.java | 12 +- .../api/booter/BaseProviderFactory.java | 17 --- .../api/booter/ForkingReporterFactory.java | 4 +- .../api/booter/ForkingRunListener.java | 38 ++--- .../booter/MasterProcessChannelEncoder.java | 5 +- .../api/provider/ProviderParameters.java | 11 -- .../api/report/ConsoleOutputCapture.java | 31 ++-- ...ConsoleOutputReceiverForCurrentThread.java | 8 +- .../surefire/api/report/ConsoleStream.java | 28 ---- .../report/DefaultDirectConsoleReporter.java | 42 ------ .../api/report/ReporterConfiguration.java | 25 ---- .../surefire/api/report/ReporterFactory.java | 6 +- ...tReceiver.java => TestOutputReceiver.java} | 8 +- .../api/report/TestOutputReportEntry.java | 116 +++++++++++++++ .../api/report/TestReportListener.java | 45 ++++++ .../maven/surefire/booter/ForkedBooter.java | 9 +- .../booter/spi/EventChannelEncoder.java | 21 ++- .../booter/SurefireReflectorTest.java | 8 +- .../booter/spi/EventChannelEncoderTest.java | 18 ++- .../ConsoleOutputReportEventListener.java | 3 +- .../common/junit4/JUnit4RunListener.java | 29 +++- .../surefire/common/junit4/MockReporter.java | 70 ++++++++- .../junitplatform/JUnitPlatformProvider.java | 15 +- .../junitplatform/RunListenerAdapter.java | 16 +- .../JUnitPlatformProviderTest.java | 48 +++--- .../junitplatform/RunListenerAdapterTest.java | 6 +- .../maven/surefire/junit/JUnit3Provider.java | 6 +- .../maven/surefire/junit4/JUnit4Provider.java | 9 +- surefire-providers/surefire-junit47/pom.xml | 100 +------------ .../src/assembly/assembly.xml | 35 ----- .../junitcore/ClassesParallelRunListener.java | 16 +- .../junitcore/ConcurrentRunListener.java | 138 ++++++++++++------ .../surefire/junitcore/JUnitCoreProvider.java | 31 ++-- .../junitcore/JUnitCoreRunListener.java | 6 +- .../surefire/junitcore/JUnitCoreWrapper.java | 10 +- .../surefire/junitcore/LogicalStream.java | 29 +--- .../junitcore/MethodsParallelRunListener.java | 17 +-- .../junitcore/NonConcurrentRunListener.java | 15 +- .../maven/surefire/junitcore/TestMethod.java | 15 +- .../maven/surefire/junitcore/TestSet.java | 8 +- .../pc/AbstractThreadPoolStrategy.java | 6 +- .../junitcore/pc/InvokerStrategy.java | 4 +- .../pc/NonSharedThreadPoolStrategy.java | 4 +- .../junitcore/pc/ParallelComputerBuilder.java | 8 +- .../surefire/junitcore/pc/Scheduler.java | 41 +++--- .../junitcore/pc/SchedulingStrategies.java | 10 +- .../junitcore/pc/SchedulingStrategy.java | 15 +- .../pc/SharedThreadPoolStrategy.java | 4 +- .../junitcore/pc/SingleThreadScheduler.java | 6 +- .../junitcore/ConcurrentRunListenerTest.java | 25 ++-- .../surefire/junitcore/JUnitCoreTester.java | 10 +- .../surefire/junitcore/MockReporter.java | 71 ++++++++- .../surefire/junitcore/Surefire746Test.java | 22 +-- .../pc/ParallelComputerBuilderTest.java | 14 +- .../pc/ParallelComputerUtilTest.java | 20 +-- .../pc/SchedulingStrategiesTest.java | 6 +- .../maven/surefire/testng/TestNGProvider.java | 7 +- 71 files changed, 815 insertions(+), 740 deletions(-) delete mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleStream.java delete mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/api/report/DefaultDirectConsoleReporter.java rename surefire-api/src/main/java/org/apache/maven/surefire/api/report/{ConsoleOutputReceiver.java => TestOutputReceiver.java} (80%) create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReportEntry.java create mode 100644 surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestReportListener.java delete mode 100644 surefire-providers/surefire-junit47/src/assembly/assembly.xml diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java index 9a2065b740..c8eb6725ff 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClient.java @@ -23,9 +23,11 @@ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; import org.apache.maven.surefire.api.event.Event; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.extensions.EventHandler; import org.apache.maven.surefire.api.booter.MasterProcessChannelEncoder; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReceiver; import org.apache.maven.surefire.api.report.ReportEntry; import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.RunMode; @@ -78,7 +80,7 @@ public class ForkClient private final int forkNumber; - private volatile RunListener testSetReporter; + private volatile TestReportListener testSetReporter; /** * Written by one Thread and read by another: Main Thread and ForkStarter's Thread. @@ -379,7 +381,7 @@ public final boolean hadTimeout() /** * Only {@link #getConsoleOutputReceiver()} may call this method in another Thread. */ - private RunListener getTestSetReporter() + private TestReportListener getTestSetReporter() { if ( testSetReporter == null ) { @@ -387,7 +389,7 @@ private RunListener getTestSetReporter() { if ( testSetReporter == null ) { - testSetReporter = defaultReporterFactory.createReporter(); + testSetReporter = defaultReporterFactory.createTestReportListener(); } } } @@ -404,7 +406,7 @@ void dumpToLoFile( String msg ) private void writeTestOutput( String output, boolean newLine, boolean isStdout ) { getConsoleOutputReceiver() - .writeTestOutput( output, newLine, isStdout ); + .writeTestOutput( new TestOutputReportEntry( output, isStdout, newLine, /*todo*/ null, null ) ); } public final Map getTestVmSystemProperties() @@ -423,14 +425,14 @@ public final RunListener getReporter() return getTestSetReporter(); } - public ConsoleOutputReceiver getConsoleOutputReceiver() + public TestOutputReceiver getConsoleOutputReceiver() { - return (ConsoleOutputReceiver) getTestSetReporter(); + return getTestSetReporter(); } private ConsoleLogger getOrCreateConsoleLogger() { - return (ConsoleLogger) getTestSetReporter(); + return getTestSetReporter(); } public void close( boolean hadTimeout ) diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java index 729a072f7a..edfcf351a7 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java @@ -21,6 +21,7 @@ import org.apache.maven.plugin.surefire.booterclient.output.InPluginProcessDumpSingleton; import org.apache.maven.surefire.api.report.ReportEntry; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.api.report.TestSetReportEntry; import java.io.BufferedOutputStream; @@ -88,7 +89,7 @@ public synchronized void close() } @Override - public synchronized void writeTestOutput( String output, boolean newLine, boolean stdout ) + public synchronized void writeTestOutput( TestOutputReportEntry reportEntry ) { try { @@ -109,14 +110,14 @@ public synchronized void writeTestOutput( String output, boolean newLine, boolea os = new BufferedOutputStream( new FileOutputStream( file ), STREAM_BUFFER_SIZE ); fileOutputStream.set( os, OPEN ); } - + String output = reportEntry.getLog(); if ( output == null ) { output = "null"; } Charset charset = Charset.forName( encoding ); os.write( output.getBytes( charset ) ); - if ( newLine ) + if ( reportEntry.isNewLine() ) { os.write( NL.getBytes( charset ) ); } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java index 693e63d087..cf93b6bf15 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java @@ -29,7 +29,7 @@ import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener; import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.report.RunStatistics; import org.apache.maven.surefire.api.report.StackTraceWriter; import org.apache.maven.surefire.api.suite.RunResult; @@ -97,7 +97,7 @@ public DefaultReporterFactory( StartupReportConfiguration reportConfiguration, C } @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { TestSetRunListener testSetRunListener = new TestSetRunListener( createConsoleReporter(), diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java index 3232e16ed1..a1748b691b 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java @@ -19,6 +19,7 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.api.report.TestSetReportEntry; import java.io.PrintStream; @@ -47,16 +48,16 @@ public DirectConsoleOutput( PrintStream out, PrintStream err ) } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { - PrintStream stream = stdout ? out : err; - if ( newLine ) + PrintStream stream = reportEntry.isStdOut() ? out : err; + if ( reportEntry.isNewLine() ) { - stream.println( output ); + stream.println( reportEntry.getLog() ); } else { - stream.print( output ); + stream.print( reportEntry.getLog() ); } } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java index 35d0b8905c..165ffe0c1f 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java @@ -19,6 +19,7 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.api.report.TestSetReportEntry; /** @@ -56,7 +57,7 @@ public void close() } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java index 9ab198c3d2..6af665dbdc 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java @@ -25,16 +25,15 @@ import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; -import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.plugin.surefire.runorder.StatisticsReporter; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener; import org.apache.maven.surefire.extensions.StatelessReportEventListener; import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener; import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.RunMode; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; import static org.apache.maven.plugin.surefire.report.ReportEntryType.ERROR; @@ -51,13 +50,13 @@ * @author Kristian Rosenvold */ public class TestSetRunListener - implements RunListener, ConsoleOutputReceiver, ConsoleLogger + implements TestReportListener { private final Queue testMethodStats = new ConcurrentLinkedQueue<>(); private final TestSetStats detailsForThis; - private final ConsoleOutputReportEventListener consoleOutputReceiver; + private final ConsoleOutputReportEventListener testOutputReceiver; private final boolean briefOrPlainFormat; @@ -83,7 +82,7 @@ public TestSetRunListener( StatelessTestsetInfoConsoleReportEventListener fileReporter, StatelessReportEventListener simpleXMLReporter, - ConsoleOutputReportEventListener consoleOutputReceiver, + ConsoleOutputReportEventListener testOutputReceiver, StatisticsReporter statisticsReporter, boolean trimStackTrace, boolean isPlainFormat, boolean briefOrPlainFormat, Object lock ) { @@ -91,7 +90,7 @@ public TestSetRunListener( StatelessTestsetInfoConsoleReportEventListener events = new ArrayList<>(); @@ -236,9 +235,10 @@ public void error( Throwable t ) } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { - events.add( stdout ? STDOUT : STDERR ); - data.add( newLine ? output + "\n" : output ); + events.add( reportEntry.isStdOut() ? STDOUT : STDERR ); + String output = reportEntry.getLog(); + data.add( reportEntry.isNewLine() ? output + "\n" : output ); } } diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java index ace0e5d2da..ff0bbb34fe 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/TestSetMockReporterFactory.java @@ -25,7 +25,7 @@ import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter; import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import java.io.File; @@ -43,7 +43,7 @@ public TestSetMockReporterFactory() } @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { return new MockReporter(); } diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java index fa360850ad..7822300b65 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ForkClientTest.java @@ -477,14 +477,14 @@ public void shouldReceiveStdOut() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new StandardStreamOutEvent( NORMAL_RUN, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -519,14 +519,14 @@ public void shouldReceiveStdOutNewLine() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new StandardStreamOutWithNewLineEvent( NORMAL_RUN, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -561,14 +561,14 @@ public void shouldReceiveStdErr() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new StandardStreamErrEvent( NORMAL_RUN, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -603,14 +603,14 @@ public void shouldReceiveStdErrNewLine() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new StandardStreamErrWithNewLineEvent( NORMAL_RUN, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -641,7 +641,7 @@ public void shouldLogConsoleError() { DefaultReporterFactory factory = mock( DefaultReporterFactory.class ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); @@ -651,7 +651,7 @@ public void shouldLogConsoleError() client.handleEvent( event ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verify( factory, times( 1 ) ) .getReportsDirectory(); verifyNoMoreInteractions( factory ); @@ -733,14 +733,14 @@ public void shouldLogConsoleWarning() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new ConsoleWarningEvent( "s1" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -775,14 +775,14 @@ public void shouldLogConsoleDebug() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new ConsoleDebugEvent( "s1" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -817,14 +817,14 @@ public void shouldLogConsoleInfo() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); client.handleEvent( new ConsoleInfoEvent( "s1" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) - .createReporter(); + .createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -859,7 +859,7 @@ public void shouldSendSystemProperty() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); @@ -899,7 +899,7 @@ public void shouldSendTestsetStartingKilled() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -932,7 +932,7 @@ public void shouldSendTestsetStartingKilled() verify( notifiableTestStream ) .shutdown( Shutdown.KILL ); verifyNoMoreInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -994,7 +994,7 @@ public void shouldSendTestsetStarting() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1026,7 +1026,7 @@ public void shouldSendTestsetStarting() client.tryToTimeout( System.currentTimeMillis(), 1 ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1090,7 +1090,7 @@ public void shouldSendTestsetCompleted() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1119,7 +1119,7 @@ public void shouldSendTestsetCompleted() client.handleEvent( new TestsetCompletedEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1183,7 +1183,7 @@ public void shouldSendTestStarting() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1212,7 +1212,7 @@ public void shouldSendTestStarting() client.handleEvent( new TestStartingEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.hasTestsInProgress() ) .isTrue(); @@ -1277,7 +1277,7 @@ public void shouldSendTestSucceeded() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1313,7 +1313,7 @@ public void shouldSendTestSucceeded() client.handleEvent( new TestSucceededEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1381,7 +1381,7 @@ public void shouldSendTestFailed() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1417,7 +1417,7 @@ public void shouldSendTestFailed() client.handleEvent( new TestFailedEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1491,7 +1491,7 @@ public void shouldSendTestSkipped() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1527,7 +1527,7 @@ public void shouldSendTestSkipped() client.handleEvent( new TestSkippedEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1599,7 +1599,7 @@ public void shouldSendTestError() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1637,7 +1637,7 @@ public void shouldSendTestError() client.handleEvent( new TestErrorEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); @@ -1705,7 +1705,7 @@ public void shouldSendTestAssumptionFailure() when( factory.getReportsDirectory() ) .thenReturn( new File( target, "surefire-reports" ) ); MockReporter receiver = new MockReporter(); - when( factory.createReporter() ) + when( factory.createTestReportListener() ) .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); @@ -1742,7 +1742,7 @@ public void shouldSendTestAssumptionFailure() client.handleEvent( new TestAssumptionFailureEvent( NORMAL_RUN, reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); - verify( factory ).createReporter(); + verify( factory ).createTestReportListener(); verifyNoMoreInteractions( factory ); assertThat( client.getReporter() ) .isNotNull(); diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java index d2a9c20713..0fc5051ac3 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/E2ETest.java @@ -25,7 +25,8 @@ import org.apache.maven.surefire.api.booter.Command; import org.apache.maven.surefire.api.event.Event; import org.apache.maven.surefire.api.fork.ForkNodeArguments; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.booter.spi.EventChannelEncoder; import org.apache.maven.surefire.booter.spi.SurefireMasterProcessChannelProcessorFactory; import org.apache.maven.surefire.extensions.CommandReader; @@ -52,6 +53,7 @@ import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; @@ -133,12 +135,12 @@ public void handleEvent( @Nonnull Event event ) @Override public void run() { - ConsoleOutputReceiver target = new ConsoleOutputReceiver() + TestOutputReceiver target = new TestOutputReceiver() { @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { - encoder.stdOut( output, true ); + encoder.testOutput( stdOutln( reportEntry.getLog() ) ); } }; @@ -153,7 +155,7 @@ public void writeTestOutput( String output, boolean newLine, boolean stdout ) for ( int i = 0; i < totalCalls; i++ ) { //System.out.println( LONG_STRING ); - encoder.stdOut( LONG_STRING, true ); + encoder.testOutput( stdOutln( LONG_STRING ) ); } long t2 = System.currentTimeMillis(); long spent = t2 - t1; diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/ForkedProcessEventNotifierTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/ForkedProcessEventNotifierTest.java index 31bc529dbb..f9ad00c498 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/ForkedProcessEventNotifierTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/ForkedProcessEventNotifierTest.java @@ -74,6 +74,9 @@ import static java.lang.String.format; import static java.nio.charset.StandardCharsets.UTF_8; import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErr; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOut; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; import static org.apache.maven.surefire.api.util.internal.Channels.newBufferedChannel; import static org.apache.maven.surefire.api.util.internal.Channels.newChannel; import static org.assertj.core.api.Assertions.assertThat; @@ -568,7 +571,7 @@ public void testStdOutStream() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdOut( "msg", false ); + encoder.testOutput( stdOut( "msg" ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -607,7 +610,7 @@ public void testStdOutStreamPrint() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdOut( "", false ); + encoder.testOutput( stdOut( "" ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -646,7 +649,7 @@ public void testStdOutStreamPrintWithNull() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdOut( null, false ); + encoder.testOutput( stdOut( null ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -685,7 +688,7 @@ public void testStdOutStreamPrintln() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdOut( "", true ); + encoder.testOutput( stdOutln( "" ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -724,7 +727,7 @@ public void testStdOutStreamPrintlnWithNull() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdOut( null, true ); + encoder.testOutput( stdOutln( null ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -763,7 +766,7 @@ public void testStdErrStream() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.stdErr( "msg", false ); + encoder.testOutput( stdErr( "msg" ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java index 14e4d823e9..cb36c0d27c 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java @@ -33,6 +33,7 @@ import org.apache.maven.plugin.surefire.extensions.SurefireStatelessReporter; import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter; import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.shared.utils.logging.MessageUtils; import org.apache.maven.surefire.report.RunStatistics; import org.apache.maven.surefire.api.report.SafeThrowable; @@ -286,7 +287,7 @@ public void testLogger() DefaultReporterFactory factory = new DefaultReporterFactory( reportConfig, reporter ); - TestSetRunListener runListener = (TestSetRunListener) factory.createReporter(); + TestReportListener runListener = factory.createTestReportListener(); assertTrue( runListener.isDebugEnabled() ); assertTrue( runListener.isInfoEnabled() ); @@ -358,7 +359,7 @@ public void testCreateReporterWithZeroStatistics() DefaultReporterFactory factory = new DefaultReporterFactory( reportConfig, reporter ); assertEquals( reportsDirectory, factory.getReportsDirectory() ); - TestSetRunListener runListener = (TestSetRunListener) factory.createReporter(); + TestSetRunListener runListener = (TestSetRunListener) factory.createTestReportListener(); Collection listeners = getInternalState( factory, "listeners" ); assertEquals( 1, listeners.size() ); assertTrue( listeners.contains( runListener ) ); diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java index 32877b993d..6e044f79e6 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java @@ -34,6 +34,8 @@ import org.apache.maven.surefire.shared.utils.io.FileUtils; import static java.nio.charset.StandardCharsets.US_ASCII; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOut; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; import static org.assertj.core.api.Assertions.assertThat; /** @@ -54,7 +56,7 @@ public void testFileNameWithoutSuffix() throws IOException new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null ); ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, false, null, "UTF-8" ); reporter.testSetStarting( reportEntry ); - reporter.writeTestOutput( "some ", false, true ); + reporter.writeTestOutput( stdOut( "some " ) ); reporter.testSetCompleted( reportEntry ); reporter.close(); @@ -82,8 +84,8 @@ public void testFileNameWithSuffix() throws IOException ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, suffixText, false, null, "UTF-8" ); reporter.testSetStarting( reportEntry ); - reporter.writeTestOutput( null, true, true ); - reporter.writeTestOutput( "some ", true, true ); + reporter.writeTestOutput( stdOutln( null ) ); + reporter.writeTestOutput( stdOutln( "some " ) ); reporter.testSetCompleted( reportEntry ); reporter.close(); @@ -106,7 +108,7 @@ public void testNullReportFile() throws IOException { File reportDir = new File( new File( System.getProperty( "user.dir" ), "target" ), "tmp3" ); ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, false, null, "UTF-8" ); - reporter.writeTestOutput( "some text", false, true ); + reporter.writeTestOutput( stdOut( "some text" ) ); reporter.testSetCompleted( new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null ) ); reporter.close(); @@ -137,7 +139,7 @@ public void testConcurrentAccessReportFile() throws Exception @Override public Void call() { - reporter.writeTestOutput( "some text\n", false, true ); + reporter.writeTestOutput( stdOut( "some text\n" ) ); return null; } } ); diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/BaseProviderFactory.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/BaseProviderFactory.java index 9654b14977..1436e98dc6 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/BaseProviderFactory.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/BaseProviderFactory.java @@ -22,8 +22,6 @@ import org.apache.maven.surefire.api.cli.CommandLineOption; import org.apache.maven.surefire.api.provider.CommandChainReader; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; import org.apache.maven.surefire.api.report.ReporterConfiguration; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.testset.DirectoryScannerParameters; @@ -53,8 +51,6 @@ public class BaseProviderFactory private ReporterFactory reporterFactory; - private MasterProcessChannelEncoder masterProcessChannelEncoder; - private List mainCliOptions = emptyList(); private Map providerProperties; @@ -148,14 +144,6 @@ public void setClassLoaders( ClassLoader testClassLoader ) this.testClassLoader = testClassLoader; } - @Override - public ConsoleStream getConsoleLogger() - { - return insideFork - ? new ForkingRunListener( masterProcessChannelEncoder, reporterConfiguration.isTrimStackTrace() ) - : new DefaultDirectConsoleReporter( reporterConfiguration.getOriginalSystemOut() ); - } - public void setTestRequest( TestRequest testRequest ) { this.testRequest = testRequest; @@ -260,9 +248,4 @@ public void setSystemExitTimeout( Integer systemExitTimeout ) { this.systemExitTimeout = systemExitTimeout; } - - public void setForkedChannelEncoder( MasterProcessChannelEncoder masterProcessChannelEncoder ) - { - this.masterProcessChannelEncoder = masterProcessChannelEncoder; - } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java index 31bbfa5b9b..cf7ad5b918 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingReporterFactory.java @@ -20,7 +20,7 @@ */ import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.suite.RunResult; /** @@ -43,7 +43,7 @@ public ForkingReporterFactory( boolean trimstackTrace, MasterProcessChannelEncod } @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { return new ForkingRunListener( eventChannel, trimstackTrace ); } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingRunListener.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingRunListener.java index 169f358272..a67643a491 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingRunListener.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkingRunListener.java @@ -19,11 +19,9 @@ * under the License. */ -import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.TestSetReportEntry; @@ -31,27 +29,26 @@ import static java.util.Objects.requireNonNull; /** - * Encodes the full output of the test run to the stdout stream. + * Encodes the full output of the test run to the "target". *
* This class and the ForkClient contain the full definition of the * "wire-level" protocol used by the forked process. The protocol * is *not* part of any public api and may change without further * notice. *
- * This class is threadsafe. + * This class is thread-safe. *
- * The synchronization in the underlying PrintStream (target instance) - * is used to preserve thread safety of the output stream. To perform - * multiple writes/prints for a single request, they must - * synchronize on "target.out" variable in this class. + * The synchronization in the underlying (target instance) + * is used to preserve thread safety of the target stream. + * To perform multiple writes/prints for a single request, + * they must synchronize on "target" variable in this class. * * @author Kristian Rosenvold */ public class ForkingRunListener - implements RunListener, ConsoleLogger, ConsoleOutputReceiver, ConsoleStream + implements TestReportListener { private final MasterProcessChannelEncoder target; - private final boolean trim; private volatile RunMode runMode = NORMAL_RUN; @@ -126,16 +123,9 @@ public RunMode markAs( RunMode currentRunMode ) } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { - if ( stdout ) - { - target.stdOut( output, newLine ); - } - else - { - target.stdErr( output, newLine ); - } + target.testOutput( reportEntry ); } @Override @@ -197,10 +187,4 @@ public void error( Throwable t ) { error( null, t ); } - - @Override - public void println( String message ) - { - writeTestOutput( message, true, true ); - } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/MasterProcessChannelEncoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/MasterProcessChannelEncoder.java index cb543f6ffa..231bb46c7b 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/MasterProcessChannelEncoder.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/MasterProcessChannelEncoder.java @@ -21,6 +21,7 @@ import org.apache.maven.surefire.api.report.ReportEntry; import org.apache.maven.surefire.api.report.StackTraceWriter; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import java.util.Map; @@ -54,9 +55,7 @@ public interface MasterProcessChannelEncoder void testAssumptionFailure( ReportEntry reportEntry, boolean trimStackTraces ); - void stdOut( String msg, boolean newLine ); - - void stdErr( String msg, boolean newLine ); + void testOutput( TestOutputReportEntry reportEntry ); void consoleInfoLog( String msg ); diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/provider/ProviderParameters.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/provider/ProviderParameters.java index 048622f897..34a2ffa689 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/provider/ProviderParameters.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/provider/ProviderParameters.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.cli.CommandLineOption; -import org.apache.maven.surefire.api.report.ConsoleStream; import org.apache.maven.surefire.api.report.ReporterConfiguration; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.testset.DirectoryScannerParameters; @@ -77,16 +76,6 @@ public interface ProviderParameters */ ReporterFactory getReporterFactory(); - /** - * Gets a logger intended for console output. - *
- * This output is intended for provider-oriented messages that are not attached to a single test-set - * and will normally be written to something console-like immediately. - * - * @return A console stream logger - */ - ConsoleStream getConsoleLogger(); - /** * The raw parameters used in creating the directory scanner * diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputCapture.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputCapture.java index 2298e7f77e..c00619f3cd 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputCapture.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputCapture.java @@ -19,12 +19,18 @@ * under the License. */ +import javax.annotation.Nonnull; + import java.io.IOException; import java.io.OutputStream; import java.io.PrintStream; import static java.lang.System.setErr; import static java.lang.System.setOut; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErr; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErrln; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOut; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; /** * Deals with system.out/err. @@ -32,7 +38,7 @@ */ public final class ConsoleOutputCapture { - public static void startCapture( ConsoleOutputReceiver target ) + public static void startCapture( TestOutputReceiver target ) { setOut( new ForwardingPrintStream( true, target ) ); setErr( new ForwardingPrintStream( false, target ) ); @@ -42,9 +48,9 @@ private static final class ForwardingPrintStream extends PrintStream { private final boolean isStdout; - private final ConsoleOutputReceiver target; + private final TestOutputReceiver target; - ForwardingPrintStream( boolean stdout, ConsoleOutputReceiver target ) + ForwardingPrintStream( boolean stdout, TestOutputReceiver target ) { super( new NullOutputStream() ); isStdout = stdout; @@ -52,13 +58,14 @@ private static final class ForwardingPrintStream } @Override - public void write( byte[] buf, int off, int len ) + public void write( @Nonnull byte[] buf, int off, int len ) { - target.writeTestOutput( new String( buf, off, len ), false, isStdout ); + String log = new String( buf, off, len ); + target.writeTestOutput( isStdout ? stdOut( log ) : stdErr( log ) ); } @Override - public void write( byte[] b ) + public void write( @Nonnull byte[] b ) throws IOException { write( b, 0, b.length ); @@ -114,7 +121,7 @@ public void println( double x ) } @Override - public void println( char[] x ) + public void println( @Nonnull char[] x ) { println( String.valueOf( x ) ); } @@ -128,13 +135,14 @@ public void println( Object x ) @Override public void println( String s ) { - target.writeTestOutput( s == null ? "null" : s, true, isStdout ); + String log = s == null ? "null" : s; + target.writeTestOutput( isStdout ? stdOutln( log ) : stdErrln( log ) ); } @Override public void println() { - target.writeTestOutput( "", true, isStdout ); + target.writeTestOutput( isStdout ? stdOutln( "" ) : stdErrln( "" ) ); } @Override @@ -174,7 +182,7 @@ public void print( double x ) } @Override - public void print( char[] x ) + public void print( @Nonnull char[] x ) { print( String.valueOf( x ) ); } @@ -188,7 +196,8 @@ public void print( Object x ) @Override public void print( String s ) { - target.writeTestOutput( s == null ? "null" : s, false, isStdout ); + String log = s == null ? "null" : s; + target.writeTestOutput( isStdout ? stdOut( log ) : stdErr( log ) ); } @Override diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiverForCurrentThread.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiverForCurrentThread.java index 48436309eb..0874b2b9f8 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiverForCurrentThread.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiverForCurrentThread.java @@ -24,21 +24,21 @@ */ public final class ConsoleOutputReceiverForCurrentThread { - private static final ThreadLocal CURRENT + private static final ThreadLocal CURRENT = new InheritableThreadLocal<>(); private ConsoleOutputReceiverForCurrentThread() { } - public static ConsoleOutputReceiver get() + public static TestOutputReceiver get() { return CURRENT.get(); } - public static void set( ConsoleOutputReceiver consoleOutputReceiver ) + public static void set( TestOutputReceiver testOutputReceiver ) { - CURRENT.set( consoleOutputReceiver ); + CURRENT.set( testOutputReceiver ); } public static void remove() diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleStream.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleStream.java deleted file mode 100644 index 269b68f78a..0000000000 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleStream.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.apache.maven.surefire.api.report; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -/** - * Delegates to {@link System#out}. - */ -public interface ConsoleStream -{ - void println( String message ); -} diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/DefaultDirectConsoleReporter.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/DefaultDirectConsoleReporter.java deleted file mode 100644 index b3a4c1cdff..0000000000 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/DefaultDirectConsoleReporter.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.apache.maven.surefire.api.report; - -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import java.io.PrintStream; - -/** - * @author Kristian Rosenvold - */ -public final class DefaultDirectConsoleReporter - implements ConsoleStream -{ - private final PrintStream systemOut; - - public DefaultDirectConsoleReporter( PrintStream systemOut ) - { - this.systemOut = systemOut; - } - - @Override - public void println( String message ) - { - systemOut.println( message ); - } -} diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterConfiguration.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterConfiguration.java index 03e7362b85..324ebbcf5b 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterConfiguration.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterConfiguration.java @@ -20,7 +20,6 @@ */ import java.io.File; -import java.io.PrintStream; /** * Bits and pieces of reporting configuration that seem to be necessary on the provider side. @@ -32,25 +31,12 @@ public class ReporterConfiguration { private final File reportsDirectory; - - private final PrintStream originalSystemOut; - - /** - * A non-null Boolean value - */ private final boolean trimStackTrace; public ReporterConfiguration( File reportsDirectory, boolean trimStackTrace ) { this.reportsDirectory = reportsDirectory; this.trimStackTrace = trimStackTrace; - - /* - * While this may seem slightly odd, when this object is constructed no user code has been run - * (including classloading), and we can be guaranteed that no-one has modified System.out/System.err. - * As soon as we start loading user code, all h*ll breaks loose in this respect. - */ - this.originalSystemOut = System.out; } /** @@ -72,15 +58,4 @@ public boolean isTrimStackTrace() { return trimStackTrace; } - - /** - * The original system out belonging to the (possibly forked) surefire process. - * Note that users of Reporter/ReporterFactory should normally not be using this. - * - * @return A printstream. - */ - public PrintStream getOriginalSystemOut() - { - return originalSystemOut; - } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactory.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactory.java index af9057e005..81b2318cd8 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactory.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ReporterFactory.java @@ -29,11 +29,11 @@ public interface ReporterFactory { /** - * Creates a reporter. + * Creates a reporter listener. * - * @return A reporter instance + * @return new reporter listener instance */ - RunListener createReporter(); + TestReportListener createTestReportListener(); /** * Closes the factory, freeing resources allocated in the factory. diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiver.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReceiver.java similarity index 80% rename from surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiver.java rename to surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReceiver.java index 99e47f46f4..f77f9d4d18 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/ConsoleOutputReceiver.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReceiver.java @@ -23,16 +23,14 @@ * A receiver of stdout/sterr output from running tests. This receiver knows how to associate * the output with a given testset. */ -public interface ConsoleOutputReceiver +public interface TestOutputReceiver { /** * Forwards process output from the running test-case into the reporting system * - * @param output stdout/sterr output from running tests - * @param newLine print on new line - * @param stdout Indicates if this is stdout + * @param reportEntry wraps test output with descriptive information of the output */ - void writeTestOutput( String output, boolean newLine, boolean stdout ); + void writeTestOutput( TestOutputReportEntry reportEntry ); } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReportEntry.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReportEntry.java new file mode 100644 index 0000000000..9e8fb6e0ea --- /dev/null +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestOutputReportEntry.java @@ -0,0 +1,116 @@ +package org.apache.maven.surefire.api.report; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * This report entry should be used in {@link TestOutputReceiver#writeTestOutput(TestOutputReportEntry)}. + */ +public final class TestOutputReportEntry +{ + private final String log; + private final boolean isStdOut; + private final boolean newLine; + private final RunMode runMode; + private final Long testRunId; + + /** + * Wraps the output from the running test-case. + * + * @param log stdout/sterr output from running tests + * @param isStdOut Indicates if this is stdout + * @param newLine print on new line + * @param runMode the phase of testset + * @param testRunId unique id of the test run pointing to the test description + */ + public TestOutputReportEntry( String log, boolean isStdOut, boolean newLine, RunMode runMode, Long testRunId ) + { + this.log = log; + this.isStdOut = isStdOut; + this.newLine = newLine; + this.runMode = runMode; + this.testRunId = testRunId; + } + + /** + * Wraps the output from the running test-case. + * + * @param log stdout/sterr output from running tests + * @param isStdOut Indicates if this is stdout + * @param newLine print on new line + */ + private TestOutputReportEntry( String log, boolean isStdOut, boolean newLine ) + { + this( log, isStdOut, newLine, null, null ); + } + + public TestOutputReportEntry( TestOutputReportEntry reportEntry, RunMode runMode, long testRunId ) + { + log = reportEntry.getLog(); + isStdOut = reportEntry.isStdOut(); + newLine = reportEntry.isNewLine(); + this.runMode = runMode; + this.testRunId = testRunId; + } + + public String getLog() + { + return log; + } + + public boolean isStdOut() + { + return isStdOut; + } + + public boolean isNewLine() + { + return newLine; + } + + public RunMode getRunMode() + { + return runMode; + } + + public Long getTestRunId() + { + return testRunId; + } + + public static TestOutputReportEntry stdOut( String log ) + { + return new TestOutputReportEntry( log, true, false ); + } + + public static TestOutputReportEntry stdOutln( String log ) + { + return new TestOutputReportEntry( log, true, true ); + } + + public static TestOutputReportEntry stdErr( String log ) + { + return new TestOutputReportEntry( log, false, false ); + } + + public static TestOutputReportEntry stdErrln( String log ) + { + return new TestOutputReportEntry( log, false, true ); + } +} diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestReportListener.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestReportListener.java new file mode 100644 index 0000000000..420de84086 --- /dev/null +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/report/TestReportListener.java @@ -0,0 +1,45 @@ +package org.apache.maven.surefire.api.report; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; + +/** + * This architecture has two sides (forked JVM, plugin JVM) implementing the same interface {@link TestReportListener}: + *
+ * 1. publisher - surefire fork JVM: {@link org.apache.maven.surefire.api.booter.ForkingRunListener}
+ *    registered in {@link  org.apache.maven.surefire.api.provider.SurefireProvider}
+ * 2. consumer - plugin JVM: {@code TestSetRunListener} registered in the {@code ForkClient}
+ * 
+ * Both implementations of {@link TestReportListener}, i.e. + * {@link org.apache.maven.surefire.api.booter.ForkingRunListener} and {@code TestSetRunListener} + * are decorators. They are used as delegators in interface adapters, see the implementations of + * JUnit's {@code RunListener RunListener-s}. + *
+ * The serialization of data in {@link TestReportListener} ensures that the ReportEntries are transferred + * from the fork to the plugin. + *
+ * Note: The adapters in the module surefire-junit47 are temporal and will be removed after we have fixed + * the SUREFIRE-1860 and XML reporter in SUREFIRE-1643. The adapters are a workaround of a real fix in both Jira issues. + */ +public interface TestReportListener + extends RunListener, TestOutputReceiver, ConsoleLogger +{ +} diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java index 6712ef16de..bd44d55c4b 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/ForkedBooter.java @@ -137,7 +137,7 @@ private void setupBooter( String tmpDir, String dumpFileName, String surefirePro flushEventChannelOnExit(); forkingReporterFactory = createForkingReporterFactory(); - logger = (ConsoleLogger) forkingReporterFactory.createReporter(); + logger = forkingReporterFactory.createTestReportListener(); commandReader = new CommandReader( decoder, providerConfiguration.getShutdown(), logger ); pingScheduler = isDebugging ? null : listenToShutdownCommands( booterDeserializer.getPluginPid() ); @@ -453,7 +453,7 @@ public void update( Command command ) private void runSuitesInProcess() throws TestSetFailedException, InvocationTargetException { - createProviderInCurrentClassloader( forkingReporterFactory ).invoke( testSet ); + createProviderInCurrentClassloader().invoke( testSet ); } private ForkingReporterFactory createForkingReporterFactory() @@ -504,14 +504,13 @@ public void run() ); } - private SurefireProvider createProviderInCurrentClassloader( ForkingReporterFactory reporterManagerFactory ) + private SurefireProvider createProviderInCurrentClassloader() { BaseProviderFactory bpf = new BaseProviderFactory( true ); - bpf.setReporterFactory( reporterManagerFactory ); + bpf.setReporterFactory( forkingReporterFactory ); bpf.setCommandReader( commandReader ); bpf.setTestRequest( providerConfiguration.getTestSuiteDefinition() ); bpf.setReporterConfiguration( providerConfiguration.getReporterConfiguration() ); - bpf.setForkedChannelEncoder( eventChannel ); ClassLoader classLoader = currentThread().getContextClassLoader(); bpf.setClassLoaders( classLoader ); bpf.setTestArtifactInfo( providerConfiguration.getTestArtifact() ); diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java index 9352548eb1..3fd45737ec 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/spi/EventChannelEncoder.java @@ -27,6 +27,7 @@ import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.SafeThrowable; import org.apache.maven.surefire.api.report.StackTraceWriter; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.api.util.internal.WritableBufferedByteChannel; import org.apache.maven.surefire.booter.stream.EventEncoder; @@ -197,17 +198,15 @@ public void testAssumptionFailure( ReportEntry reportEntry, boolean trimStackTra } @Override - public void stdOut( String msg, boolean newLine ) - { - ForkedProcessEventType event = newLine ? BOOTERCODE_STDOUT_NEW_LINE : BOOTERCODE_STDOUT; - setOutErr( event, msg ); - } - - @Override - public void stdErr( String msg, boolean newLine ) - { - ForkedProcessEventType event = newLine ? BOOTERCODE_STDERR_NEW_LINE : BOOTERCODE_STDERR; - setOutErr( event, msg ); + public void testOutput( TestOutputReportEntry reportEntry ) + { + boolean stdout = reportEntry.isStdOut(); + boolean newLine = reportEntry.isNewLine(); + String msg = reportEntry.getLog(); + ForkedProcessEventType event = + stdout ? ( newLine ? BOOTERCODE_STDOUT_NEW_LINE : BOOTERCODE_STDOUT ) + : ( newLine ? BOOTERCODE_STDERR_NEW_LINE : BOOTERCODE_STDERR ); + setOutErr( event, msg ); /*todo*/ } private void setOutErr( ForkedProcessEventType eventType, String message ) diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java index b4290a751d..18e34a0671 100644 --- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java +++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/SurefireReflectorTest.java @@ -25,7 +25,7 @@ import org.apache.maven.surefire.api.provider.SurefireProvider; import org.apache.maven.surefire.api.report.ReporterConfiguration; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.testset.DirectoryScannerParameters; import org.apache.maven.surefire.api.testset.RunOrderParameters; @@ -55,7 +55,7 @@ public void testShouldCreateFactoryWithoutException() ReporterFactory factory = new ReporterFactory() { @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { return null; } @@ -255,7 +255,7 @@ public void testReporterFactory() ReporterFactory reporterFactory = new ReporterFactory() { @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { return null; } @@ -279,7 +279,7 @@ public void testReporterFactoryAware() ReporterFactory reporterFactory = new ReporterFactory() { @Override - public RunListener createReporter() + public TestReportListener createTestReportListener() { return null; } diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java index 0828f81629..7699d8ceec 100644 --- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java +++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/EventChannelEncoderTest.java @@ -39,6 +39,10 @@ import static java.util.Arrays.copyOfRange; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_ERROR; import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErr; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdErrln; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOut; +import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; import static org.apache.maven.surefire.api.util.internal.Channels.newBufferedChannel; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -891,13 +895,13 @@ public void testAcquireNextTest() public void testSendOpcode() { Channel channel = new Channel(); - new EventChannelEncoder( channel ).stdOut( "msg", false ); + new EventChannelEncoder( channel ).testOutput( stdOut( "msg" ) ); assertThat( toString( channel.src ) ) .isEqualTo( ":maven-surefire-event:" + (char) 14 + ":std-out-stream:" + (char) 10 + ":normal-run:" + (char) 5 + ":UTF-8:\u0000\u0000\u0000\u0003:msg:" ); channel = new Channel(); - new EventChannelEncoder( channel ).stdErr( null, false ); + new EventChannelEncoder( channel ).testOutput( stdErr( null ) ); assertThat( toString( channel.src ) ) .isEqualTo( ":maven-surefire-event:" + (char) 14 + ":std-err-stream:" + (char) 10 + ":normal-run:" + (char) 5 + ":UTF-8:\u0000\u0000\u0000\u0001:\u0000:" ); @@ -1077,7 +1081,7 @@ public void testStdOutStream() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.stdOut( "msg", false ); + encoder.testOutput( stdOut( "msg" ) ); channel.close(); String expected = ":maven-surefire-event:\u000e:std-out-stream:" @@ -1094,7 +1098,7 @@ public void testStdOutStreamLn() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.stdOut( "msg", true ); + encoder.testOutput( stdOutln( "msg" ) ); channel.close(); String expected = ":maven-surefire-event:\u0017:std-out-stream-new-line:" @@ -1111,7 +1115,7 @@ public void testStdErrStream() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.stdErr( "msg", false ); + encoder.testOutput( stdErr( "msg" ) ); channel.close(); String expected = ":maven-surefire-event:\u000e:std-err-stream:" @@ -1128,7 +1132,7 @@ public void testStdErrStreamLn() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.stdErr( "msg", true ); + encoder.testOutput( stdErrln( "msg" ) ); channel.close(); String expected = ":maven-surefire-event:\u0017:std-err-stream-new-line:" @@ -1217,7 +1221,7 @@ public void testInterruptHandling() throws IOException Thread.currentThread().interrupt(); try { - encoder.stdOut( "msg", false ); + encoder.testOutput( stdOut( "msg" ) ); channel.close(); } finally diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java index e165ebd689..ea4a1ed082 100644 --- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java +++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java @@ -19,6 +19,7 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import org.apache.maven.surefire.api.report.TestSetReportEntry; /** @@ -33,5 +34,5 @@ public interface ConsoleOutputReportEventListener void testSetStarting( TestSetReportEntry report ); void testSetCompleted( TestSetReportEntry report ); void close(); - void writeTestOutput( String output, boolean newLine, boolean stdout ); + void writeTestOutput( TestOutputReportEntry reportEntry ); } diff --git a/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/JUnit4RunListener.java b/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/JUnit4RunListener.java index 7f4e97e513..f59681061f 100644 --- a/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/JUnit4RunListener.java +++ b/surefire-providers/common-junit4/src/main/java/org/apache/maven/surefire/common/junit4/JUnit4RunListener.java @@ -19,15 +19,19 @@ * under the License. */ +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; import org.apache.maven.surefire.api.report.StackTraceWriter; +import org.apache.maven.surefire.api.report.TestOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.testset.TestSetFailedException; import org.apache.maven.surefire.api.util.internal.ClassMethod; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; +import org.junit.runner.notification.RunListener; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.isFailureInsideJUnitItself; import static org.apache.maven.surefire.common.junit4.JUnit4ProviderUtil.toClassMethod; @@ -41,12 +45,14 @@ * */ public class JUnit4RunListener - extends org.junit.runner.notification.RunListener + extends RunListener + implements TestOutputReceiver { - protected final RunListener reporter; + protected final TestReportListener reporter; /** - * This flag is set after a failure has occurred so that a {@link RunListener#testSucceeded} event is not fired. + * This flag is set after a failure has occurred so that a + * {@link org.apache.maven.surefire.api.report.RunListener#testSucceeded} event is not fired. * This is necessary because JUnit4 always fires a * {@link org.junit.runner.notification.RunListener#testRunFinished(Result)} * event-- even if there was a failure. @@ -58,11 +64,16 @@ public class JUnit4RunListener * * @param reporter the reporter to log testing events to */ - public JUnit4RunListener( RunListener reporter ) + public JUnit4RunListener( TestReportListener reporter ) { this.reporter = reporter; } + public final ConsoleLogger getConsoleLogger() + { + return reporter; + } + // Testrun methods are not invoked when using the runner /** @@ -163,7 +174,7 @@ public void testFinished( Description description ) } /** - * Delegates to {@link RunListener#testExecutionSkippedByUser()}. + * Delegates to {@link org.apache.maven.surefire.api.report.RunListener#testExecutionSkippedByUser()}. */ public void testExecutionSkippedByUser() { @@ -193,4 +204,10 @@ public static void rethrowAnyTestMechanismFailures( Result run ) } } } + + @Override + public void writeTestOutput( TestOutputReportEntry reportEntry ) + { + reporter.writeTestOutput( new TestOutputReportEntry( reportEntry, /*todo*/ null, 0L ) ); + } } diff --git a/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/MockReporter.java b/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/MockReporter.java index 39947fcba4..21ba876983 100644 --- a/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/MockReporter.java +++ b/surefire-providers/common-junit4/src/test/java/org/apache/maven/surefire/common/junit4/MockReporter.java @@ -20,8 +20,9 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.RunMode; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; import java.util.ArrayList; @@ -32,7 +33,7 @@ * Internal tests use only. */ final class MockReporter - implements RunListener + implements TestReportListener { private final List events = new ArrayList<>(); @@ -127,4 +128,69 @@ public void testFailed( ReportEntry report ) public void testAssumptionFailure( ReportEntry report ) { } + + @Override + public void writeTestOutput( TestOutputReportEntry reportEntry ) + { + } + + @Override + public boolean isDebugEnabled() + { + return false; + } + + @Override + public void debug( String message ) + { + + } + + @Override + public boolean isInfoEnabled() + { + return false; + } + + @Override + public void info( String message ) + { + + } + + @Override + public boolean isWarnEnabled() + { + return false; + } + + @Override + public void warning( String message ) + { + + } + + @Override + public boolean isErrorEnabled() + { + return false; + } + + @Override + public void error( String message ) + { + + } + + @Override + public void error( String message, Throwable t ) + { + + } + + @Override + public void error( Throwable t ) + { + + } } diff --git a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java index 8ff29c3f35..5749e91480 100644 --- a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java +++ b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java @@ -50,10 +50,8 @@ import org.apache.maven.surefire.api.provider.AbstractProvider; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; import org.apache.maven.surefire.api.report.ReporterException; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.testset.TestListResolver; import org.apache.maven.surefire.api.testset.TestSetFailedException; @@ -122,20 +120,20 @@ public RunResult invoke( Object forkTestSet ) final RunResult runResult; try { - RunListener runListener = reporterFactory.createReporter(); - startCapture( ( ConsoleOutputReceiver ) runListener ); + RunListenerAdapter adapter = new RunListenerAdapter( reporterFactory.createTestReportListener() ); + startCapture( adapter ); setupJunitLogger(); if ( forkTestSet instanceof TestsToRun ) { - invokeAllTests( (TestsToRun) forkTestSet, runListener ); + invokeAllTests( (TestsToRun) forkTestSet, adapter ); } else if ( forkTestSet instanceof Class ) { - invokeAllTests( fromClass( ( Class ) forkTestSet ), runListener ); + invokeAllTests( fromClass( ( Class ) forkTestSet ), adapter ); } else if ( forkTestSet == null ) { - invokeAllTests( scanClasspath(), runListener ); + invokeAllTests( scanClasspath(), adapter ); } else { @@ -167,9 +165,8 @@ private TestsToRun scanClasspath() return parameters.getRunOrderCalculator().orderTestClasses( scannedClasses ); } - private void invokeAllTests( TestsToRun testsToRun, RunListener runListener ) + private void invokeAllTests( TestsToRun testsToRun, RunListenerAdapter adapter ) { - RunListenerAdapter adapter = new RunListenerAdapter( runListener ); try { execute( testsToRun, adapter ); diff --git a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java index 101c6b8f44..2a8a0d71fc 100644 --- a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java +++ b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java @@ -34,11 +34,13 @@ import java.util.regex.Pattern; import java.util.stream.Stream; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.report.PojoStackTraceWriter; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SafeThrowable; import org.apache.maven.surefire.api.report.SimpleReportEntry; import org.apache.maven.surefire.api.report.StackTraceWriter; +import org.apache.maven.surefire.api.report.TestOutputReceiver; import org.junit.platform.engine.TestExecutionResult; import org.junit.platform.engine.TestSource; import org.junit.platform.engine.support.descriptor.ClassSource; @@ -51,17 +53,17 @@ * @since 2.22.0 */ final class RunListenerAdapter - implements TestExecutionListener + implements TestExecutionListener, TestOutputReceiver { private static final Pattern COMMA_PATTERN = Pattern.compile( "," ); private final ConcurrentMap testStartTime = new ConcurrentHashMap<>(); private final ConcurrentMap failures = new ConcurrentHashMap<>(); private final ConcurrentMap runningTestIdentifiersByUniqueId = new ConcurrentHashMap<>(); - private final RunListener runListener; + private final TestReportListener runListener; private volatile TestPlan testPlan; - RunListenerAdapter( RunListener runListener ) + RunListenerAdapter( TestReportListener runListener ) { this.runListener = runListener; } @@ -358,4 +360,10 @@ void reset() getFailures().clear(); testPlan = null; } + + @Override + public void writeTestOutput( TestOutputReportEntry reportEntry ) + { + runListener.writeTestOutput( new TestOutputReportEntry( reportEntry, /*todo*/ null, 0L ) ); + } } diff --git a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java index f7a9a42ee2..8649ea1e50 100644 --- a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java +++ b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java @@ -35,7 +35,6 @@ import static org.junit.jupiter.api.Assumptions.assumeFalse; import static org.junit.jupiter.api.Assumptions.assumeTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -55,11 +54,13 @@ import java.util.Set; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReceiver; import org.apache.maven.surefire.api.report.ReportEntry; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.api.testset.TestListResolver; import org.apache.maven.surefire.api.testset.TestRequest; @@ -95,7 +96,7 @@ public void shouldFailClassOnBeforeAll() { Launcher launcher = LauncherFactory.create(); JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor testCaptor = ArgumentCaptor.forClass( ReportEntry.class ); ArgumentCaptor testSetCaptor = ArgumentCaptor.forClass( TestSetReportEntry.class ); @@ -142,7 +143,7 @@ public void shouldErrorClassOnBeforeAll() { Launcher launcher = LauncherFactory.create(); JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock(), launcher ); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor testCaptor = ArgumentCaptor.forClass( ReportEntry.class ); ArgumentCaptor testSetCaptor = ArgumentCaptor.forClass( TestSetReportEntry.class ); @@ -426,7 +427,7 @@ public void runDisplayNameTest() throws Exception ProviderParameters parameters = providerParametersMock(); JUnitPlatformProvider provider = new JUnitPlatformProvider( parameters, launcher ); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); RunListenerAdapter adapter = new RunListenerAdapter( listener ); @@ -456,7 +457,7 @@ public void detectErroredParameterized() TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); RunListenerAdapter adapter = new RunListenerAdapter( listener ); @@ -494,7 +495,7 @@ public void detectFailedParameterized() TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); RunListenerAdapter adapter = new RunListenerAdapter( listener ); @@ -537,7 +538,7 @@ public void rerunParameterized() TestPlanSummaryListener executionListener = new TestPlanSummaryListener(); - RunListener listener = mock( RunListener.class ); + TestReportListener listener = mock( TestReportListener.class ); ArgumentCaptor entryCaptor = ArgumentCaptor.forClass( ReportEntry.class ); RunListenerAdapter adapter = new RunListenerAdapter( listener ); @@ -597,7 +598,7 @@ public void rerunParameterized() public void allDiscoveredTestsAreInvokedForNullArgument() throws Exception { - RunListener runListener = runListenerMock(); + TestReportListener runListener = runListenerMock(); ProviderParameters providerParameters = providerParametersMock( runListener, TestClass1.class, TestClass2.class ); Launcher launcher = LauncherFactory.create(); @@ -661,19 +662,18 @@ public void outputIsCaptured() throws Exception { Launcher launcher = LauncherFactory.create(); - RunListener runListener = runListenerMock(); + TestReportListener runListener = runListenerMock(); JUnitPlatformProvider provider = new JUnitPlatformProvider( providerParametersMock( runListener ), launcher ); invokeProvider( provider, VerboseTestClass.class ); - ArgumentCaptor captor = ArgumentCaptor.forClass( String.class ); - verify( (ConsoleOutputReceiver) runListener ) - .writeTestOutput( captor.capture(), eq( true ), eq( true ) ); - verify( (ConsoleOutputReceiver) runListener ) - .writeTestOutput( captor.capture(), eq( true ), eq( false ) ); - assertThat( captor.getAllValues() ) - .hasSize( 2 ) - .containsExactly( "stdout", "stderr" ); + ArgumentCaptor captor = ArgumentCaptor.forClass( TestOutputReportEntry.class ); + verify( runListener, times( 2 ) ) + .writeTestOutput( captor.capture() ); + assertThat( captor.getAllValues().get( 0 ).getLog() ) + .isEqualTo( "stdout" ); + assertThat( captor.getAllValues().get( 1 ).getLog() ) + .isEqualTo( "stderr" ); } @Test @@ -985,7 +985,7 @@ private static ProviderParameters providerParametersMock( Class... testClasse } private static ProviderParameters providerParametersMock( - RunListener runListener, Class... testClasses ) + TestReportListener runListener, Class... testClasses ) { TestListResolver testListResolver = new TestListResolver( "" ); return providerParametersMock( runListener, testListResolver, testClasses ); @@ -998,7 +998,7 @@ private static ProviderParameters providerParametersMock( } private static ProviderParameters providerParametersMock( - RunListener runListener, TestListResolver testListResolver, Class... testClasses ) + TestReportListener runListener, TestListResolver testListResolver, Class... testClasses ) { TestsToRun testsToRun = newTestsToRun( testClasses ); @@ -1009,7 +1009,7 @@ private static ProviderParameters providerParametersMock( when( runOrderCalculator.orderTestClasses( any() ) ).thenReturn( testsToRun ); ReporterFactory reporterFactory = mock( ReporterFactory.class ); - when( reporterFactory.createReporter() ).thenReturn( runListener ); + when( reporterFactory.createTestReportListener() ).thenReturn( runListener ); TestRequest testRequest = mock( TestRequest.class ); when( testRequest.getTestListResolver() ).thenReturn( testListResolver ); @@ -1023,9 +1023,9 @@ private static ProviderParameters providerParametersMock( return providerParameters; } - private static RunListener runListenerMock() + private static TestReportListener runListenerMock() { - return mock( RunListener.class, withSettings().extraInterfaces( ConsoleOutputReceiver.class ) ); + return mock( TestReportListener.class, withSettings().extraInterfaces( TestOutputReceiver.class ) ); } private static Set failedTestDisplayNames( TestExecutionSummary summary ) @@ -1191,7 +1191,7 @@ public void usesClassNamesForXmlReport() TestsToRun testsToRun = newTestsToRun( Sub1Tests.class, Sub2Tests.class ); invokeProvider( jUnitPlatformProvider, testsToRun ); - RunListener reporter = providerParameters.getReporterFactory().createReporter(); + RunListener reporter = providerParameters.getReporterFactory().createTestReportListener(); ArgumentCaptor reportEntryArgumentCaptor = ArgumentCaptor.forClass( ReportEntry.class ); diff --git a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java index d13176d74b..6ca778f2eb 100644 --- a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java +++ b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java @@ -45,9 +45,9 @@ import java.util.Map; import java.util.Optional; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.report.PojoStackTraceWriter; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; import org.apache.maven.surefire.api.report.StackTraceWriter; import org.junit.Before; @@ -79,14 +79,14 @@ public class RunListenerAdapterTest { private static final ConfigurationParameters CONFIG_PARAMS = mock( ConfigurationParameters.class ); - private RunListener listener; + private TestReportListener listener; private RunListenerAdapter adapter; @Before public void setUp() { - listener = mock( RunListener.class ); + listener = mock( TestReportListener.class ); adapter = new RunListenerAdapter( listener ); adapter.testPlanExecutionStarted( TestPlan.from( emptyList() ) ); } 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 3c9825d694..6a049fc484 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 @@ -19,11 +19,11 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.common.junit3.JUnit3Reflector; import org.apache.maven.surefire.common.junit3.JUnit3TestChecker; import org.apache.maven.surefire.api.provider.AbstractProvider; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; @@ -95,8 +95,8 @@ else if ( forkTestSet instanceof Class ) RunResult runResult; try { - RunListener reporter = reporterFactory.createReporter(); - startCapture( (ConsoleOutputReceiver) reporter ); + TestReportListener reporter = reporterFactory.createTestReportListener(); + startCapture( reporter ); Map systemProperties = systemProps(); setSystemManager( System.getProperty( "surefire.security.manager" ) ); 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 3f4b095b76..44cc0a1230 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 @@ -22,13 +22,13 @@ import org.apache.maven.surefire.api.booter.Command; import org.apache.maven.surefire.api.provider.CommandChainReader; import org.apache.maven.surefire.api.provider.CommandListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.common.junit4.JUnit4RunListener; import org.apache.maven.surefire.common.junit4.JUnit4TestChecker; import org.apache.maven.surefire.common.junit4.JUnitTestFailureListener; import org.apache.maven.surefire.common.junit4.Notifier; import org.apache.maven.surefire.api.provider.AbstractProvider; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; import org.apache.maven.surefire.report.PojoStackTraceWriter; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.report.RunListener; @@ -121,9 +121,10 @@ public RunResult invoke( Object forkTestSet ) RunResult runResult; try { - RunListener reporter = reporterFactory.createReporter(); + TestReportListener reporter = reporterFactory.createTestReportListener(); + JUnit4RunListener listener = new JUnit4RunListener( reporter ); - startCapture( (ConsoleOutputReceiver) reporter ); + startCapture( listener ); // startCapture() called in prior to setTestsToRun() if ( testsToRun == null ) @@ -131,7 +132,7 @@ public RunResult invoke( Object forkTestSet ) setTestsToRun( forkTestSet ); } - Notifier notifier = new Notifier( new JUnit4RunListener( reporter ), getSkipAfterFailureCount() ); + Notifier notifier = new Notifier( listener, getSkipAfterFailureCount() ); Result result = new Result(); notifier.addListeners( createCustomListeners( customRunListeners ) ) .addListener( result.createListener() ); diff --git a/surefire-providers/surefire-junit47/pom.xml b/surefire-providers/surefire-junit47/pom.xml index ddac05f92a..6e9a2bf15a 100644 --- a/surefire-providers/surefire-junit47/pom.xml +++ b/surefire-providers/surefire-junit47/pom.xml @@ -40,6 +40,7 @@ junit junit + 4.8.2 provided @@ -54,6 +55,11 @@ 1.0-1 test + + org.mockito + mockito-core + test + @@ -73,100 +79,6 @@ jacoco.agent - - maven-dependency-plugin - - - main - process-sources - - unpack - - - - - junit - junit - 4.7 - jar - true - ${project.build.directory}/endorsed-tmp - - - - - - main-junit47-patch - process-sources - - unpack - - - - - junit - junit - 4.12 - jar - true - ${project.build.directory}/endorsed-tmp - org/junit/runner/notification/RunListener* - - - - - - test - process-test-sources - - copy - - - ${project.build.directory}/endorsed-test - false - - - junit - junit - 4.12 - jar - - - - - - - - maven-assembly-plugin - - - patch-junit47 - process-sources - - single - - - false - junit-4.7 - ${project.build.directory}/endorsed - - src/assembly/assembly.xml - - - - - - - maven-compiler-plugin - - - ${project.build.directory}/endorsed - - - ${project.build.directory}/endorsed-test - - - maven-surefire-plugin diff --git a/surefire-providers/surefire-junit47/src/assembly/assembly.xml b/surefire-providers/surefire-junit47/src/assembly/assembly.xml deleted file mode 100644 index 7556763bc0..0000000000 --- a/surefire-providers/surefire-junit47/src/assembly/assembly.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - with-threadsafe-listener - - jar - - target/endorsed-tmp - false - - - true - ${project.build.directory}/endorsed-tmp - / - - - diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassesParallelRunListener.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassesParallelRunListener.java index 73a8682728..09c0f20f63 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassesParallelRunListener.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ClassesParallelRunListener.java @@ -19,25 +19,19 @@ * under the License. */ -import java.util.Map; - -import org.apache.maven.surefire.api.report.ConsoleStream; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.testset.TestSetFailedException; -import org.junit.runner.notification.RunListener.ThreadSafe; + +import java.util.Map; /** * @author Kristian Rosenvold */ -@ThreadSafe -public class ClassesParallelRunListener +final class ClassesParallelRunListener extends ConcurrentRunListener { - public ClassesParallelRunListener( Map classMethodCounts, ReporterFactory reporterFactory, - ConsoleStream consoleStream ) - throws TestSetFailedException + ClassesParallelRunListener( Map classMethodCounts, ReporterFactory reporterFactory ) { - super( reporterFactory, consoleStream, false, classMethodCounts ); + super( reporterFactory, false, classMethodCounts ); } @Override diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentRunListener.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentRunListener.java index ce8ad88171..8d71559dbc 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentRunListener.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/ConcurrentRunListener.java @@ -20,15 +20,15 @@ */ import java.util.Map; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; -import org.apache.maven.surefire.api.report.ConsoleStream; + +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.report.ReportEntry; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.StackTraceWriter; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; -import org.apache.maven.surefire.api.testset.TestSetFailedException; import static org.apache.maven.surefire.junitcore.TestMethod.getThreadTestMethod; @@ -43,45 +43,37 @@ * @see org.apache.maven.surefire.junitcore.JUnitCoreRunListener for details about regular junit run listening * @author Kristian Rosenvold */ -public abstract class ConcurrentRunListener - implements RunListener, ConsoleOutputReceiver +abstract class ConcurrentRunListener + implements TestReportListener { private final Map classMethodCounts; - private final ThreadLocal reporterManagerThreadLocal; + private final ThreadLocal reporterManagerThreadLocal; private final boolean reportImmediately; - private final ConsoleStream consoleStream; + private final ConsoleLogger logger; - ConcurrentRunListener( final ReporterFactory reporterFactory, ConsoleStream consoleStream, - boolean reportImmediately, Map classMethodCounts ) - throws TestSetFailedException + ConcurrentRunListener( final ReporterFactory reporterFactory, boolean reportImmediately, + Map classMethodCounts ) { this.reportImmediately = reportImmediately; this.classMethodCounts = classMethodCounts; - this.consoleStream = consoleStream; - reporterManagerThreadLocal = new ThreadLocal() - { - @Override - protected RunListener initialValue() - { - return reporterFactory.createReporter(); - } - }; + logger = reporterFactory.createTestReportListener(); + reporterManagerThreadLocal = ThreadLocal.withInitial( reporterFactory::createTestReportListener ); } @Override - public void testSetStarting( TestSetReportEntry description ) + public final void testSetStarting( TestSetReportEntry description ) { } @Override - public void testSetCompleted( TestSetReportEntry result ) + public final void testSetCompleted( TestSetReportEntry result ) { try { - final RunListener reporterManager = getRunListener(); + final TestReportListener reporterManager = getRunListener(); for ( TestSet testSet : classMethodCounts.values() ) { testSet.replay( reporterManager ); @@ -94,7 +86,7 @@ public void testSetCompleted( TestSetReportEntry result ) } @Override - public void testFailed( ReportEntry failure ) + public final void testFailed( ReportEntry failure ) { final TestMethod testMethod = getOrCreateThreadAttachedTestMethod( failure ); if ( testMethod != null ) @@ -105,7 +97,7 @@ public void testFailed( ReportEntry failure ) } @Override - public void testError( ReportEntry failure ) + public final void testError( ReportEntry failure ) { final TestMethod testMethod = getOrCreateThreadAttachedTestMethod( failure ); if ( testMethod != null ) @@ -116,7 +108,7 @@ public void testError( ReportEntry failure ) } @Override - public void testSkipped( ReportEntry description ) + public final void testSkipped( ReportEntry description ) { TestSet testSet = getTestSet( description ); TestMethod testMethod = testSet.createThreadAttachedTestMethod( description ); @@ -126,19 +118,19 @@ public void testSkipped( ReportEntry description ) } @Override - public void testExecutionSkippedByUser() + public final void testExecutionSkippedByUser() { // cannot guarantee proper call to all listeners getRunListener().testExecutionSkippedByUser(); } - public RunMode markAs( RunMode currentRunMode ) + public final RunMode markAs( RunMode currentRunMode ) { return reporterManagerThreadLocal.get().markAs( currentRunMode ); } @Override - public void testAssumptionFailure( ReportEntry failure ) + public final void testAssumptionFailure( ReportEntry failure ) { final TestMethod testMethod = getOrCreateThreadAttachedTestMethod( failure ); if ( testMethod != null ) @@ -149,7 +141,7 @@ public void testAssumptionFailure( ReportEntry failure ) } @Override - public void testStarting( ReportEntry description ) + public final void testStarting( ReportEntry description ) { TestSet testSet = getTestSet( description ); testSet.createThreadAttachedTestMethod( description ); @@ -159,7 +151,7 @@ public void testStarting( ReportEntry description ) } @Override - public void testSucceeded( ReportEntry report ) + public final void testSucceeded( ReportEntry report ) { TestMethod testMethod = getThreadTestMethod(); if ( testMethod != null ) @@ -180,11 +172,11 @@ private TestMethod getOrCreateThreadAttachedTestMethod( ReportEntry description TestSet testSet = getTestSet( description ); if ( testSet == null ) { - consoleStream.println( description.getName() ); + logger.warning( description.getName() ); StackTraceWriter writer = description.getStackTraceWriter(); if ( writer != null ) { - consoleStream.println( writer.writeTraceToString() ); + logger.error( writer.writeTraceToString() ); } return null; } @@ -201,36 +193,94 @@ private TestSet getTestSet( ReportEntry description ) return classMethodCounts.get( description.getSourceName() ); } - RunListener getRunListener() + final TestReportListener getRunListener() { return reporterManagerThreadLocal.get(); } - public static ConcurrentRunListener createInstance( Map classMethodCounts, - ReporterFactory reporterFactory, - boolean parallelClasses, boolean parallelBoth, - ConsoleStream consoleStream ) - throws TestSetFailedException + public static TestReportListener createInstance( Map classMethodCounts, + ReporterFactory reporterFactory, + boolean parallelClasses, boolean parallelBoth ) { return parallelClasses - ? new ClassesParallelRunListener( classMethodCounts, reporterFactory, consoleStream ) - : new MethodsParallelRunListener( classMethodCounts, reporterFactory, !parallelBoth, consoleStream ); + ? new ClassesParallelRunListener( classMethodCounts, reporterFactory ) + : new MethodsParallelRunListener( classMethodCounts, reporterFactory, !parallelBoth ); } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public final void writeTestOutput( TestOutputReportEntry reportEntry ) { TestMethod threadTestMethod = getThreadTestMethod(); if ( threadTestMethod != null ) { LogicalStream logicalStream = threadTestMethod.getLogicalStream(); - logicalStream.write( stdout, output, newLine ); + logicalStream.write( reportEntry ); } else { // Not able to associate output with any thread. Just dump to console - consoleStream.println( output ); + logger.info( reportEntry.getLog() ); } } + + @Override + public final boolean isDebugEnabled() + { + return logger.isDebugEnabled(); + } + + @Override + public final void debug( String message ) + { + logger.debug( message ); + } + + @Override + public final boolean isInfoEnabled() + { + return logger.isInfoEnabled(); + } + + @Override + public final void info( String message ) + { + logger.info( message ); + } + + @Override + public final boolean isWarnEnabled() + { + return logger.isWarnEnabled(); + } + + @Override + public final void warning( String message ) + { + logger.warning( message ); + } + + @Override + public final boolean isErrorEnabled() + { + return logger.isErrorEnabled(); + } + + @Override + public final void error( String message ) + { + logger.error( message ); + } + + @Override + public final void error( String message, Throwable t ) + { + logger.error( message, t ); + } + + @Override + public final void error( Throwable t ) + { + logger.error( t ); + } } 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 6877b00b28..d01620cd9d 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,9 +19,11 @@ * under the License. */ +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.booter.Command; import org.apache.maven.surefire.api.provider.CommandChainReader; import org.apache.maven.surefire.api.provider.CommandListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.common.junit4.JUnit4RunListener; import org.apache.maven.surefire.common.junit4.JUnitTestFailureListener; import org.apache.maven.surefire.common.junit4.Notifier; @@ -30,7 +32,6 @@ import org.apache.maven.surefire.common.junit48.JUnit48TestChecker; import org.apache.maven.surefire.api.provider.AbstractProvider; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleStream; import org.apache.maven.surefire.api.report.ReporterFactory; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.testset.TestListResolver; @@ -117,12 +118,10 @@ private boolean isSingleThreaded() public RunResult invoke( Object forkTestSet ) throws TestSetFailedException { - final ReporterFactory reporterFactory = providerParameters.getReporterFactory(); - - final ConsoleStream consoleStream = providerParameters.getConsoleLogger(); - - Notifier notifier = - new Notifier( createRunListener( reporterFactory, consoleStream ), getSkipAfterFailureCount() ); + ReporterFactory reporterFactory = providerParameters.getReporterFactory(); + JUnit4RunListener listener = createRunListener( reporterFactory ); + ConsoleLogger logger = listener.getConsoleLogger(); + Notifier notifier = new Notifier( listener, getSkipAfterFailureCount() ); // startCapture() called in createRunListener() in prior to setTestsToRun() Filter filter = jUnit48Reflector.isJUnit48Available() ? createJUnit48Filter() : null; @@ -145,7 +144,7 @@ public RunResult invoke( Object forkTestSet ) try { - JUnitCoreWrapper core = new JUnitCoreWrapper( notifier, jUnitCoreParameters, consoleStream ); + JUnitCoreWrapper core = new JUnitCoreWrapper( notifier, jUnitCoreParameters, logger ); if ( commandsReader != null ) { @@ -162,7 +161,7 @@ public RunResult invoke( Object forkTestSet ) { Notifier rerunNotifier = pureNotifier(); notifier.copyListenersTo( rerunNotifier ); - JUnitCoreWrapper rerunCore = new JUnitCoreWrapper( rerunNotifier, jUnitCoreParameters, consoleStream ); + JUnitCoreWrapper rerunCore = new JUnitCoreWrapper( rerunNotifier, jUnitCoreParameters, logger ); for ( int i = 0; i < rerunFailingTestsCount && !testFailureListener.getAllFailures().isEmpty(); i++ ) { Set failures = generateFailingTestDescriptions( testFailureListener.getAllFailures() ); @@ -238,23 +237,21 @@ public void update( Command command ) } ); } - private JUnit4RunListener createRunListener( ReporterFactory reporterFactory, ConsoleStream consoleStream ) - throws TestSetFailedException + private JUnit4RunListener createRunListener( ReporterFactory reporterFactory ) { if ( isSingleThreaded() ) { - NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createReporter() ); + NonConcurrentRunListener rm = new NonConcurrentRunListener( reporterFactory.createTestReportListener() ); startCapture( rm ); return rm; } else { - final Map testSetMap = new ConcurrentHashMap<>(); - - ConcurrentRunListener listener = createInstance( testSetMap, reporterFactory, isParallelTypes(), - isParallelMethodsAndTypes(), consoleStream ); + Map testSetMap = new ConcurrentHashMap<>(); + boolean parallelClasses = isParallelTypes(); + boolean parallelBoth = isParallelMethodsAndTypes(); + TestReportListener listener = createInstance( testSetMap, reporterFactory, parallelClasses, parallelBoth ); startCapture( listener ); - return new JUnitCoreRunListener( listener, testSetMap ); } } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreRunListener.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreRunListener.java index 37f375983a..93f4bc079c 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreRunListener.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreRunListener.java @@ -19,9 +19,9 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.common.junit4.JUnit4RunListener; import org.apache.maven.surefire.common.junit4.JUnit4StackTraceWriter; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.StackTraceWriter; import org.junit.runner.Description; import org.junit.runner.Result; @@ -40,7 +40,7 @@ * * @see org.apache.maven.surefire.junitcore.ConcurrentRunListener for details about parallel running */ -public class JUnitCoreRunListener +final class JUnitCoreRunListener extends JUnit4RunListener { private final Map classMethodCounts; @@ -49,7 +49,7 @@ public class JUnitCoreRunListener * @param reporter the report manager to log testing events to * @param classMethodCounts A map of methods */ - public JUnitCoreRunListener( RunListener reporter, Map classMethodCounts ) + JUnitCoreRunListener( TestReportListener reporter, Map classMethodCounts ) { super( reporter ); this.classMethodCounts = classMethodCounts; diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java index 60ba4708bb..3ae0b48e1f 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/JUnitCoreWrapper.java @@ -19,12 +19,12 @@ * under the License. */ +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; +import org.apache.maven.surefire.api.testset.TestSetFailedException; +import org.apache.maven.surefire.api.util.TestsToRun; import org.apache.maven.surefire.common.junit4.Notifier; import org.apache.maven.surefire.junitcore.pc.ParallelComputer; import org.apache.maven.surefire.junitcore.pc.ParallelComputerBuilder; -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.testset.TestSetFailedException; -import org.apache.maven.surefire.api.util.TestsToRun; import org.junit.Ignore; import org.junit.runner.Computer; import org.junit.runner.Description; @@ -54,9 +54,9 @@ final class JUnitCoreWrapper { private final Notifier notifier; private final JUnitCoreParameters jUnitCoreParameters; - private final ConsoleStream consoleStream; + private final ConsoleLogger consoleStream; - JUnitCoreWrapper( Notifier notifier, JUnitCoreParameters jUnitCoreParameters, ConsoleStream consoleStream ) + JUnitCoreWrapper( Notifier notifier, JUnitCoreParameters jUnitCoreParameters, ConsoleLogger consoleStream ) { this.notifier = notifier; this.jUnitCoreParameters = jUnitCoreParameters; diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java index cf70d1746d..137812ec97 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/LogicalStream.java @@ -19,7 +19,8 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -29,32 +30,18 @@ */ final class LogicalStream { - private final Queue output = new ConcurrentLinkedQueue<>(); + private final Queue output = new ConcurrentLinkedQueue<>(); - private static final class Entry + synchronized void write( TestOutputReportEntry reportEntry ) { - private final boolean stdout; - private final String text; - private final boolean newLine; - - Entry( boolean stdout, String text, boolean newLine ) - { - this.stdout = stdout; - this.text = text; - this.newLine = newLine; - } - } - - synchronized void write( boolean stdout, String text, boolean newLine ) - { - output.add( new Entry( stdout, text, newLine ) ); + output.add( reportEntry ); } - void writeDetails( ConsoleOutputReceiver outputReceiver ) + void writeDetails( TestOutputReceiver outputReceiver ) { - for ( Entry entry = output.poll(); entry != null; entry = output.poll() ) + for ( TestOutputReportEntry entry = output.poll(); entry != null; entry = output.poll() ) { - outputReceiver.writeTestOutput( entry.text, entry.newLine, entry.stdout ); + outputReceiver.writeTestOutput( entry ); } } } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/MethodsParallelRunListener.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/MethodsParallelRunListener.java index 4ca3603b3e..d60e0efc65 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/MethodsParallelRunListener.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/MethodsParallelRunListener.java @@ -19,29 +19,24 @@ * under the License. */ -import java.util.Map; - -import org.apache.maven.surefire.api.report.ConsoleStream; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.testset.TestSetFailedException; -import org.junit.runner.notification.RunListener.ThreadSafe; + +import java.util.Map; /** * @author Kristian Rosenvold */ -@ThreadSafe -public class MethodsParallelRunListener +final class MethodsParallelRunListener extends ConcurrentRunListener { private volatile TestSet lastStarted; private final Object lock = new Object(); - public MethodsParallelRunListener( Map classMethodCounts, ReporterFactory reporterFactory, - boolean reportImmediately, ConsoleStream consoleStream ) - throws TestSetFailedException + MethodsParallelRunListener( Map classMethodCounts, ReporterFactory reporterFactory, + boolean reportImmediately ) { - super( reporterFactory, consoleStream, reportImmediately, classMethodCounts ); + super( reporterFactory, reportImmediately, classMethodCounts ); } @Override diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/NonConcurrentRunListener.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/NonConcurrentRunListener.java index 262a4ee925..1248a33f91 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/NonConcurrentRunListener.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/NonConcurrentRunListener.java @@ -19,13 +19,12 @@ * under the License. */ +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.util.internal.ClassMethod; import org.apache.maven.surefire.common.junit4.JUnit4RunListener; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; import org.apache.maven.surefire.api.report.TestSetReportEntry; -import org.apache.maven.surefire.api.testset.TestSetFailedException; import org.junit.runner.Description; import org.junit.runner.Result; import org.junit.runner.notification.Failure; @@ -41,24 +40,22 @@ * limitation a la Junit4 provider. Specifically, we can redirect properly the output even if we don't have class * demarcation in JUnit. It works when if there is a JVM instance per test run, i.e. with forkMode=always or perthread. */ -public class NonConcurrentRunListener +class NonConcurrentRunListener extends JUnit4RunListener - implements ConsoleOutputReceiver { private Description currentTestSetDescription; private Description lastFinishedDescription; - public NonConcurrentRunListener( RunListener reporter ) - throws TestSetFailedException + NonConcurrentRunListener( TestReportListener reporter ) { super( reporter ); } - public synchronized void writeTestOutput( String output, boolean newLine, boolean stdout ) + public synchronized void writeTestOutput( TestOutputReportEntry reportEntry ) { // We can write immediately: no parallelism and a single class. - ( (ConsoleOutputReceiver) reporter ).writeTestOutput( output, newLine, stdout ); + reporter.writeTestOutput( new TestOutputReportEntry( reportEntry, /*todo*/ null, 0L ) ); } @Override diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java index ae38976ba2..42faa39cb6 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestMethod.java @@ -20,10 +20,11 @@ */ import org.apache.maven.surefire.api.report.CategorizedReportEntry; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; +import org.apache.maven.surefire.api.report.TestOutputReceiver; import org.apache.maven.surefire.api.report.ConsoleOutputReceiverForCurrentThread; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import java.util.concurrent.atomic.AtomicReference; @@ -34,7 +35,7 @@ * without any actual parallel access */ class TestMethod - implements ConsoleOutputReceiver + implements TestOutputReceiver { private static final InheritableThreadLocal TEST_METHOD = new InheritableThreadLocal<>(); @@ -112,7 +113,7 @@ long getEndTime() return endTime; } - void replay( RunListener reporter ) + void replay( TestReportListener reporter ) { if ( testIgnored != null ) { @@ -125,7 +126,7 @@ void replay( RunListener reporter ) LogicalStream ls = output.get(); if ( ls != null ) { - ls.writeDetails( (ConsoleOutputReceiver) reporter ); + ls.writeDetails( reporter ); } if ( testFailure != null ) @@ -185,9 +186,9 @@ LogicalStream getLogicalStream() } @Override - public void writeTestOutput( String output, boolean newLine, boolean stdout ) + public void writeTestOutput( TestOutputReportEntry reportEntry ) { - getLogicalStream().write( stdout, output, newLine ); + getLogicalStream().write( reportEntry ); } TestSet getTestSet() diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java index 694257e1b4..d295bb7a5a 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/TestSet.java @@ -20,8 +20,8 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; import org.apache.maven.surefire.api.report.SimpleReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; import java.util.Collection; @@ -60,7 +60,7 @@ public TestSet( String testClassName ) this.testClassName = testClassName; } - public void replay( RunListener target ) + public void replay( TestReportListener target ) { if ( played.compareAndSet( false, true ) ) { @@ -133,7 +133,7 @@ private void addTestMethod( TestMethod testMethod ) testMethods.add( testMethod ); } - public void incrementFinishedTests( RunListener reporterManager, boolean reportImmediately ) + public void incrementFinishedTests( TestReportListener reporterManager, boolean reportImmediately ) { numberOfCompletedChildren.incrementAndGet(); if ( allScheduled && isAllTestsDone() && reportImmediately ) @@ -142,7 +142,7 @@ public void incrementFinishedTests( RunListener reporterManager, boolean reportI } } - public void setAllScheduled( RunListener reporterManager ) + public void setAllScheduled( TestReportListener reporterManager ) { allScheduled = true; if ( isAllTestsDone() ) diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/AbstractThreadPoolStrategy.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/AbstractThreadPoolStrategy.java index bad29896fc..b226141860 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/AbstractThreadPoolStrategy.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/AbstractThreadPoolStrategy.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import java.util.Collection; import java.util.concurrent.ExecutorService; @@ -47,12 +47,12 @@ abstract class AbstractThreadPoolStrategy private volatile boolean isDestroyed; - AbstractThreadPoolStrategy( ConsoleStream logger, ExecutorService threadPool ) + AbstractThreadPoolStrategy( ConsoleLogger logger, ExecutorService threadPool ) { this( logger, threadPool, null ); } - AbstractThreadPoolStrategy( ConsoleStream logger, ExecutorService threadPool, Collection> futureResults ) + AbstractThreadPoolStrategy( ConsoleLogger logger, ExecutorService threadPool, Collection> futureResults ) { super( logger ); this.threadPool = threadPool; diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/InvokerStrategy.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/InvokerStrategy.java index f4faadca66..55091dfe46 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/InvokerStrategy.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/InvokerStrategy.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @@ -37,7 +37,7 @@ final class InvokerStrategy private final Queue activeThreads = new ConcurrentLinkedQueue<>(); - protected InvokerStrategy( ConsoleStream logger ) + protected InvokerStrategy( ConsoleLogger logger ) { super( logger ); } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/NonSharedThreadPoolStrategy.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/NonSharedThreadPoolStrategy.java index 92a300dff8..eee8df5cba 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/NonSharedThreadPoolStrategy.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/NonSharedThreadPoolStrategy.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import java.util.concurrent.ExecutorService; import java.util.concurrent.TimeUnit; @@ -34,7 +34,7 @@ final class NonSharedThreadPoolStrategy extends AbstractThreadPoolStrategy { - NonSharedThreadPoolStrategy( ConsoleStream logger, ExecutorService threadPool ) + NonSharedThreadPoolStrategy( ConsoleLogger logger, ExecutorService threadPool ) { super( logger, threadPool ); } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java index b17a9d7964..f9d178abef 100755 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilder.java @@ -34,8 +34,8 @@ import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.junitcore.JUnitCoreParameters; -import org.apache.maven.surefire.api.report.ConsoleStream; import org.apache.maven.surefire.api.testset.TestSetFailedException; import org.apache.maven.surefire.api.util.internal.DaemonThreadFactory; import org.junit.internal.runners.ErrorReportingRunner; @@ -93,7 +93,7 @@ public final class ParallelComputerBuilder private final Map parallelGroups = new EnumMap<>( Type.class ); - private final ConsoleStream logger; + private final ConsoleLogger logger; private boolean useSeparatePools; @@ -110,7 +110,7 @@ public final class ParallelComputerBuilder * Can be used only in unit tests. * Do NOT call this constructor in production. */ - ParallelComputerBuilder( ConsoleStream logger ) + ParallelComputerBuilder( ConsoleLogger logger ) { this.logger = logger; runningInTests = true; @@ -120,7 +120,7 @@ public final class ParallelComputerBuilder parallelGroups.put( METHODS, 0 ); } - public ParallelComputerBuilder( ConsoleStream logger, JUnitCoreParameters parameters ) + public ParallelComputerBuilder( ConsoleLogger logger, JUnitCoreParameters parameters ) { this( logger ); runningInTests = false; 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 bb2d4ac283..61222a29fa 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 @@ -19,12 +19,10 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.junit.runner.Description; import org.junit.runners.model.RunnerScheduler; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; import java.util.Collection; import java.util.Set; import java.util.concurrent.ConcurrentLinkedQueue; @@ -56,7 +54,7 @@ public class Scheduler private final Description description; - private final ConsoleStream logger; + private final ConsoleLogger logger; private volatile boolean shutdown = false; @@ -76,7 +74,7 @@ public class Scheduler * @param description JUnit description of class * @param strategy scheduling strategy */ - public Scheduler( ConsoleStream logger, Description description, SchedulingStrategy strategy ) + public Scheduler( ConsoleLogger logger, Description description, SchedulingStrategy strategy ) { this( logger, description, strategy, -1 ); } @@ -85,8 +83,8 @@ public Scheduler( ConsoleStream logger, Description description, SchedulingStrat * Should be used if schedulers in parallel children and parent use one instance of bounded thread pool. *
* Set this scheduler in a e.g. one suite of classes, then every individual class runner should reference - * {@link #Scheduler(ConsoleStream, org.junit.runner.Description, Scheduler, SchedulingStrategy)} - * or {@link #Scheduler(ConsoleStream, org.junit.runner.Description, Scheduler, SchedulingStrategy, int)}. + * {@link #Scheduler(ConsoleLogger, org.junit.runner.Description, Scheduler, SchedulingStrategy)} + * or {@link #Scheduler(ConsoleLogger, org.junit.runner.Description, Scheduler, SchedulingStrategy, int)}. * * @param logger current logger implementation * @param description description of current runner @@ -94,7 +92,7 @@ public Scheduler( ConsoleStream logger, Description description, SchedulingStrat * @param concurrency determines maximum concurrent children scheduled a time via {@link #schedule(Runnable)} * @throws NullPointerException if null strategy */ - public Scheduler( ConsoleStream logger, Description description, SchedulingStrategy strategy, int concurrency ) + public Scheduler( ConsoleLogger logger, Description description, SchedulingStrategy strategy, int concurrency ) { this( logger, description, strategy, BalancerFactory.createBalancer( concurrency ) ); } @@ -103,7 +101,7 @@ public Scheduler( ConsoleStream logger, Description description, SchedulingStrat * New instances should be used by schedulers with limited concurrency by balancer * against other groups of schedulers. The schedulers share one pool. *
- * Unlike in {@link #Scheduler(ConsoleStream, org.junit.runner.Description, SchedulingStrategy, int)} which was + * Unlike in {@link #Scheduler(ConsoleLogger, org.junit.runner.Description, SchedulingStrategy, int)} which was * limiting the concurrency of children of a runner where this scheduler was set, {@code this} * balancer is limiting the concurrency of all children in runners having schedulers created by this * constructor. @@ -114,7 +112,7 @@ public Scheduler( ConsoleStream logger, Description description, SchedulingStrat * @param balancer determines maximum concurrent children scheduled a time via {@link #schedule(Runnable)} * @throws NullPointerException if null strategy or balancer */ - public Scheduler( ConsoleStream logger, Description description, SchedulingStrategy strategy, Balancer balancer ) + public Scheduler( ConsoleLogger logger, Description description, SchedulingStrategy strategy, Balancer balancer ) { strategy.setDefaultShutdownHandler( newShutdownHandler() ); this.logger = logger; @@ -135,7 +133,7 @@ public Scheduler( ConsoleStream logger, Description description, SchedulingStrat * @param balancer determines maximum concurrent children scheduled a time via {@link #schedule(Runnable)} * @throws NullPointerException if null masterScheduler, strategy or balancer */ - public Scheduler( ConsoleStream logger, Description description, Scheduler masterScheduler, + public Scheduler( ConsoleLogger logger, Description description, Scheduler masterScheduler, SchedulingStrategy strategy, Balancer balancer ) { this( logger, description, strategy, balancer ); @@ -147,15 +145,15 @@ public Scheduler( ConsoleStream logger, Description description, Scheduler maste * @param logger console logger * @param description JUnit description of class * @param masterScheduler a reference to - * {@link #Scheduler(ConsoleStream, org.junit.runner.Description, SchedulingStrategy, int)} - * or {@link #Scheduler(ConsoleStream, org.junit.runner.Description, SchedulingStrategy)} + * {@link #Scheduler(ConsoleLogger, org.junit.runner.Description, SchedulingStrategy, int)} + * or {@link #Scheduler(ConsoleLogger, org.junit.runner.Description, SchedulingStrategy)} * @param strategy scheduling strategy * @param concurrency determines maximum concurrent children scheduled a time via {@link #schedule(Runnable)} * - * @see #Scheduler(ConsoleStream, org.junit.runner.Description, SchedulingStrategy) - * @see #Scheduler(ConsoleStream, org.junit.runner.Description, SchedulingStrategy, int) + * @see #Scheduler(ConsoleLogger, org.junit.runner.Description, SchedulingStrategy) + * @see #Scheduler(ConsoleLogger, org.junit.runner.Description, SchedulingStrategy, int) */ - public Scheduler( ConsoleStream logger, Description description, Scheduler masterScheduler, + public Scheduler( ConsoleLogger logger, Description description, Scheduler masterScheduler, SchedulingStrategy strategy, int concurrency ) { this( logger, description, strategy, concurrency ); @@ -174,7 +172,7 @@ public Scheduler( ConsoleStream logger, Description description, Scheduler maste * @param masterScheduler parent scheduler * @param strategy scheduling strategy */ - public Scheduler( ConsoleStream logger, Description description, Scheduler masterScheduler, + public Scheduler( ConsoleLogger logger, Description description, Scheduler masterScheduler, SchedulingStrategy strategy ) { this( logger, description, masterScheduler, strategy, 0 ); @@ -219,17 +217,12 @@ private boolean canSchedule() protected void logQuietly( Throwable t ) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try ( PrintStream stream = new PrintStream( out ) ) - { - t.printStackTrace( stream ); - } - logger.println( out.toString() ); + logger.error( t ); } protected void logQuietly( String msg ) { - logger.println( msg ); + logger.warning( msg ); } /** diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java index 37c0e15d23..b021d9e7b9 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategies.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.util.internal.DaemonThreadFactory; import java.util.concurrent.ExecutorService; @@ -40,7 +40,7 @@ public class SchedulingStrategies * @param logger current error logger * @return sequentially executing strategy */ - public static SchedulingStrategy createInvokerStrategy( ConsoleStream logger ) + public static SchedulingStrategy createInvokerStrategy( ConsoleLogger logger ) { return new InvokerStrategy( logger ); } @@ -50,7 +50,7 @@ public static SchedulingStrategy createInvokerStrategy( ConsoleStream logger ) * @param nThreads fixed pool capacity * @return parallel scheduling strategy */ - public static SchedulingStrategy createParallelStrategy( ConsoleStream logger, int nThreads ) + public static SchedulingStrategy createParallelStrategy( ConsoleLogger logger, int nThreads ) { return new NonSharedThreadPoolStrategy( logger, Executors.newFixedThreadPool( nThreads, DAEMON_THREAD_FACTORY ) ); @@ -60,7 +60,7 @@ public static SchedulingStrategy createParallelStrategy( ConsoleStream logger, i * @param logger current error logger * @return parallel scheduling strategy with unbounded capacity */ - public static SchedulingStrategy createParallelStrategyUnbounded( ConsoleStream logger ) + public static SchedulingStrategy createParallelStrategyUnbounded( ConsoleLogger logger ) { return new NonSharedThreadPoolStrategy( logger, Executors.newCachedThreadPool( DAEMON_THREAD_FACTORY ) ); } @@ -78,7 +78,7 @@ public static SchedulingStrategy createParallelStrategyUnbounded( ConsoleStream * @return parallel strategy with shared thread pool * @throws NullPointerException if threadPool is null */ - public static SchedulingStrategy createParallelSharedStrategy( ConsoleStream logger, ExecutorService threadPool ) + public static SchedulingStrategy createParallelSharedStrategy( ConsoleLogger logger, ExecutorService threadPool ) { if ( threadPool == null ) { 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 6c81bbacd6..08e4a02cc7 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 @@ -19,10 +19,8 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; import java.util.concurrent.atomic.AtomicBoolean; /** @@ -43,9 +41,9 @@ public abstract class SchedulingStrategy private final AtomicBoolean canSchedule = new AtomicBoolean( true ); - private final ConsoleStream logger; + private final ConsoleLogger logger; - protected SchedulingStrategy( ConsoleStream logger ) + protected SchedulingStrategy( ConsoleLogger logger ) { this.logger = logger; } @@ -134,11 +132,6 @@ protected boolean canSchedule() protected void logQuietly( Throwable t ) { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - try ( PrintStream stream = new PrintStream( out ) ) - { - t.printStackTrace( stream ); - } - logger.println( out.toString() ); + logger.error( t ); } } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SharedThreadPoolStrategy.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SharedThreadPoolStrategy.java index 11f544ceba..d3af15ce56 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SharedThreadPoolStrategy.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SharedThreadPoolStrategy.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import java.util.concurrent.CancellationException; import java.util.concurrent.ConcurrentLinkedQueue; @@ -37,7 +37,7 @@ final class SharedThreadPoolStrategy extends AbstractThreadPoolStrategy { - SharedThreadPoolStrategy( ConsoleStream logger, ExecutorService threadPool ) + SharedThreadPoolStrategy( ConsoleLogger logger, ExecutorService threadPool ) { super( logger, threadPool, new ConcurrentLinkedQueue>() ); } diff --git a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java index b0ea97e767..f4c92b468a 100644 --- a/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java +++ b/surefire-providers/surefire-junit47/src/main/java/org/apache/maven/surefire/junitcore/pc/SingleThreadScheduler.java @@ -19,7 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.util.internal.DaemonThreadFactory; import org.junit.runner.Description; import org.junit.runners.model.RunnerScheduler; @@ -42,7 +42,7 @@ */ final class SingleThreadScheduler { - private final ConsoleStream logger; + private final ConsoleLogger logger; private final ExecutorService pool = newPool(); @@ -54,7 +54,7 @@ private static ExecutorService newPool() return new ThreadPoolExecutor( 1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), tf ); } - SingleThreadScheduler( ConsoleStream logger ) + SingleThreadScheduler( ConsoleLogger logger ) { this.logger = logger; SchedulingStrategy strategy = SchedulingStrategies.createParallelSharedStrategy( logger, pool ); diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/ConcurrentRunListenerTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/ConcurrentRunListenerTest.java index 8940b51a95..a3a994469c 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/ConcurrentRunListenerTest.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/ConcurrentRunListenerTest.java @@ -23,17 +23,15 @@ import java.io.PrintStream; import java.util.HashMap; import java.util.Map; -import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; -import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; -import org.apache.maven.surefire.report.RunStatistics; -import org.apache.maven.surefire.api.testset.TestSetFailedException; import junit.framework.Assert; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; +import org.apache.maven.surefire.api.report.ReporterFactory; +import org.apache.maven.surefire.api.report.TestReportListener; +import org.apache.maven.surefire.api.testset.TestSetFailedException; +import org.apache.maven.surefire.report.RunStatistics; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.Computer; @@ -148,16 +146,14 @@ private void runClasses( int success, int ignored, int failure, Class... clas { DefaultReporterFactory reporterFactory = createReporterFactory(); HashMap classMethodCounts = new HashMap<>(); - final ConsoleStream defaultConsoleReporter = new DefaultDirectConsoleReporter( System.out ); - RunListener reporter = - new ClassesParallelRunListener( classMethodCounts, reporterFactory, defaultConsoleReporter ); + TestReportListener reporter = new ClassesParallelRunListener( classMethodCounts, reporterFactory ); JUnitCoreRunListener runListener = new JUnitCoreRunListener( reporter, classMethodCounts ); RunStatistics result = runClasses( reporterFactory, runListener, classes ); assertReporter( result, success, ignored, failure, "classes" ); classMethodCounts.clear(); reporterFactory = createReporterFactory(); - reporter = new MethodsParallelRunListener( classMethodCounts, reporterFactory, true, defaultConsoleReporter ); + reporter = new MethodsParallelRunListener( classMethodCounts, reporterFactory, true ); runListener = new JUnitCoreRunListener( reporter, classMethodCounts ); result = runClasses( reporterFactory, runListener, classes ); assertReporter( result, success, ignored, failure, "methods" ); @@ -198,14 +194,11 @@ private RunStatistics runClasses( DefaultReporterFactory reporterManagerFactory, private org.junit.runner.notification.RunListener createRunListener( ReporterFactory reporterFactory, Map testSetMap ) - throws TestSetFailedException { - return new JUnitCoreRunListener( - new ClassesParallelRunListener( testSetMap, reporterFactory, - new DefaultDirectConsoleReporter( System.out ) ), testSetMap ); + TestReportListener handler = new ClassesParallelRunListener( testSetMap, reporterFactory ); + return new JUnitCoreRunListener( handler, testSetMap ); } - /** * */ 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 defc3a9ae2..f3cea120f9 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 @@ -25,10 +25,8 @@ import org.apache.maven.plugin.surefire.extensions.SurefireStatelessTestsetInfoReporter; import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger; import org.apache.maven.plugin.surefire.report.DefaultReporterFactory; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.testset.TestSetFailedException; import org.junit.runner.Computer; import org.junit.runner.JUnitCore; @@ -66,9 +64,9 @@ public Result run( boolean parallelClasses, Class... classes ) try { final HashMap classMethodCounts = new HashMap<>(); - RunListener reporter = createInstance( classMethodCounts, reporterManagerFactory, parallelClasses, false, - new DefaultDirectConsoleReporter( System.out ) ); - startCapture( (ConsoleOutputReceiver) reporter ); + TestReportListener reporter = + createInstance( classMethodCounts, reporterManagerFactory, parallelClasses, false ); + startCapture( reporter ); JUnitCoreRunListener runListener = new JUnitCoreRunListener( reporter, classMethodCounts ); JUnitCore junitCore = new JUnitCore(); diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MockReporter.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MockReporter.java index 3694f92c65..3552a46d51 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MockReporter.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/MockReporter.java @@ -23,7 +23,8 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestOutputReportEntry; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.api.report.RunMode; @@ -31,7 +32,7 @@ * Internal tests use only. */ final class MockReporter - implements RunListener + implements TestReportListener { private final List events = new ArrayList<>(); @@ -136,4 +137,70 @@ public boolean containsNotification( String event ) { return events.contains( event ); } + + @Override + public void writeTestOutput( TestOutputReportEntry reportEntry ) + { + + } + + @Override + public boolean isDebugEnabled() + { + return false; + } + + @Override + public void debug( String message ) + { + + } + + @Override + public boolean isInfoEnabled() + { + return false; + } + + @Override + public void info( String message ) + { + + } + + @Override + public boolean isWarnEnabled() + { + return false; + } + + @Override + public void warning( String message ) + { + + } + + @Override + public boolean isErrorEnabled() + { + return false; + } + + @Override + public void error( String message ) + { + + } + + @Override + public void error( String message, Throwable t ) + { + + } + + @Override + public void error( Throwable t ) + { + + } } diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java index 38690ae156..f9d5ce15dc 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/Surefire746Test.java @@ -44,18 +44,17 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.booter.BaseProviderFactory; import org.apache.maven.surefire.api.booter.ProviderParameterNames; -import org.apache.maven.surefire.common.junit4.JUnit4RunListener; -import org.apache.maven.surefire.common.junit4.Notifier; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; import org.apache.maven.surefire.api.report.ReporterConfiguration; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.api.testset.TestSetFailedException; import org.apache.maven.surefire.api.util.TestsToRun; - +import org.apache.maven.surefire.common.junit4.JUnit4RunListener; +import org.apache.maven.surefire.common.junit4.Notifier; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -66,6 +65,8 @@ import org.junit.runners.model.InitializationError; import static junit.framework.Assert.assertEquals; +import static org.apache.maven.surefire.junitcore.ConcurrentRunListener.createInstance; +import static org.mockito.Mockito.mock; /** * {@code @@ -120,8 +121,7 @@ public void surefireIsConfused_ByMultipleIgnore_OnClassLevel() throws Exception final Map testSetMap = new ConcurrentHashMap<>(); - RunListener listener = ConcurrentRunListener.createInstance( testSetMap, reporterFactory, false, false, - new DefaultDirectConsoleReporter( System.out ) ); + TestReportListener listener = createInstance( testSetMap, reporterFactory, false, false ); TestsToRun testsToRun = new TestsToRun( Collections.>singleton( TestClassTest.class ) ); @@ -136,8 +136,8 @@ public void surefireIsConfused_ByMultipleIgnore_OnClassLevel() throws Exception // and rethrows a failure which happened in listener exception.expect( TestSetFailedException.class ); JUnit4RunListener dummy = new JUnit4RunListener( new MockReporter() ); - new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters, - new DefaultDirectConsoleReporter( System.out ) ).execute( testsToRun, customRunListeners, null ); + new JUnitCoreWrapper( new Notifier( dummy, 0 ), jUnitCoreParameters, mock( ConsoleLogger.class ) ) + .execute( testsToRun, customRunListeners, null ); } finally { @@ -172,13 +172,13 @@ public TestCaseRunner( Class klass ) throws InitializationError @Override public void run( RunNotifier notifier ) { - notifier.addListener( new TestRunListener() ); + notifier.addListener( new Listener() ); super.run( notifier ); } } - private static class TestRunListener extends org.junit.runner.notification.RunListener + private static class Listener extends org.junit.runner.notification.RunListener { @Override public void testFinished( Description description ) throws Exception diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java index 0855aa7aaf..5716256bd1 100755 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerBuilderTest.java @@ -20,8 +20,7 @@ */ import net.jcip.annotations.NotThreadSafe; -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; @@ -47,17 +46,18 @@ import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.TimeUnit; +import static org.apache.maven.surefire.junitcore.pc.RangeMatcher.between; import static org.hamcrest.core.AnyOf.anyOf; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNot.not; -import static org.apache.maven.surefire.junitcore.pc.RangeMatcher.between; -import static org.junit.Assert.fail; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.mock; /** * @author Tibor Digana (tibor17) @@ -74,7 +74,7 @@ public class ParallelComputerBuilderTest private static volatile Runnable shutdownTask; - private static final ConsoleStream LOGGER = new DefaultDirectConsoleReporter( System.out ); + private static final ConsoleLogger LOGGER = mock( ConsoleLogger.class ); private static void testKeepBeforeAfter( ParallelComputerBuilder builder, Class... classes ) { diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java index 6f7e02bd55..9dd87d09a3 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/ParallelComputerUtilTest.java @@ -19,13 +19,12 @@ * under the License. */ -import org.apache.maven.surefire.junitcore.JUnitCoreParameters; -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.testset.TestSetFailedException; +import org.apache.maven.surefire.junitcore.JUnitCoreParameters; import org.junit.AfterClass; -import org.junit.BeforeClass; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; import org.junit.experimental.theories.DataPoint; @@ -41,20 +40,21 @@ import java.util.Map; import java.util.concurrent.TimeUnit; -import static org.apache.maven.surefire.junitcore.pc.ParallelComputerUtil.resolveConcurrency; import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.PARALLEL_KEY; -import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNT_KEY; -import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNTSUITES_KEY; +import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.PARALLEL_TIMEOUTFORCED_KEY; +import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.PARALLEL_TIMEOUT_KEY; import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNTCLASSES_KEY; import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNTMETHODS_KEY; -import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.PARALLEL_TIMEOUT_KEY; -import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.PARALLEL_TIMEOUTFORCED_KEY; +import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNTSUITES_KEY; +import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.THREADCOUNT_KEY; import static org.apache.maven.surefire.junitcore.JUnitCoreParameters.USEUNLIMITEDTHREADS_KEY; +import static org.apache.maven.surefire.junitcore.pc.ParallelComputerUtil.resolveConcurrency; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; /** * Testing an algorithm in {@link ParallelComputerUtil} which configures allocated thread resources in ParallelComputer @@ -68,7 +68,7 @@ @SuppressWarnings( "checkstyle:magicnumber" ) public final class ParallelComputerUtilTest { - private static final ConsoleStream LOGGER = new DefaultDirectConsoleReporter( System.out ); + private static final ConsoleLogger LOGGER = mock( ConsoleLogger.class ); @DataPoint public static final int CPU_1 = 1; diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java index 03a5d8eca5..489868a195 100644 --- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java +++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/pc/SchedulingStrategiesTest.java @@ -19,8 +19,7 @@ * under the License. */ -import org.apache.maven.surefire.api.report.ConsoleStream; -import org.apache.maven.surefire.api.report.DefaultDirectConsoleReporter; +import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.junit.Test; import java.util.concurrent.ExecutorService; @@ -30,6 +29,7 @@ import static org.apache.maven.surefire.api.util.internal.DaemonThreadFactory.newDaemonThreadFactory; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; /** * Tests the factories in SchedulingStrategy. @@ -48,7 +48,7 @@ public class SchedulingStrategiesTest { private static final ThreadFactory DAEMON_THREAD_FACTORY = newDaemonThreadFactory(); - private final ConsoleStream logger = new DefaultDirectConsoleReporter( System.out ); + private final ConsoleLogger logger = mock( ConsoleLogger.class ); @Test public void invokerStrategy() 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 58782485ec..fabe13a9fc 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 @@ -25,10 +25,9 @@ import org.apache.maven.surefire.api.cli.CommandLineOption; import org.apache.maven.surefire.api.provider.AbstractProvider; import org.apache.maven.surefire.api.provider.ProviderParameters; -import org.apache.maven.surefire.api.report.ConsoleOutputReceiver; import org.apache.maven.surefire.api.report.ReporterConfiguration; import org.apache.maven.surefire.api.report.ReporterFactory; -import org.apache.maven.surefire.api.report.RunListener; +import org.apache.maven.surefire.api.report.TestReportListener; import org.apache.maven.surefire.api.suite.RunResult; import org.apache.maven.surefire.testng.utils.FailFastEventsSingleton; import org.apache.maven.surefire.api.testset.TestListResolver; @@ -98,12 +97,12 @@ public RunResult invoke( Object forkTestSet ) } final ReporterFactory reporterFactory = providerParameters.getReporterFactory(); - final RunListener reporter = reporterFactory.createReporter(); + final TestReportListener reporter = reporterFactory.createTestReportListener(); /* * {@link org.apache.maven.surefire.api.report.ConsoleOutputCapture#startCapture(ConsoleOutputReceiver)} * called in prior to initializing variable {@link #testsToRun} */ - startCapture( (ConsoleOutputReceiver) reporter ); + startCapture( reporter ); RunResult runResult; try