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 37e50f5581..67b2ce7bab 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 @@ -72,7 +72,7 @@ public final class ForkClient /** * testSetStartedAt is set to non-zero after received - * {@link MasterProcessChannelEncoder#testSetStarting(ReportEntry, boolean)}. + * {@link MasterProcessChannelEncoder#testSetStarting(TestSetReportEntry, boolean)}. */ private final AtomicLong testSetStartedAt = new AtomicLong( START_TIME_ZERO ); 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 c4b9de75c9..7aad5afc15 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 @@ -36,7 +36,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.util.internal.ObjectUtils; +import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.api.util.internal.WritableBufferedByteChannel; import org.apache.maven.surefire.booter.spi.EventChannelEncoder; import org.apache.maven.surefire.extensions.EventHandler; @@ -79,6 +79,7 @@ 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.apache.maven.surefire.api.util.internal.ObjectUtils.systemProps; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.rules.ExpectedException.none; @@ -104,48 +105,6 @@ public static class DecoderOperationsTest @Rule public final ExpectedException rule = none(); - @Test - public void shouldHaveSystemProperty() throws Exception - { - final Stream out = Stream.newStream(); - WritableBufferedByteChannel wChannel = newBufferedChannel( out ); - EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - Map props = ObjectUtils.systemProps(); - encoder.systemProperties( props, NORMAL_RUN, 1L ); - wChannel.close(); - - ForkedProcessEventNotifier notifier = new ForkedProcessEventNotifier(); - PropertyEventAssertionListener listener = new PropertyEventAssertionListener(); - notifier.setSystemPropertiesListener( listener ); - - ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); - - EH eventHandler = new EH(); - CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 0 ); - ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false ); - ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) ); - try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) ) - { - t.start(); - for ( int i = 0; i < props.size(); i++ ) - { - notifier.notifyEvent( eventHandler.pullEvent() ); - } - } - - assertThat( logger.error ).isEmpty(); - assertThat( logger.warning ).isEmpty(); - assertThat( logger.info ).isEmpty(); - assertThat( logger.debug ).isEmpty(); - - assertThat( logger.isCalled() ) - .isFalse(); - assertThat( arguments.isCalled() ) - .isFalse(); - assertThat( listener.counter.get() ) - .isEqualTo( props.size() ); - } - @Test public void shouldSendByeEvent() throws Exception { @@ -799,44 +758,6 @@ public void testStdErrStream() throws Exception .isTrue(); } - @Test - public void shouldCountSameNumberOfSystemProperties() throws Exception - { - final Stream out = Stream.newStream(); - WritableBufferedByteChannel wChannel = newBufferedChannel( out ); - EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.systemProperties( ObjectUtils.systemProps(), NORMAL_RUN, 1L ); - wChannel.close(); - - ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); - - ForkedProcessEventNotifier notifier = new ForkedProcessEventNotifier(); - PropertyEventAssertionListener listener = new PropertyEventAssertionListener(); - notifier.setSystemPropertiesListener( listener ); - - EH eventHandler = new EH(); - CountdownCloseable countdown = new CountdownCloseable( mock( Closeable.class ), 0 ); - ConsoleLoggerMock logger = new ConsoleLoggerMock( false, false, false, false ); - ForkNodeArgumentsMock arguments = new ForkNodeArgumentsMock( logger, new File( "" ) ); - try ( EventConsumerThread t = new EventConsumerThread( "t", channel, eventHandler, countdown, arguments ) ) - { - t.start(); - notifier.notifyEvent( eventHandler.pullEvent() ); - } - - assertThat( logger.error ).isEmpty(); - assertThat( logger.warning ).isEmpty(); - assertThat( logger.info ).isEmpty(); - assertThat( logger.debug ).isEmpty(); - - assertThat( logger.isCalled() ) - .isFalse(); - assertThat( arguments.isCalled() ) - .isFalse(); - assertThat( listener.called.get() ) - .isTrue(); - } - @Test public void shouldHandleErrorAfterNullLine() { @@ -999,7 +920,7 @@ public void testReportEntryOperations( @FromDataPoints( "operation" ) String[] o when( stackTraceWriter.writeTraceToString() ).thenReturn( exceptionStackTrace ); } - ReportEntry reportEntry = mock( ReportEntry.class ); + TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); when( reportEntry.getElapsed() ).thenReturn( elapsed ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( reportedMessage ); @@ -1009,12 +930,14 @@ public void testReportEntryOperations( @FromDataPoints( "operation" ) String[] o when( reportEntry.getSourceName() ).thenReturn( "pkg.MyTest" ); when( reportEntry.getSourceText() ).thenReturn( "test class display name" ); when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); + when( reportEntry.getSystemProperties() ).thenReturn( systemProps() ); final Stream out = Stream.newStream(); EventChannelEncoder encoder = new EventChannelEncoder( newBufferedChannel( out ) ); - EventChannelEncoder.class.getMethod( operation[0], ReportEntry.class, boolean.class ) + Class reportType = operation[0].startsWith( "testSet" ) ? TestSetReportEntry.class : ReportEntry.class; + EventChannelEncoder.class.getMethod( operation[0], reportType, boolean.class ) .invoke( encoder, reportEntry, trim ); ForkedProcessEventNotifier notifier = new ForkedProcessEventNotifier(); 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 dbb3156fb1..70391ad147 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 @@ -68,7 +68,6 @@ public void testSetStarting( TestSetReportEntry report ) @Override public void testSetCompleted( TestSetReportEntry report ) { - target.systemProperties( report.getSystemProperties(), null, null ); target.testSetCompleted( report, trim ); } 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 193929504d..50e8c96a05 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 @@ -20,11 +20,9 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -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 java.util.Map; +import org.apache.maven.surefire.api.report.TestSetReportEntry; /** * An abstraction for physical encoder of events. @@ -44,22 +42,13 @@ public interface MasterProcessChannelEncoder */ void onJvmExit(); - /** - * System properties after the test set has finished. - * - * @param sysProps system properties handled after the test set tear down - * @param runMode the run mode of particular test set - * @param testRunId the test set identification - */ - void systemProperties( Map sysProps, RunMode runMode, Long testRunId ); - /** * The test set has started. * * @param reportEntry test set report entry * @param trimStackTraces {@code true} if stack trace trimming */ - void testSetStarting( ReportEntry reportEntry, boolean trimStackTraces ); + void testSetStarting( TestSetReportEntry reportEntry, boolean trimStackTraces ); /** * The test set has finished. @@ -67,7 +56,7 @@ public interface MasterProcessChannelEncoder * @param reportEntry test set report entry * @param trimStackTraces {@code true} if stack trace trimming */ - void testSetCompleted( ReportEntry reportEntry, boolean trimStackTraces ); + void testSetCompleted( TestSetReportEntry reportEntry, boolean trimStackTraces ); /** * The test has started. 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 67fd6bfe5e..5b74912452 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 @@ -28,6 +28,7 @@ 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.report.TestSetReportEntry; import org.apache.maven.surefire.api.util.internal.WritableBufferedByteChannel; import org.apache.maven.surefire.booter.stream.EventEncoder; @@ -127,8 +128,7 @@ public void onJvmExit() write( ByteBuffer.wrap( new byte[] {'\n'} ), true ); } - @Override - public void systemProperties( Map sysProps, RunMode rm, Long testRunId ) + private void encodeSystemProperties( Map sysProps, RunMode rm, Long testRunId ) { CharsetEncoder encoder = newCharsetEncoder(); ByteBuffer result = null; @@ -145,19 +145,20 @@ public void systemProperties( Map sysProps, RunMode rm, Long tes // :maven-surefire-event:sys-prop:rerun-test-after-failure:UTF-8::::: encode( encoder, result, BOOTERCODE_SYSPROPS, runMode, key, value ); boolean sync = !it.hasNext(); - write( result, sync ); + write( result, true ); } } @Override - public void testSetStarting( ReportEntry reportEntry, boolean trimStackTraces ) + public void testSetStarting( TestSetReportEntry reportEntry, boolean trimStackTraces ) { encode( BOOTERCODE_TESTSET_STARTING, runMode, reportEntry, trimStackTraces, true ); } @Override - public void testSetCompleted( ReportEntry reportEntry, boolean trimStackTraces ) + public void testSetCompleted( TestSetReportEntry reportEntry, boolean trimStackTraces ) { + encodeSystemProperties( reportEntry.getSystemProperties(), null, null ); // todo in next commit encode( BOOTERCODE_TESTSET_COMPLETED, runMode, reportEntry, trimStackTraces, true ); } 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 14f1e5e6e5..98c4b7d6a7 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 @@ -23,7 +23,7 @@ import org.apache.maven.surefire.api.report.ReportEntry; import org.apache.maven.surefire.api.report.SafeThrowable; import org.apache.maven.surefire.api.report.StackTraceWriter; -import org.apache.maven.surefire.api.util.internal.ObjectUtils; +import org.apache.maven.surefire.api.report.TestSetReportEntry; import org.apache.maven.surefire.api.util.internal.WritableBufferedByteChannel; import org.junit.Test; @@ -44,6 +44,7 @@ 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.ObjectUtils.systemProps; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -75,7 +76,7 @@ public void reportEntry() throws IOException when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( trimmedStackTrace ); when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); - ReportEntry reportEntry = mock( ReportEntry.class ); + TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -317,7 +318,9 @@ public void testSetCompleted() throws IOException when( stackTraceWriter.writeTrimmedTraceToString() ).thenReturn( trimmedStackTrace ); when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); - ReportEntry reportEntry = mock( ReportEntry.class ); + Map props = systemProps(); + + TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -325,12 +328,41 @@ public void testSetCompleted() throws IOException when( reportEntry.getNameWithGroup() ).thenReturn( "name with group" ); when( reportEntry.getSourceName() ).thenReturn( "pkg.MyTest" ); when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); + when( reportEntry.getSystemProperties() ).thenReturn( props ); Stream out = Stream.newStream(); EventChannelEncoder encoder = new EventChannelEncoder( newBufferedChannel( out ) ); encoder.testSetCompleted( reportEntry, false ); + ByteArrayOutputStream expectedFrame = new ByteArrayOutputStream(); + for ( Entry entry : props.entrySet() ) + { + expectedFrame.write( ":maven-surefire-event:".getBytes() ); + expectedFrame.write( 8 ); + expectedFrame.write( ":sys-prop:".getBytes() ); + expectedFrame.write( 10 ); + expectedFrame.write( ":normal-run:".getBytes() ); + expectedFrame.write( 5 ); + expectedFrame.write( ":UTF-8:".getBytes() ); + int[] k = toBytes( entry.getKey().length() ); + expectedFrame.write( k[0] ); + expectedFrame.write( k[1] ); + expectedFrame.write( k[2] ); + expectedFrame.write( k[3] ); + expectedFrame.write( ':' ); + expectedFrame.write( entry.getKey().getBytes( UTF_8 ) ); + expectedFrame.write( ':' ); + int[] v = toBytes( entry.getValue() == null ? 1 : entry.getValue().getBytes( UTF_8 ).length ); + expectedFrame.write( v[0] ); + expectedFrame.write( v[1] ); + expectedFrame.write( v[2] ); + expectedFrame.write( v[3] ); + expectedFrame.write( ':' ); + expectedFrame.write( ( entry.getValue() == null ? "\u0000" : entry.getValue() ).getBytes( UTF_8 ) ); + expectedFrame.write( ':' ); + } + expectedFrame.write( ":maven-surefire-event:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 17 ); expectedFrame.write( ":testset-completed:".getBytes( UTF_8 ) ); @@ -377,6 +409,7 @@ public void testSetCompleted() throws IOException expectedFrame.write( ':' ); expectedFrame.write( stackTrace.getBytes( UTF_8 ) ); expectedFrame.write( ':' ); + assertThat( out.toByteArray() ) .isEqualTo( expectedFrame.toByteArray() ); } @@ -1142,41 +1175,6 @@ public void testStdErrStreamLn() throws IOException .isEqualTo( expected ); } - @Test - @SuppressWarnings( "checkstyle:innerassignment" ) - public void shouldCountSameNumberOfSystemProperties() throws IOException - { - Stream stream = Stream.newStream(); - WritableBufferedByteChannel channel = newBufferedChannel( stream ); - EventChannelEncoder encoder = new EventChannelEncoder( channel ); - - Map sysProps = ObjectUtils.systemProps(); - encoder.systemProperties( sysProps, NORMAL_RUN, 1L ); - channel.close(); - - for ( Entry entry : sysProps.entrySet() ) - { - int[] k = toBytes( entry.getKey().length() ); - int[] v = toBytes( entry.getValue() == null ? 1 : entry.getValue().getBytes( UTF_8 ).length ); - ByteArrayOutputStream expectedFrame = new ByteArrayOutputStream(); - expectedFrame.write( ":maven-surefire-event:sys-prop:normal-run:UTF-8:".getBytes( UTF_8 ) ); - expectedFrame.write( k[0] ); - expectedFrame.write( k[1] ); - expectedFrame.write( k[2] ); - expectedFrame.write( k[3] ); - expectedFrame.write( ':' ); - expectedFrame.write( v[0] ); - expectedFrame.write( v[1] ); - expectedFrame.write( v[2] ); - expectedFrame.write( v[3] ); - expectedFrame.write( ':' ); - expectedFrame.write( ( entry.getValue() == null ? "\u0000" : entry.getValue() ).getBytes( UTF_8 ) ); - expectedFrame.write( ':' ); - assertThat( stream.toByteArray() ) - .contains( expectedFrame.toByteArray() ); - } - } - @Test public void shouldHandleExit() {