From 79db90338fb474f91c76991388a35bc412ee1d46 Mon Sep 17 00:00:00 2001 From: tibordigana Date: Fri, 4 Mar 2022 03:50:35 +0100 Subject: [PATCH] [SUREFIRE-2014] Implement testRunId and RunMode in the EventEncoder and EventDecoder --- .../booterclient/output/ForkClient.java | 16 +- .../output/ForkedProcessEventNotifier.java | 3 +- .../ForkedProcessReportEventListener.java | 3 +- .../maven/surefire/stream/CommandEncoder.java | 27 ++- .../maven/surefire/stream/EventDecoder.java | 123 ++++++----- .../booterclient/ForkingRunListenerTest.java | 20 +- .../TestSetMockReporterFactory.java | 3 +- .../booterclient/output/ForkClientTest.java | 56 +++-- .../output/ThreadedStreamConsumerTest.java | 2 +- .../plugin/surefire/extensions/E2ETest.java | 4 +- .../extensions/EventConsumerThreadTest.java | 1 + .../ForkedProcessEventNotifierTest.java | 18 +- .../surefire/extensions/StreamFeederTest.java | 2 - .../surefire/stream/EventDecoderTest.java | 196 ++++++++++-------- .../api/booter/ForkedProcessEventType.java | 34 +-- .../event/AbstractStandardStreamEvent.java | 10 +- .../api/event/AbstractTestControlEvent.java | 10 +- .../api/event/StandardStreamErrEvent.java | 4 +- .../StandardStreamErrWithNewLineEvent.java | 4 +- .../api/event/StandardStreamOutEvent.java | 4 +- .../StandardStreamOutWithNewLineEvent.java | 4 +- .../api/event/SystemPropertyEvent.java | 9 +- .../api/event/TestAssumptionFailureEvent.java | 5 +- .../surefire/api/event/TestErrorEvent.java | 5 +- .../surefire/api/event/TestFailedEvent.java | 5 +- .../surefire/api/event/TestSkippedEvent.java | 5 +- .../surefire/api/event/TestStartingEvent.java | 5 +- .../api/event/TestSucceededEvent.java | 5 +- .../api/event/TestsetCompletedEvent.java | 5 +- .../api/event/TestsetStartingEvent.java | 5 +- .../api/stream/AbstractStreamDecoder.java | 45 ++-- .../api/stream/AbstractStreamEncoder.java | 54 +++-- .../surefire/api/stream/SegmentType.java | 1 + .../api/stream/AbstractStreamDecoderTest.java | 5 +- .../api/stream/AbstractStreamEncoderTest.java | 114 +++++----- .../booter/spi/EventChannelEncoder.java | 112 +++++----- .../booter/stream/CommandDecoder.java | 20 +- .../surefire/booter/CommandReaderTest.java | 2 - .../booter/spi/CommandChannelDecoderTest.java | 3 +- .../booter/spi/EventChannelEncoderTest.java | 116 +++++++++-- .../binary-commands/75171711-encoder.bin | Bin 851 -> 838 bytes .../junitplatform/JUnitPlatformProvider.java | 2 +- .../maven/surefire/junit4/JUnit4Provider.java | 2 +- 43 files changed, 606 insertions(+), 463 deletions(-) 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 fc622ef059..f89209b63f 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 @@ -125,7 +125,7 @@ private final class TestSetStartingListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, TestSetReportEntry reportEntry ) + public void handle( TestSetReportEntry reportEntry ) { getTestSetReporter().testSetStarting( reportEntry ); setCurrentStartTime(); @@ -136,7 +136,7 @@ private final class TestSetCompletedListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, TestSetReportEntry reportEntry ) + public void handle( TestSetReportEntry reportEntry ) { testsInProgress.clear(); TestSetReportEntry entry = reportEntry( reportEntry.getRunMode(), reportEntry.getTestRunId(), @@ -151,7 +151,7 @@ public void handle( RunMode runMode, TestSetReportEntry reportEntry ) private final class TestStartingListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.offer( reportEntry.getSourceName() ); getTestSetReporter().testStarting( reportEntry ); @@ -161,7 +161,7 @@ public void handle( RunMode runMode, ReportEntry reportEntry ) private final class TestSucceededListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.remove( reportEntry.getSourceName() ); getTestSetReporter().testSucceeded( reportEntry ); @@ -171,7 +171,7 @@ public void handle( RunMode runMode, ReportEntry reportEntry ) private final class TestFailedListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.remove( reportEntry.getSourceName() ); getTestSetReporter().testFailed( reportEntry ); @@ -181,7 +181,7 @@ public void handle( RunMode runMode, ReportEntry reportEntry ) private final class TestSkippedListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.remove( reportEntry.getSourceName() ); getTestSetReporter().testSkipped( reportEntry ); @@ -191,7 +191,7 @@ public void handle( RunMode runMode, ReportEntry reportEntry ) private final class TestErrorListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.remove( reportEntry.getSourceName() ); getTestSetReporter().testError( reportEntry ); @@ -201,7 +201,7 @@ public void handle( RunMode runMode, ReportEntry reportEntry ) private final class TestAssumptionFailureListener implements ForkedProcessReportEventListener { @Override - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { testsInProgress.remove( reportEntry.getSourceName() ); getTestSetReporter().testAssumptionFailure( reportEntry ); diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessEventNotifier.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessEventNotifier.java index 1c47afbff0..2e2a174de8 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessEventNotifier.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessEventNotifier.java @@ -225,11 +225,10 @@ else if ( event.isTestCategory() ) { ForkedProcessReportEventListener listener = reportEventListeners.get( eventType ); AbstractTestControlEvent testControlEvent = (AbstractTestControlEvent) event; - RunMode mode = testControlEvent.getRunMode(); ReportEntry reportEntry = testControlEvent.getReportEntry(); if ( listener != null ) { - listener.handle( mode, reportEntry ); + listener.handle( reportEntry ); } } else if ( event.isJvmExitError() ) diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessReportEventListener.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessReportEventListener.java index 1eec0ba142..10f393d0d5 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessReportEventListener.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessReportEventListener.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; /** * @author Tibor Digana (tibor17) @@ -29,5 +28,5 @@ */ public interface ForkedProcessReportEventListener { - void handle( RunMode runMode, T reportEntry ); + void handle( T reportEntry ); } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/CommandEncoder.java b/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/CommandEncoder.java index 81f9d77f42..5da115165b 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/CommandEncoder.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/CommandEncoder.java @@ -38,7 +38,6 @@ import static org.apache.maven.surefire.api.booter.MasterProcessCommand.SHUTDOWN; import static org.apache.maven.surefire.api.booter.MasterProcessCommand.SKIP_SINCE_NEXT_TEST; import static org.apache.maven.surefire.api.booter.MasterProcessCommand.TEST_SET_FINISHED; -import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; /** * @@ -56,52 +55,50 @@ public CommandEncoder( WritableByteChannel out ) public void sendRunClass( String testClassName ) throws IOException { CharsetEncoder encoder = newCharsetEncoder(); - int bufferMaxLength = - estimateBufferLength( RUN_CLASS.getOpcodeLength(), NORMAL_RUN, encoder, 0, testClassName ); + int bufferMaxLength = estimateBufferLength( RUN_CLASS.getOpcodeLength(), null, encoder, 0, 0, testClassName ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encode( encoder, result, RUN_CLASS, NORMAL_RUN, testClassName ); + encode( encoder, result, RUN_CLASS, testClassName ); write( result, true ); } public void sendTestSetFinished() throws IOException { - int bufferMaxLength = estimateBufferLength( TEST_SET_FINISHED.getOpcodeLength(), null, null, 0 ); + int bufferMaxLength = estimateBufferLength( TEST_SET_FINISHED.getOpcodeLength(), null, null, 0, 0 ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, TEST_SET_FINISHED, null ); + encodeHeader( result, TEST_SET_FINISHED ); write( result, true ); } public void sendSkipSinceNextTest() throws IOException { - int bufferMaxLength = estimateBufferLength( SKIP_SINCE_NEXT_TEST.getOpcodeLength(), null, null, 0 ); + int bufferMaxLength = estimateBufferLength( SKIP_SINCE_NEXT_TEST.getOpcodeLength(), null, null, 0, 0 ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, SKIP_SINCE_NEXT_TEST, null ); + encodeHeader( result, SKIP_SINCE_NEXT_TEST ); write( result, true ); } public void sendShutdown( String shutdownData ) throws IOException { CharsetEncoder encoder = newCharsetEncoder(); - int bufferMaxLength = - estimateBufferLength( SHUTDOWN.getOpcodeLength(), null, encoder, 0, shutdownData ); + int bufferMaxLength = estimateBufferLength( SHUTDOWN.getOpcodeLength(), null, encoder, 0, 0, shutdownData ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encode( encoder, result, SHUTDOWN, null, shutdownData ); + encode( encoder, result, SHUTDOWN, shutdownData ); write( result, true ); } public void sendNoop() throws IOException { - int bufferMaxLength = estimateBufferLength( NOOP.getOpcodeLength(), null, null, 0 ); + int bufferMaxLength = estimateBufferLength( NOOP.getOpcodeLength(), null, null, 0, 0 ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, NOOP, null ); + encodeHeader( result, NOOP ); write( result, true ); } public void sendByeAck() throws IOException { - int bufferMaxLength = estimateBufferLength( BYE_ACK.getOpcodeLength(), null, null, 0 ); + int bufferMaxLength = estimateBufferLength( BYE_ACK.getOpcodeLength(), null, null, 0, 0 ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, BYE_ACK, null ); + encodeHeader( result, BYE_ACK ); write( result, true ); } diff --git a/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/EventDecoder.java b/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/EventDecoder.java index aab8689877..ea11889846 100644 --- a/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/EventDecoder.java +++ b/maven-surefire-common/src/main/java/org/apache/maven/surefire/stream/EventDecoder.java @@ -66,12 +66,12 @@ import static java.util.Collections.emptyMap; import static org.apache.maven.surefire.api.booter.Constants.MAGIC_NUMBER_FOR_EVENTS_BYTES; import static org.apache.maven.surefire.api.report.CategorizedReportEntry.reportEntry; -import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; import static org.apache.maven.surefire.api.stream.SegmentType.DATA_INTEGER; import static org.apache.maven.surefire.api.stream.SegmentType.DATA_STRING; import static org.apache.maven.surefire.api.stream.SegmentType.END_OF_FRAME; import static org.apache.maven.surefire.api.stream.SegmentType.RUN_MODE; import static org.apache.maven.surefire.api.stream.SegmentType.STRING_ENCODING; +import static org.apache.maven.surefire.api.stream.SegmentType.TEST_RUN_ID; import static org.apache.maven.surefire.shared.utils.cli.ShutdownHookUtils.addShutDownHook; /** @@ -102,15 +102,17 @@ public class EventDecoder extends AbstractStreamDecoder args ) { + RunMode runMode = (RunMode) args.get( 0 ); + long testRunId = (long) args.get( 1 ); // ReportEntry: - String source = (String) args.get( 0 ); - String sourceText = (String) args.get( 1 ); - String name = (String) args.get( 2 ); - String nameText = (String) args.get( 3 ); - String group = (String) args.get( 4 ); - String message = (String) args.get( 5 ); - Integer timeElapsed = (Integer) args.get( 6 ); + String source = (String) args.get( 2 ); + String sourceText = (String) args.get( 3 ); + String name = (String) args.get( 4 ); + String nameText = (String) args.get( 5 ); + String group = (String) args.get( 6 ); + String message = (String) args.get( 7 ); + Integer timeElapsed = (Integer) args.get( 8 ); // StackTraceWriter: - String traceMessage = (String) args.get( 7 ); - String smartTrimmedStackTrace = (String) args.get( 8 ); - String stackTrace = (String) args.get( 9 ); - return newReportEntry( source, sourceText, name, nameText, group, message, timeElapsed, + String traceMessage = (String) args.get( 9 ); + String smartTrimmedStackTrace = (String) args.get( 10 ); + String stackTrace = (String) args.get( 11 ); + return newReportEntry( runMode, testRunId, source, sourceText, name, nameText, group, message, timeElapsed, traceMessage, smartTrimmedStackTrace, stackTrace ); } @@ -374,8 +383,8 @@ private static StackTraceWriter toTrace( String traceMessage, String smartTrimme } static TestSetReportEntry newReportEntry( // ReportEntry: - String source, String sourceText, String name, - String nameText, String group, String message, + RunMode runMode, long testRunId, String source, String sourceText, + String name, String nameText, String group, String message, Integer timeElapsed, // StackTraceWriter: String traceMessage, @@ -383,8 +392,8 @@ static TestSetReportEntry newReportEntry( // ReportEntry: throws NumberFormatException { StackTraceWriter stackTraceWriter = toTrace( traceMessage, smartTrimmedStackTrace, stackTrace ); - return reportEntry( NORMAL_RUN /*todo*/, 0L /*todo*/, source, sourceText, name, nameText, group, - stackTraceWriter, timeElapsed, message, emptyMap() ); + return reportEntry( runMode, testRunId, source, sourceText, name, nameText, group, stackTraceWriter, + timeElapsed, message, emptyMap() ); } private static Map segmentsToEvents() diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java index 8eae70a9da..e595cba075 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/ForkingRunListenerTest.java @@ -185,7 +185,7 @@ public void testConsoleOutput() throws Exception { final StandardTestRun standardTestRun = new StandardTestRun(); TestOutputReceiver directConsoleReporter = standardTestRun.run(); - directConsoleReporter.writeTestOutput( (TestOutputReportEntry) stdOut( "HeyYou" ) ); + directConsoleReporter.writeTestOutput( new TestOutputReportEntry( stdOut( "HeyYou" ), NORMAL_RUN, 1L ) ); standardTestRun.assertExpected( MockReporter.STDOUT, "HeyYou" ); } @@ -200,14 +200,18 @@ public void testSystemProperties() throws Exception TestSetMockReporterFactory providerReporterFactory = new TestSetMockReporterFactory(); ForkClient forkStreamClient = new ForkClient( providerReporterFactory, new MockNotifiableTestStream(), 1 ); - byte[] cmd = ( ":maven-surefire-event:\u0008:sys-prop:" + (char) 10 + ":normal-run:\u0005:UTF-8:" - + "\u0000\u0000\u0000\u0002:k1:\u0000\u0000\u0000\u0002:v1:\n" ).getBytes(); + byte[] cmd = ( ":maven-surefire-event:\u0008:sys-prop:" + (char) 10 + ":normal-run:" + + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:" + + "\u0000\u0000\u0000\u0002:k1:\u0000\u0000\u0000\u0002:v1:" ).getBytes(); for ( Event e : streamToEvent( cmd ) ) { forkStreamClient.handleEvent( e ); } - cmd = ( "\n:maven-surefire-event:\u0008:sys-prop:" + (char) 10 + ":normal-run:\u0005:UTF-8:" - + "\u0000\u0000\u0000\u0002:k2:\u0000\u0000\u0000\u0002:v2:\n" ).getBytes(); + cmd = ( "\n:maven-surefire-event:\u0008:sys-prop:" + (char) 10 + ":normal-run:" + + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:" + + "\u0000\u0000\u0000\u0002:k2:\u0000\u0000\u0000\u0002:v2:" ).getBytes(); for ( Event e : streamToEvent( cmd ) ) { forkStreamClient.handleEvent( e ); @@ -279,7 +283,7 @@ public void test2DifferentChannels() MockReporter reporter = (MockReporter) forkStreamClient.getReporter(); assertThat( reporter.getFirstEvent() ).isEqualTo( MockReporter.TEST_STARTING ); - //assertThat( reporter.getFirstData() ).isEqualTo( expected ); /*todo uncomment in SUREFIRE-2014*/ + assertThat( reporter.getFirstData() ).isEqualTo( expected ); assertThat( reporter.getEvents() ).hasSize( 1 ); forkStreamClient = new ForkClient( providerReporterFactory, notifiableTestStream, 2 ); @@ -289,7 +293,7 @@ public void test2DifferentChannels() } MockReporter reporter2 = (MockReporter) forkStreamClient.getReporter(); assertThat( reporter2.getFirstEvent() ).isEqualTo( MockReporter.TEST_SKIPPED ); - //assertThat( reporter2.getFirstData() ).isEqualTo( secondExpected ); /*todo uncomment in SUREFIRE-2014*/ + assertThat( reporter2.getFirstData() ).isEqualTo( secondExpected ); assertThat( reporter2.getEvents() ).hasSize( 1 ); } @@ -464,7 +468,7 @@ private SimpleReportEntry createReportEntryWithSpecialMessage( String message ) { StackTraceWriter stackTraceWriter = new LegacyPojoStackTraceWriter( "org.apache.tests.TestClass", "testMethod11", e ); - return new CategorizedReportEntry( NORMAL_RUN, 0L, + return new CategorizedReportEntry( NORMAL_RUN, 1L, "com.abc.TestClass", "testMethod", "aGroup", stackTraceWriter, 77 ); } } 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 ff0bbb34fe..e46be43e8d 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,6 +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.TestOutputReportEntry; import org.apache.maven.surefire.api.report.TestReportListener; import java.io.File; @@ -43,7 +44,7 @@ public TestSetMockReporterFactory() } @Override - public TestReportListener createTestReportListener() + 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 5d8251c67a..393d5c9e8b 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 @@ -474,7 +474,7 @@ public void shouldReceiveStdOut() .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new StandardStreamOutEvent( NORMAL_RUN, "msg" ) ); + client.handleEvent( new StandardStreamOutEvent( NORMAL_RUN, 1L, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) .createTestReportListener(); @@ -516,7 +516,7 @@ public void shouldReceiveStdOutNewLine() .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new StandardStreamOutWithNewLineEvent( NORMAL_RUN, "msg" ) ); + client.handleEvent( new StandardStreamOutWithNewLineEvent( NORMAL_RUN, 1L, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) .createTestReportListener(); @@ -558,7 +558,7 @@ public void shouldReceiveStdErr() .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new StandardStreamErrEvent( NORMAL_RUN, "msg" ) ); + client.handleEvent( new StandardStreamErrEvent( NORMAL_RUN, 1L, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) .createTestReportListener(); @@ -600,7 +600,7 @@ public void shouldReceiveStdErrNewLine() .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new StandardStreamErrWithNewLineEvent( NORMAL_RUN, "msg" ) ); + client.handleEvent( new StandardStreamErrWithNewLineEvent( NORMAL_RUN, 1L, "msg" ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory, times( 1 ) ) .createTestReportListener(); @@ -856,7 +856,7 @@ public void shouldSendSystemProperty() .thenReturn( receiver ); NotifiableTestStream notifiableTestStream = mock( NotifiableTestStream.class ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new SystemPropertyEvent( NORMAL_RUN, "k1", "v1" ) ); + client.handleEvent( new SystemPropertyEvent( NORMAL_RUN, 1L, "k1", "v1" ) ); verifyZeroInteractions( notifiableTestStream ); verifyZeroInteractions( factory ); assertThat( client.getReporter() ) @@ -909,6 +909,8 @@ public void shouldSendTestsetStartingKilled() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -918,7 +920,7 @@ public void shouldSendTestsetStartingKilled() when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new TestsetStartingEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestsetStartingEvent( reportEntry ) ); client.tryToTimeout( System.currentTimeMillis() + 1000L, 1 ); @@ -1004,6 +1006,8 @@ public void shouldSendTestsetStarting() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1015,7 +1019,7 @@ public void shouldSendTestsetStarting() when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new TestsetStartingEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestsetStartingEvent( reportEntry ) ); client.tryToTimeout( System.currentTimeMillis(), 1 ); verifyZeroInteractions( notifiableTestStream ); @@ -1100,6 +1104,8 @@ public void shouldSendTestsetCompleted() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1109,7 +1115,7 @@ public void shouldSendTestsetCompleted() when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new TestsetCompletedEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestsetCompletedEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1193,6 +1199,8 @@ public void shouldSendTestStarting() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1202,7 +1210,7 @@ public void shouldSendTestStarting() when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestStartingEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1287,6 +1295,8 @@ public void shouldSendTestSucceeded() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1298,13 +1308,13 @@ public void shouldSendTestSucceeded() ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); SimpleReportEntry testStarted = new SimpleReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), null, null, null ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, testStarted ) ); + client.handleEvent( new TestStartingEvent( testStarted ) ); assertThat( client.testsInProgress() ) .hasSize( 1 ) .contains( "pkg.MyTest" ); - client.handleEvent( new TestSucceededEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestSucceededEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1392,6 +1402,8 @@ public void shouldSendTestFailed() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1403,13 +1415,13 @@ public void shouldSendTestFailed() ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); SimpleReportEntry testClass = new SimpleReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), null, null, null ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, testClass ) ); + client.handleEvent( new TestStartingEvent( testClass ) ); assertThat( client.testsInProgress() ) .hasSize( 1 ) .contains( "pkg.MyTest" ); - client.handleEvent( new TestFailedEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestFailedEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1503,6 +1515,8 @@ public void shouldSendTestSkipped() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1514,13 +1528,13 @@ public void shouldSendTestSkipped() ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); SimpleReportEntry testStarted = new SimpleReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), null, null, null ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, testStarted ) ); + client.handleEvent( new TestStartingEvent( testStarted ) ); assertThat( client.testsInProgress() ) .hasSize( 1 ) .contains( "pkg.MyTest" ); - client.handleEvent( new TestSkippedEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestSkippedEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1612,6 +1626,8 @@ public void shouldSendTestError() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1624,13 +1640,13 @@ public void shouldSendTestError() ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); SimpleReportEntry testStarted = new SimpleReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), null, null ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, testStarted ) ); + client.handleEvent( new TestStartingEvent( testStarted ) ); assertThat( client.testsInProgress() ) .hasSize( 1 ) .contains( "pkg.MyTest" ); - client.handleEvent( new TestErrorEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestErrorEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); @@ -1718,6 +1734,8 @@ public void shouldSendTestAssumptionFailure() when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "some test" ); @@ -1730,13 +1748,13 @@ public void shouldSendTestAssumptionFailure() ForkClient client = new ForkClient( factory, notifiableTestStream, 0 ); SimpleReportEntry testStarted = new SimpleReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), null, null, null ); - client.handleEvent( new TestStartingEvent( NORMAL_RUN, testStarted ) ); + client.handleEvent( new TestStartingEvent( testStarted ) ); assertThat( client.testsInProgress() ) .hasSize( 1 ) .contains( "pkg.MyTest" ); - client.handleEvent( new TestAssumptionFailureEvent( NORMAL_RUN, reportEntry ) ); + client.handleEvent( new TestAssumptionFailureEvent( reportEntry ) ); verifyZeroInteractions( notifiableTestStream ); verify( factory ).createTestReportListener(); diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumerTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumerTest.java index 5b5c3fa08d..804b76d711 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumerTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumerTest.java @@ -107,7 +107,7 @@ public void handleEvent( @Nonnull Event event ) long t1 = System.currentTimeMillis(); - Event event = new StandardStreamOutWithNewLineEvent( NORMAL_RUN, "" ); + Event event = new StandardStreamOutWithNewLineEvent( NORMAL_RUN, 1L, "" ); for ( int i = 0; i < 5_000_000; i++ ) { streamConsumer.handleEvent( event ); 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 304ed5741e..09040459e4 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 @@ -43,6 +43,7 @@ import org.apache.maven.surefire.api.fork.ForkNodeArguments; import org.apache.maven.surefire.api.report.OutputReportEntry; 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; @@ -54,6 +55,7 @@ import static java.util.concurrent.TimeUnit.HOURS; import static java.util.concurrent.TimeUnit.SECONDS; +import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; import static org.apache.maven.surefire.api.report.TestOutputReportEntry.stdOutln; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.fail; @@ -156,7 +158,7 @@ public void writeTestOutput( OutputReportEntry reportEntry ) for ( int i = 0; i < totalCalls; i++ ) { //System.out.println( LONG_STRING ); - encoder.testOutput( stdOutln( LONG_STRING ) ); + encoder.testOutput( new TestOutputReportEntry( stdOutln( LONG_STRING ), NORMAL_RUN, 1L ) ); } long t2 = System.currentTimeMillis(); long spent = t2 - t1; diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java index b22f0f823f..3fac0e4dcb 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/EventConsumerThreadTest.java @@ -77,6 +77,7 @@ public void handleEvent( @Nonnull Event event ) event.put( ":std-out-stream:".getBytes( UTF_8 ) ); event.put( (byte) 10 ); event.put( ":normal-run:".getBytes( UTF_8 ) ); + event.put( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:".getBytes( UTF_8 ) ); event.put( (byte) 5 ); event.put( ":UTF-8:".getBytes( UTF_8 ) ); event.putInt( 100 ); 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 a2520772a4..f59c2351df 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 @@ -216,6 +216,8 @@ public void shouldCorrectlyDecodeStackTracesWithEmptyStringTraceMessages() throw when( stackTraceWriter.writeTraceToString() ).thenReturn( exceptionStackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( 7 ); when( reportEntry.getGroup() ).thenReturn( null ); when( reportEntry.getMessage() ).thenReturn( null ); @@ -531,7 +533,7 @@ public void testStdOutStream() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( (TestOutputReportEntry) stdOut( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOut( "msg" ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -570,7 +572,7 @@ public void testStdOutStreamPrint() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( (TestOutputReportEntry) stdOut( "" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOut( "" ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -609,7 +611,7 @@ public void testStdOutStreamPrintWithNull() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( (TestOutputReportEntry) stdOut( null ) ); + encoder.testOutput( new TestOutputReportEntry( stdOut( null ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -648,7 +650,7 @@ public void testStdOutStreamPrintln() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( stdOutln( "" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOutln( "" ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -687,7 +689,7 @@ public void testStdOutStreamPrintlnWithNull() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( stdOutln( null ) ); + encoder.testOutput( new TestOutputReportEntry( stdOutln( null ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -726,7 +728,7 @@ public void testStdErrStream() throws Exception final Stream out = Stream.newStream(); WritableBufferedByteChannel wChannel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( wChannel ); - encoder.testOutput( stdErr( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdErr( "msg" ), NORMAL_RUN, 1L ) ); wChannel.close(); ReadableByteChannel channel = newChannel( new ByteArrayInputStream( out.toByteArray() ) ); @@ -922,6 +924,8 @@ public void testReportEntryOperations( @FromDataPoints( "operation" ) String[] o } TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( elapsed ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( reportedMessage ); @@ -1100,7 +1104,7 @@ private static class ReportEventAssertionListener implements ForkedProcessReport this.hasStackTrace = hasStackTrace; } - public void handle( RunMode runMode, ReportEntry reportEntry ) + public void handle( ReportEntry reportEntry ) { called.set( true ); assertThat( reportEntry.getSourceName() ).isEqualTo( this.reportEntry.getSourceName() ); diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/StreamFeederTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/StreamFeederTest.java index 696286ccb7..c7e3cd55a4 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/StreamFeederTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/extensions/StreamFeederTest.java @@ -108,8 +108,6 @@ public Object answer( InvocationOnMock invocation ) throws IOException .append( ":maven-surefire-command:" ) .append( (char) 13 ) .append( ":run-testclass:" ) - .append( (char) 10 ) - .append( ":normal-run:" ) .append( (char) 5 ) .append( ":UTF-8:" ) .append( (char) 0 ) diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/stream/EventDecoderTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/stream/EventDecoderTest.java index 9f65264ccf..efae6eea6a 100644 --- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/stream/EventDecoderTest.java +++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/stream/EventDecoderTest.java @@ -91,6 +91,8 @@ import static org.apache.maven.surefire.api.stream.SegmentType.END_OF_FRAME; import static org.apache.maven.surefire.api.stream.SegmentType.RUN_MODE; import static org.apache.maven.surefire.api.stream.SegmentType.STRING_ENCODING; +import static org.apache.maven.surefire.api.stream.SegmentType.TEST_RUN_ID; +import static org.apache.maven.surefire.stream.EventDecoder.newReportEntry; import static org.assertj.core.api.Assertions.assertThat; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.when; @@ -177,83 +179,84 @@ public void shouldMapEventTypeToSegmentType() segmentTypes = decoder.nextSegmentType( BOOTERCODE_STDOUT ); assertThat( segmentTypes ) - .hasSize( 4 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); + .hasSize( 5 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_STDOUT_NEW_LINE ); assertThat( segmentTypes ) - .hasSize( 4 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); + .hasSize( 5 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_STDERR ); assertThat( segmentTypes ) - .hasSize( 4 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); + .hasSize( 5 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_STDERR_NEW_LINE ); assertThat( segmentTypes ) - .hasSize( 4 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); + .hasSize( 5 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( BOOTERCODE_SYSPROPS ); assertThat( segmentTypes ) - .hasSize( 5 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); + .hasSize( 6 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( BOOTERCODE_TESTSET_STARTING ); assertThat( segmentTypes ) - .hasSize( 13 ) + .hasSize( 14 ) .isEqualTo( new SegmentType[] { - RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, + RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_TESTSET_COMPLETED ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_TEST_STARTING ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( BOOTERCODE_TEST_SUCCEEDED ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( BOOTERCODE_TEST_FAILED ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_TEST_SKIPPED ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_TEST_ERROR ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); segmentTypes = decoder.nextSegmentType( ForkedProcessEventType.BOOTERCODE_TEST_ASSUMPTIONFAILURE ); assertThat( segmentTypes ) - .hasSize( 13 ) - .isEqualTo( new SegmentType[] { RUN_MODE, STRING_ENCODING, DATA_STRING, DATA_STRING, DATA_STRING, - DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, + .hasSize( 14 ) + .isEqualTo( new SegmentType[] { RUN_MODE, TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_STRING, + DATA_STRING, DATA_STRING, DATA_STRING, DATA_STRING, DATA_INTEGER, DATA_STRING, DATA_STRING, DATA_STRING, END_OF_FRAME } ); } @@ -264,21 +267,21 @@ public void shouldCreateEvent() throws Exception Channel channel = new Channel( stream, 1 ); EventDecoder decoder = new EventDecoder( channel, new MockForkNodeArguments() ); - Event event = decoder.toMessage( BOOTERCODE_BYE, NORMAL_RUN, decoder.new Memento() ); + Event event = decoder.toMessage( BOOTERCODE_BYE, decoder.new Memento() ); assertThat( event ) .isInstanceOf( ControlByeEvent.class ); - event = decoder.toMessage( BOOTERCODE_STOP_ON_NEXT_TEST, NORMAL_RUN, decoder.new Memento() ); + event = decoder.toMessage( BOOTERCODE_STOP_ON_NEXT_TEST, decoder.new Memento() ); assertThat( event ) .isInstanceOf( ControlStopOnNextTestEvent.class ); - event = decoder.toMessage( BOOTERCODE_NEXT_TEST, NORMAL_RUN, decoder.new Memento() ); + event = decoder.toMessage( BOOTERCODE_NEXT_TEST, decoder.new Memento() ); assertThat( event ) .isInstanceOf( ControlNextTestEvent.class ); Memento memento = decoder.new Memento(); memento.getData().addAll( asList( "1", "2", "3" ) ); - event = decoder.toMessage( BOOTERCODE_CONSOLE_ERROR, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_CONSOLE_ERROR, memento ); assertThat( event ) .isInstanceOf( ConsoleErrorEvent.class ); ConsoleErrorEvent consoleErrorEvent = (ConsoleErrorEvent) event; @@ -291,7 +294,7 @@ public void shouldCreateEvent() throws Exception memento = decoder.new Memento(); memento.getData().addAll( asList( null, null, null ) ); - event = decoder.toMessage( BOOTERCODE_CONSOLE_ERROR, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_CONSOLE_ERROR, memento ); assertThat( event ) .isInstanceOf( ConsoleErrorEvent.class ); consoleErrorEvent = (ConsoleErrorEvent) event; @@ -300,7 +303,7 @@ public void shouldCreateEvent() throws Exception memento = decoder.new Memento(); memento.getData().addAll( asList( "1", "2", "3" ) ); - event = decoder.toMessage( BOOTERCODE_JVM_EXIT_ERROR, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_JVM_EXIT_ERROR, memento ); assertThat( event ) .isInstanceOf( JvmExitErrorEvent.class ); JvmExitErrorEvent jvmExitErrorEvent = (JvmExitErrorEvent) event; @@ -313,7 +316,7 @@ public void shouldCreateEvent() throws Exception memento = decoder.new Memento(); memento.getData().addAll( asList( null, null, null ) ); - event = decoder.toMessage( BOOTERCODE_JVM_EXIT_ERROR, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_JVM_EXIT_ERROR, memento ); assertThat( event ) .isInstanceOf( JvmExitErrorEvent.class ); jvmExitErrorEvent = (JvmExitErrorEvent) event; @@ -322,64 +325,70 @@ public void shouldCreateEvent() throws Exception memento = decoder.new Memento(); memento.getData().addAll( singletonList( "m" ) ); - event = decoder.toMessage( BOOTERCODE_CONSOLE_INFO, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_CONSOLE_INFO, memento ); assertThat( event ).isInstanceOf( ConsoleInfoEvent.class ); assertThat( ( (ConsoleInfoEvent) event ).getMessage() ).isEqualTo( "m" ); memento = decoder.new Memento(); memento.getData().addAll( singletonList( "" ) ); - event = decoder.toMessage( BOOTERCODE_CONSOLE_WARNING, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_CONSOLE_WARNING, memento ); assertThat( event ).isInstanceOf( ConsoleWarningEvent.class ); assertThat( ( (ConsoleWarningEvent) event ).getMessage() ).isEmpty(); memento = decoder.new Memento(); memento.getData().addAll( singletonList( null ) ); - event = decoder.toMessage( BOOTERCODE_CONSOLE_DEBUG, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_CONSOLE_DEBUG, memento ); assertThat( event ).isInstanceOf( ConsoleDebugEvent.class ); assertThat( ( (ConsoleDebugEvent) event ).getMessage() ).isNull(); memento = decoder.new Memento(); - memento.getData().addAll( singletonList( "m" ) ); - event = decoder.toMessage( BOOTERCODE_STDOUT, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "m" ) ); + event = decoder.toMessage( BOOTERCODE_STDOUT, memento ); assertThat( event ).isInstanceOf( StandardStreamOutEvent.class ); assertThat( ( (StandardStreamOutEvent) event ).getMessage() ).isEqualTo( "m" ); assertThat( ( (StandardStreamOutEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (StandardStreamOutEvent) event ).getTestRunId() ).isEqualTo( 1L ); memento = decoder.new Memento(); - memento.getData().addAll( singletonList( null ) ); - event = decoder.toMessage( BOOTERCODE_STDOUT_NEW_LINE, RERUN_TEST_AFTER_FAILURE, memento ); + memento.getData().addAll( asList( RERUN_TEST_AFTER_FAILURE, 1L, null ) ); + event = decoder.toMessage( BOOTERCODE_STDOUT_NEW_LINE, memento ); assertThat( event ).isInstanceOf( StandardStreamOutWithNewLineEvent.class ); assertThat( ( (StandardStreamOutWithNewLineEvent) event ).getMessage() ).isNull(); assertThat( ( (StandardStreamOutWithNewLineEvent) event ).getRunMode() ).isEqualTo( RERUN_TEST_AFTER_FAILURE ); + assertThat( ( (StandardStreamOutWithNewLineEvent) event ).getTestRunId() ).isEqualTo( 1L ); memento = decoder.new Memento(); - memento.getData().addAll( singletonList( null ) ); - event = decoder.toMessage( BOOTERCODE_STDERR, RERUN_TEST_AFTER_FAILURE, memento ); + memento.getData().addAll( asList( RERUN_TEST_AFTER_FAILURE, 1L, null ) ); + event = decoder.toMessage( BOOTERCODE_STDERR, memento ); assertThat( event ).isInstanceOf( StandardStreamErrEvent.class ); assertThat( ( (StandardStreamErrEvent) event ).getMessage() ).isNull(); assertThat( ( (StandardStreamErrEvent) event ).getRunMode() ).isEqualTo( RERUN_TEST_AFTER_FAILURE ); + assertThat( ( (StandardStreamErrEvent) event ).getTestRunId() ).isEqualTo( 1L ); memento = decoder.new Memento(); - memento.getData().addAll( singletonList( "abc" ) ); - event = decoder.toMessage( BOOTERCODE_STDERR_NEW_LINE, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "abc" ) ); + event = decoder.toMessage( BOOTERCODE_STDERR_NEW_LINE, memento ); assertThat( event ).isInstanceOf( StandardStreamErrWithNewLineEvent.class ); assertThat( ( (StandardStreamErrWithNewLineEvent) event ).getMessage() ).isEqualTo( "abc" ); assertThat( ( (StandardStreamErrWithNewLineEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (StandardStreamErrWithNewLineEvent) event ).getTestRunId() ).isEqualTo( 1L ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "key", "value" ) ); - event = decoder.toMessage( BOOTERCODE_SYSPROPS, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "key", "value" ) ); + event = decoder.toMessage( BOOTERCODE_SYSPROPS, memento ); assertThat( event ).isInstanceOf( SystemPropertyEvent.class ); + assertThat( ( (SystemPropertyEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (SystemPropertyEvent) event ).getTestRunId() ).isEqualTo( 1L ); assertThat( ( (SystemPropertyEvent) event ).getKey() ).isEqualTo( "key" ); assertThat( ( (SystemPropertyEvent) event ).getValue() ).isEqualTo( "value" ); - assertThat( ( (SystemPropertyEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", "sourceText", "name", "nameText", "group", "message", 5, - "traceMessage", "smartTrimmedStackTrace", "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TESTSET_STARTING, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN , 1L, "source", "sourceText", "name", "nameText", "group", + "message", 5, "traceMessage", "smartTrimmedStackTrace", "stackTrace" ) ); + event = decoder.toMessage( BOOTERCODE_TESTSET_STARTING, memento ); assertThat( event ).isInstanceOf( TestsetStartingEvent.class ); - assertThat( ( (TestsetStartingEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestsetStartingEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestsetStartingEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestsetStartingEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestsetStartingEvent) event ).getReportEntry().getSourceText() ).isEqualTo( "sourceText" ); assertThat( ( (TestsetStartingEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -396,11 +405,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", "sourceText", "name", "nameText", "group", null, 5, + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", "sourceText", "name", "nameText", "group", null, 5, "traceMessage", "smartTrimmedStackTrace", "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TESTSET_COMPLETED, NORMAL_RUN, memento ); + event = decoder.toMessage( BOOTERCODE_TESTSET_COMPLETED, memento ); assertThat( event ).isInstanceOf( TestsetCompletedEvent.class ); - assertThat( ( (TestsetCompletedEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestsetCompletedEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestsetCompletedEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestsetCompletedEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestsetCompletedEvent) event ).getReportEntry().getSourceText() ).isEqualTo( "sourceText" ); assertThat( ( (TestsetCompletedEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -417,11 +427,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", "sourceText", "name", "nameText", "group", "message", 5, - null, "smartTrimmedStackTrace", "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TEST_STARTING, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", "sourceText", "name", "nameText", "group", + "message", 5, null, "smartTrimmedStackTrace", "stackTrace" ) ); + event = decoder.toMessage( BOOTERCODE_TEST_STARTING, memento ); assertThat( event ).isInstanceOf( TestStartingEvent.class ); - assertThat( ( (TestStartingEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestStartingEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestStartingEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestStartingEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestStartingEvent) event ).getReportEntry().getSourceText() ).isEqualTo( "sourceText" ); assertThat( ( (TestStartingEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -438,11 +449,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData() - .addAll( asList( "source", "sourceText", "name", "nameText", "group", "message", 5, null, null, null ) ); - event = decoder.toMessage( BOOTERCODE_TEST_SUCCEEDED, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", "sourceText", "name", "nameText", "group", + "message", 5, null, null, null ) ); + event = decoder.toMessage( BOOTERCODE_TEST_SUCCEEDED, memento ); assertThat( event ).isInstanceOf( TestSucceededEvent.class ); - assertThat( ( (TestSucceededEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestSucceededEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestSucceededEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestSucceededEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestSucceededEvent) event ).getReportEntry().getSourceText() ).isEqualTo( "sourceText" ); assertThat( ( (TestSucceededEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -453,11 +465,12 @@ public void shouldCreateEvent() throws Exception assertThat( ( (TestSucceededEvent) event ).getReportEntry().getStackTraceWriter() ).isNull(); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", null, "name", null, "group", null, 5, + memento.getData().addAll( asList( RERUN_TEST_AFTER_FAILURE, 1L, "source", null, "name", null, "group", null, 5, "traceMessage", "smartTrimmedStackTrace", "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TEST_FAILED, RERUN_TEST_AFTER_FAILURE, memento ); + event = decoder.toMessage( BOOTERCODE_TEST_FAILED, memento ); assertThat( event ).isInstanceOf( TestFailedEvent.class ); - assertThat( ( (TestFailedEvent) event ).getRunMode() ).isEqualTo( RERUN_TEST_AFTER_FAILURE ); + assertThat( ( (TestFailedEvent) event ).getReportEntry().getRunMode() ).isEqualTo( RERUN_TEST_AFTER_FAILURE ); + assertThat( ( (TestFailedEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestFailedEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestFailedEvent) event ).getReportEntry().getSourceText() ).isNull(); assertThat( ( (TestFailedEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -474,10 +487,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", null, "name", null, null, null, 5, null, null, "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TEST_SKIPPED, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", null, "name", null, null, null, 5, null, null, + "stackTrace" ) ); + event = decoder.toMessage( BOOTERCODE_TEST_SKIPPED, memento ); assertThat( event ).isInstanceOf( TestSkippedEvent.class ); - assertThat( ( (TestSkippedEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestSkippedEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestSkippedEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestSkippedEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestSkippedEvent) event ).getReportEntry().getSourceText() ).isNull(); assertThat( ( (TestSkippedEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -496,11 +511,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData() - .addAll( asList( "source", null, "name", "nameText", null, null, 0, null, null, "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TEST_ERROR, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", null, "name", "nameText", null, null, 0, null, null, + "stackTrace" ) ); + event = decoder.toMessage( BOOTERCODE_TEST_ERROR, memento ); assertThat( event ).isInstanceOf( TestErrorEvent.class ); - assertThat( ( (TestErrorEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestErrorEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestErrorEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestErrorEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestErrorEvent) event ).getReportEntry().getSourceText() ).isNull(); assertThat( ( (TestErrorEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -519,10 +535,12 @@ public void shouldCreateEvent() throws Exception .isEqualTo( "stackTrace" ); memento = decoder.new Memento(); - memento.getData().addAll( asList( "source", null, "name", null, "group", null, 5, null, null, "stackTrace" ) ); - event = decoder.toMessage( BOOTERCODE_TEST_ASSUMPTIONFAILURE, NORMAL_RUN, memento ); + memento.getData().addAll( asList( NORMAL_RUN, 1L, "source", null, "name", null, "group", null, 5, null, null, + "stackTrace" ) ); + event = decoder.toMessage( BOOTERCODE_TEST_ASSUMPTIONFAILURE, memento ); assertThat( event ).isInstanceOf( TestAssumptionFailureEvent.class ); - assertThat( ( (TestAssumptionFailureEvent) event ).getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestAssumptionFailureEvent) event ).getReportEntry().getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( ( (TestAssumptionFailureEvent) event ).getReportEntry().getTestRunId() ).isEqualTo( 1L ); assertThat( ( (TestAssumptionFailureEvent) event ).getReportEntry().getSourceName() ).isEqualTo( "source" ); assertThat( ( (TestAssumptionFailureEvent) event ).getReportEntry().getSourceText() ).isNull(); assertThat( ( (TestAssumptionFailureEvent) event ).getReportEntry().getName() ).isEqualTo( "name" ); @@ -544,8 +562,10 @@ public void shouldCreateEvent() throws Exception @Test public void shouldRecognizeEmptyStream4ReportEntry() { - ReportEntry reportEntry = EventDecoder.newReportEntry( "", "", "", "", "", "", null, "", "", "" ); + ReportEntry reportEntry = newReportEntry( NORMAL_RUN, 1L, "", "", "", "", "", "", null, "", "", "" ); assertThat( reportEntry ).isNotNull(); + assertThat( reportEntry.getRunMode() ).isEqualTo( NORMAL_RUN ); + assertThat( reportEntry.getTestRunId() ).isEqualTo( 1L ); assertThat( reportEntry.getStackTraceWriter() ).isNotNull(); assertThat( reportEntry.getStackTraceWriter().smartTrimmedStackTrace() ).isEmpty(); assertThat( reportEntry.getStackTraceWriter().writeTraceToString() ).isEmpty(); @@ -587,7 +607,7 @@ public void testCreatingReportEntry() when( reportEntry.getSourceText() ).thenReturn( "test class display name" ); when( reportEntry.getStackTraceWriter() ).thenReturn( stackTraceWriter ); - ReportEntry decodedReportEntry = EventDecoder.newReportEntry( reportEntry.getSourceName(), + ReportEntry decodedReportEntry = newReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), null, null, null, null ); @@ -600,7 +620,7 @@ public void testCreatingReportEntry() assertThat( decodedReportEntry.getMessage() ).isEqualTo( reportEntry.getMessage() ); assertThat( decodedReportEntry.getStackTraceWriter() ).isNull(); - decodedReportEntry = EventDecoder.newReportEntry( reportEntry.getSourceName(), + decodedReportEntry = newReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), null, exceptionMessage, smartStackTrace, null ); @@ -620,7 +640,7 @@ public void testCreatingReportEntry() assertThat( decodedReportEntry.getStackTraceWriter().writeTraceToString() ) .isNull(); - decodedReportEntry = EventDecoder.newReportEntry( reportEntry.getSourceName(), + decodedReportEntry = newReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), 1003, exceptionMessage, smartStackTrace, null ); @@ -640,7 +660,7 @@ public void testCreatingReportEntry() assertThat( decodedReportEntry.getStackTraceWriter().writeTraceToString() ) .isNull(); - decodedReportEntry = EventDecoder.newReportEntry( reportEntry.getSourceName(), + decodedReportEntry = newReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), 1003, exceptionMessage, smartStackTrace, stackTrace ); @@ -661,7 +681,7 @@ public void testCreatingReportEntry() assertThat( decodedReportEntry.getStackTraceWriter().writeTraceToString() ).isEqualTo( stackTrace ); assertThat( decodedReportEntry.getStackTraceWriter().writeTrimmedTraceToString() ).isEqualTo( stackTrace ); - decodedReportEntry = EventDecoder.newReportEntry( reportEntry.getSourceName(), + decodedReportEntry = newReportEntry( NORMAL_RUN, 1L, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), 1003, exceptionMessage, smartStackTrace, trimmedStackTrace ); diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkedProcessEventType.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkedProcessEventType.java index 94da3355fa..f82bb51f24 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkedProcessEventType.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/booter/ForkedProcessEventType.java @@ -33,7 +33,7 @@ public enum ForkedProcessEventType /** * This is the opcode "sys-prop". The frame is composed of segments and the separator characters ':' *
-     * :maven-surefire-event:sys-prop:RunMode:UTF-8:0xFFFFFFFF:key:0xFFFFFFFF:value:
+     * :maven-surefire-event:sys-prop:RunMode:0x0000000100000000:5:UTF-8:0xFFFFFFFF:key:0xFFFFFFFF:value:
      * 
* The constructor with one argument: *
    @@ -45,7 +45,7 @@ public enum ForkedProcessEventType /** * This is the opcode "testset-starting". The frame is composed of segments and the separator characters ':' *
    -     * :maven-surefire-event:testset-starting:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
    +     * :maven-surefire-event:testset-starting:RunMode:0x0000000100000000:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
          * 
    * The constructor with one argument: *
      @@ -57,7 +57,7 @@ public enum ForkedProcessEventType /** * This is the opcode "testset-completed". The frame is composed of segments and the separator characters ':' *
      -     * :maven-surefire-event:testset-completed:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
      +     * :maven-surefire-event:testset-completed:RunMode:0x0000000100000000:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
            * 
      * The constructor with one argument: *
        @@ -69,7 +69,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-starting". The frame is composed of segments and the separator characters ':' *
        -     * :maven-surefire-event:test-starting:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
        +     * :maven-surefire-event:test-starting:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
              * 
        * The constructor with one argument: *
          @@ -81,7 +81,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-succeeded". The frame is composed of segments and the separator characters ':' *
          -     * :maven-surefire-event:test-succeeded:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
          +     * :maven-surefire-event:test-succeeded:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                * 
          * The constructor with one argument: *
            @@ -93,7 +93,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-failed". The frame is composed of segments and the separator characters ':' *
            -     * :maven-surefire-event:test-failed:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
            +     * :maven-surefire-event:test-failed:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                  * 
            * The constructor with one argument: *
              @@ -105,7 +105,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-skipped". The frame is composed of segments and the separator characters ':' *
              -     * :maven-surefire-event:test-skipped:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
              +     * :maven-surefire-event:test-skipped:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                    * 
              * The constructor with one argument: *
                @@ -117,7 +117,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-error". The frame is composed of segments and the separator characters ':' *
                -     * :maven-surefire-event:test-error:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                +     * :maven-surefire-event:test-error:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                      * 
                * The constructor with one argument: *
                  @@ -129,7 +129,7 @@ public enum ForkedProcessEventType /** * This is the opcode "test-assumption-failure". The frame is composed of segments and the separator characters ':' *
                  -     * :maven-surefire-event:test-assumption-failure:RunMode:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                  +     * :maven-surefire-event:test-assumption-failure:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:SourceName:0xFFFFFFFF:SourceText:0xFFFFFFFF:Name:0xFFFFFFFF:NameText:0xFFFFFFFF:Group:0xFFFFFFFF:Message:ElapsedTime (binary int):0xFFFFFFFF:LocalizedMessage:0xFFFFFFFF:SmartTrimmedStackTrace:0xFFFFFFFF:toStackTrace( stw, trimStackTraces ):
                        * 
                  * The constructor with one argument: *
                    @@ -141,7 +141,7 @@ public enum ForkedProcessEventType /** * This is the opcode "std-out-stream". The frame is composed of segments and the separator characters ':' *
                    -     * :maven-surefire-event:std-out-stream:RunMode:UTF-8:0xFFFFFFFF:line:
                    +     * :maven-surefire-event:std-out-stream:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:line:
                          * 
                    * The constructor with one argument: *
                      @@ -153,7 +153,7 @@ public enum ForkedProcessEventType /** * This is the opcode "std-out-stream-new-line". The frame is composed of segments and the separator characters ':' *
                      -     * :maven-surefire-event:std-out-stream-new-line:RunMode:UTF-8:0xFFFFFFFF:line:
                      +     * :maven-surefire-event:std-out-stream-new-line:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:line:
                            * 
                      * The constructor with one argument: *
                        @@ -165,7 +165,7 @@ public enum ForkedProcessEventType /** * This is the opcode "std-err-stream". The frame is composed of segments and the separator characters ':' *
                        -     * :maven-surefire-event:std-err-stream:RunMode:UTF-8:0xFFFFFFFF:line:
                        +     * :maven-surefire-event:std-err-stream:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:line:
                              * 
                        * The constructor with one argument: *
                          @@ -177,7 +177,7 @@ public enum ForkedProcessEventType /** * This is the opcode "std-err-stream-new-line". The frame is composed of segments and the separator characters ':' *
                          -     * :maven-surefire-event:std-err-stream-new-line:RunMode:UTF-8:0xFFFFFFFF:line:
                          +     * :maven-surefire-event:std-err-stream-new-line:RunMode:0x0000000100000001:5:UTF-8:0xFFFFFFFF:line:
                                * 
                          * The constructor with one argument: *
                            @@ -189,7 +189,7 @@ public enum ForkedProcessEventType /** * This is the opcode "console-info-log". The frame is composed of segments and the separator characters ':' *
                            -     * :maven-surefire-event:console-info-log:RunMode:UTF-8:0xFFFFFFFF:line:
                            +     * :maven-surefire-event:console-info-log:RunMode:5:UTF-8:0xFFFFFFFF:line:
                                  * 
                            * The constructor with one argument: *
                              @@ -201,7 +201,7 @@ public enum ForkedProcessEventType /** * This is the opcode "console-debug-log". The frame is composed of segments and the separator characters ':' *
                              -     * :maven-surefire-event:console-debug-log:RunMode:UTF-8:0xFFFFFFFF:line:
                              +     * :maven-surefire-event:console-debug-log:RunMode:5:UTF-8:0xFFFFFFFF:line:
                                    * 
                              * The constructor with one argument: *
                                @@ -213,7 +213,7 @@ public enum ForkedProcessEventType /** * This is the opcode "console-warning-log". The frame is composed of segments and the separator characters ':' *
                                -     * :maven-surefire-event:console-warning-log:RunMode:UTF-8:0xFFFFFFFF:line:
                                +     * :maven-surefire-event:console-warning-log:RunMode:5:UTF-8:0xFFFFFFFF:line:
                                      * 
                                * The constructor with one argument: *
                                  @@ -225,7 +225,7 @@ public enum ForkedProcessEventType /** * This is the opcode "console-error-log". The frame is composed of segments and the separator characters ':' *
                                  -     * :maven-surefire-event:console-error-log:RunMode:UTF-8:0xFFFFFFFF:line:
                                  +     * :maven-surefire-event:console-error-log:RunMode:5:UTF-8:0xFFFFFFFF:line:
                                        * 
                                  * The constructor with one argument: *
                                    diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractStandardStreamEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractStandardStreamEvent.java index bebb35e227..4393ee3d60 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractStandardStreamEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractStandardStreamEvent.java @@ -30,12 +30,15 @@ public abstract class AbstractStandardStreamEvent extends Event { private final RunMode runMode; + private final Long testRunId; private final String message; - protected AbstractStandardStreamEvent( ForkedProcessEventType eventType, RunMode runMode, String message ) + protected AbstractStandardStreamEvent( ForkedProcessEventType eventType, RunMode runMode, Long testRunId, + String message ) { super( eventType ); this.runMode = runMode; + this.testRunId = testRunId; this.message = message; } @@ -44,6 +47,11 @@ public RunMode getRunMode() return runMode; } + public Long getTestRunId() + { + return testRunId; + } + public String getMessage() { return message; diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractTestControlEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractTestControlEvent.java index 747f65cebf..a43ed33420 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractTestControlEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/AbstractTestControlEvent.java @@ -21,7 +21,6 @@ import org.apache.maven.surefire.api.booter.ForkedProcessEventType; import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; /** * The base class of an event of test control. @@ -31,21 +30,14 @@ */ public abstract class AbstractTestControlEvent extends Event { - private final RunMode runMode; private final T reportEntry; - public AbstractTestControlEvent( ForkedProcessEventType eventType, RunMode runMode, T reportEntry ) + public AbstractTestControlEvent( ForkedProcessEventType eventType, T reportEntry ) { super( eventType ); - this.runMode = runMode; this.reportEntry = reportEntry; } - public RunMode getRunMode() - { - return runMode; - } - public T getReportEntry() { return reportEntry; diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrEvent.java index 3367edfffe..7188b8b1e1 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrEvent.java @@ -30,8 +30,8 @@ */ public final class StandardStreamErrEvent extends AbstractStandardStreamEvent { - public StandardStreamErrEvent( RunMode runMode, String message ) + public StandardStreamErrEvent( RunMode runMode, Long testRunId, String message ) { - super( BOOTERCODE_STDERR, runMode, message ); + super( BOOTERCODE_STDERR, runMode, testRunId, message ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrWithNewLineEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrWithNewLineEvent.java index 2974e5a7c7..968dcb3f08 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrWithNewLineEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamErrWithNewLineEvent.java @@ -30,8 +30,8 @@ */ public final class StandardStreamErrWithNewLineEvent extends AbstractStandardStreamEvent { - public StandardStreamErrWithNewLineEvent( RunMode runMode, String message ) + public StandardStreamErrWithNewLineEvent( RunMode runMode, Long testRunId, String message ) { - super( BOOTERCODE_STDERR_NEW_LINE, runMode, message ); + super( BOOTERCODE_STDERR_NEW_LINE, runMode, testRunId, message ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutEvent.java index 9c77edd487..1525de7eed 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutEvent.java @@ -30,8 +30,8 @@ */ public final class StandardStreamOutEvent extends AbstractStandardStreamEvent { - public StandardStreamOutEvent( RunMode runMode, String message ) + public StandardStreamOutEvent( RunMode runMode, Long testRunId, String message ) { - super( BOOTERCODE_STDOUT, runMode, message ); + super( BOOTERCODE_STDOUT, runMode, testRunId, message ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutWithNewLineEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutWithNewLineEvent.java index 34d9f8db91..b566bf9087 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutWithNewLineEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/StandardStreamOutWithNewLineEvent.java @@ -30,8 +30,8 @@ */ public final class StandardStreamOutWithNewLineEvent extends AbstractStandardStreamEvent { - public StandardStreamOutWithNewLineEvent( RunMode runMode, String message ) + public StandardStreamOutWithNewLineEvent( RunMode runMode, Long testRunId, String message ) { - super( BOOTERCODE_STDOUT_NEW_LINE, runMode, message ); + super( BOOTERCODE_STDOUT_NEW_LINE, runMode, testRunId, message ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/SystemPropertyEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/SystemPropertyEvent.java index a0ae1e4739..0b293b544d 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/SystemPropertyEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/SystemPropertyEvent.java @@ -31,13 +31,15 @@ public final class SystemPropertyEvent extends Event { private final RunMode runMode; + private final Long testRunId; private final String key; private final String value; - public SystemPropertyEvent( RunMode runMode, String key, String value ) + public SystemPropertyEvent( RunMode runMode, Long testRunId, String key, String value ) { super( BOOTERCODE_SYSPROPS ); this.runMode = runMode; + this.testRunId = testRunId; this.key = key; this.value = value; } @@ -47,6 +49,11 @@ public RunMode getRunMode() return runMode; } + public Long getTestRunId() + { + return testRunId; + } + public String getKey() { return key; diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestAssumptionFailureEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestAssumptionFailureEvent.java index ee1b46605c..c702dc80d9 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestAssumptionFailureEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestAssumptionFailureEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_ASSUMPTIONFAILURE; @@ -31,8 +30,8 @@ */ public final class TestAssumptionFailureEvent extends AbstractTestControlEvent { - public TestAssumptionFailureEvent( RunMode runMode, ReportEntry reportEntry ) + public TestAssumptionFailureEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_ASSUMPTIONFAILURE, runMode, reportEntry ); + super( BOOTERCODE_TEST_ASSUMPTIONFAILURE, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestErrorEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestErrorEvent.java index f85fc5dee9..a66f63c046 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestErrorEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestErrorEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_ERROR; @@ -31,8 +30,8 @@ */ public final class TestErrorEvent extends AbstractTestControlEvent { - public TestErrorEvent( RunMode runMode, ReportEntry reportEntry ) + public TestErrorEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_ERROR, runMode, reportEntry ); + super( BOOTERCODE_TEST_ERROR, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestFailedEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestFailedEvent.java index 30c89940fd..1905e07ac1 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestFailedEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestFailedEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_FAILED; @@ -31,8 +30,8 @@ */ public final class TestFailedEvent extends AbstractTestControlEvent { - public TestFailedEvent( RunMode runMode, ReportEntry reportEntry ) + public TestFailedEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_FAILED, runMode, reportEntry ); + super( BOOTERCODE_TEST_FAILED, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSkippedEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSkippedEvent.java index 3ec406d354..f33b52823c 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSkippedEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSkippedEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_SKIPPED; @@ -31,8 +30,8 @@ */ public final class TestSkippedEvent extends AbstractTestControlEvent { - public TestSkippedEvent( RunMode runMode, ReportEntry reportEntry ) + public TestSkippedEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_SKIPPED, runMode, reportEntry ); + super( BOOTERCODE_TEST_SKIPPED, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestStartingEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestStartingEvent.java index 94818d0857..9ef3e71626 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestStartingEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestStartingEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_STARTING; @@ -31,8 +30,8 @@ */ public final class TestStartingEvent extends AbstractTestControlEvent { - public TestStartingEvent( RunMode runMode, ReportEntry reportEntry ) + public TestStartingEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_STARTING, runMode, reportEntry ); + super( BOOTERCODE_TEST_STARTING, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSucceededEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSucceededEvent.java index dd4005b7b6..fad36eb7d4 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSucceededEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestSucceededEvent.java @@ -20,7 +20,6 @@ */ import org.apache.maven.surefire.api.report.ReportEntry; -import org.apache.maven.surefire.api.report.RunMode; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_SUCCEEDED; @@ -31,8 +30,8 @@ */ public final class TestSucceededEvent extends AbstractTestControlEvent { - public TestSucceededEvent( RunMode runMode, ReportEntry reportEntry ) + public TestSucceededEvent( ReportEntry reportEntry ) { - super( BOOTERCODE_TEST_SUCCEEDED, runMode, reportEntry ); + super( BOOTERCODE_TEST_SUCCEEDED, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetCompletedEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetCompletedEvent.java index e20c44c026..2d82a39b44 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetCompletedEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetCompletedEvent.java @@ -19,7 +19,6 @@ * under the License. */ -import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.TestSetReportEntry; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TESTSET_COMPLETED; @@ -31,8 +30,8 @@ */ public final class TestsetCompletedEvent extends AbstractTestControlEvent { - public TestsetCompletedEvent( RunMode runMode, TestSetReportEntry reportEntry ) + public TestsetCompletedEvent( TestSetReportEntry reportEntry ) { - super( BOOTERCODE_TESTSET_COMPLETED, runMode, reportEntry ); + super( BOOTERCODE_TESTSET_COMPLETED, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetStartingEvent.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetStartingEvent.java index 4faf3ac536..5518f0d6ab 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetStartingEvent.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/event/TestsetStartingEvent.java @@ -19,7 +19,6 @@ * under the License. */ -import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.report.TestSetReportEntry; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TESTSET_STARTING; @@ -31,8 +30,8 @@ */ public final class TestsetStartingEvent extends AbstractTestControlEvent { - public TestsetStartingEvent( RunMode runMode, TestSetReportEntry reportEntry ) + public TestsetStartingEvent( TestSetReportEntry reportEntry ) { - super( BOOTERCODE_TESTSET_STARTING, runMode, reportEntry ); + super( BOOTERCODE_TESTSET_STARTING, reportEntry ); } } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoder.java index de197d5a45..facf30bcb5 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoder.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoder.java @@ -21,7 +21,6 @@ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger; import org.apache.maven.surefire.api.fork.ForkNodeArguments; -import org.apache.maven.surefire.api.report.RunMode; import javax.annotation.Nonnegative; import javax.annotation.Nonnull; @@ -73,6 +72,7 @@ public abstract class AbstractStreamDecoder, ST extends E private static final int DELIMITER_LENGTH = 1; private static final int BYTE_LENGTH = 1; private static final int INT_LENGTH = 4; + private static final int LONG_LENGTH = 8; private final ReadableByteChannel channel; private final ForkNodeArguments arguments; @@ -98,7 +98,7 @@ protected AbstractStreamDecoder( @Nonnull ReadableByteChannel channel, protected abstract ST[] nextSegmentType( @Nonnull MT messageType ); @Nonnull - protected abstract M toMessage( @Nonnull MT messageType, RunMode runMode, @Nonnull Memento memento ) + protected abstract M toMessage( @Nonnull MT messageType, @Nonnull Memento memento ) throws MalformedFrameException; @Nonnull @@ -229,6 +229,27 @@ protected int readInt( @Nonnull Memento memento ) throws IOException, MalformedF return i; } + protected Long readLong( @Nonnull Memento memento ) throws IOException, MalformedFrameException + { + read( memento, BYTE_LENGTH ); + boolean isNullObject = memento.getByteBuffer().get() == 0; + if ( isNullObject ) + { + read( memento, DELIMITER_LENGTH ); + checkDelimiter( memento ); + return null; + } + return readLongPrivate( memento ); + } + + protected long readLongPrivate( @Nonnull Memento memento ) throws IOException, MalformedFrameException + { + read( memento, LONG_LENGTH + DELIMITER_LENGTH ); + long num = memento.getByteBuffer().getLong(); + checkDelimiter( memento ); + return num; + } + @SuppressWarnings( "checkstyle:magicnumber" ) protected final void checkDelimiter( Memento memento ) throws MalformedFrameException { @@ -249,10 +270,11 @@ protected final void checkHeader( Memento memento ) throws MalformedFrameExcepti try { byte[] header = getEncodedMagicNumber(); + byte[] bbArray = bb.array(); for ( int start = bb.arrayOffset() + ( (Buffer) bb ).position(), length = header.length; shift < length; shift++ ) { - if ( bb.array()[shift + start] != header[shift] ) + if ( bbArray[shift + start] != header[shift] ) { throw new MalformedFrameException( memento.getLine().getPositionByteBuffer(), ( (Buffer) bb ).position() + shift ); @@ -267,17 +289,6 @@ protected final void checkHeader( Memento memento ) throws MalformedFrameExcepti checkDelimiter( memento ); } - protected void checkArguments( RunMode runMode, Memento memento, int expectedDataElements ) - throws MalformedFrameException - { - if ( runMode == null ) - { - throw new MalformedFrameException( memento.getLine().getPositionByteBuffer(), - ( (Buffer) memento.getByteBuffer() ).position() ); - } - checkArguments( memento, expectedDataElements ); - } - protected void checkArguments( Memento memento, int expectedDataElements ) throws MalformedFrameException { @@ -555,6 +566,12 @@ public List getData() return data; } + public T ofDataAt( int indexOfData ) + { + //noinspection unchecked + return (T) data.get( indexOfData ); + } + public CharBuffer getCharBuffer() { return cb; diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java index 758c1f995a..9d3b765dba 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoder.java @@ -79,7 +79,25 @@ protected void write( ByteBuffer frame, boolean sendImmediately ) } } - public void encodeHeader( ByteBuffer result, E operation, RunMode runMode ) + public void encodeHeader( ByteBuffer result, E operation, RunMode runMode, Long testRunId ) + { + encodeHeader( result, operation ); + + byte[] runmode = runMode == null ? new byte[0] : runMode.getRunmodeBinary(); + result.put( (byte) runmode.length ); + result.put( (byte) ':' ); + result.put( runmode ); + result.put( (byte) ':' ); + + result.put( (byte) ( testRunId == null ? 0 : 1 ) ); + if ( testRunId != null ) + { + result.putLong( testRunId ); + } + result.put( (byte) ':' ); + } + + public void encodeHeader( ByteBuffer result, E operation ) { result.put( (byte) ':' ); result.put( getEncodedMagicNumber() ); @@ -89,15 +107,6 @@ public void encodeHeader( ByteBuffer result, E operation, RunMode runMode ) result.put( (byte) ':' ); result.put( opcode ); result.put( (byte) ':' ); - - if ( runMode != null ) - { - byte[] runmode = runMode.getRunmodeBinary(); - result.put( (byte) runmode.length ); - result.put( (byte) ':' ); - result.put( runmode ); - result.put( (byte) ':' ); - } } public void encodeCharset( ByteBuffer result ) @@ -141,9 +150,21 @@ public void encodeInteger( ByteBuffer result, Integer i ) result.put( (byte) ':' ); } - public void encode( CharsetEncoder encoder, ByteBuffer result, E operation, RunMode runMode, String... messages ) + public void encode( CharsetEncoder encoder, ByteBuffer result, E operation, RunMode runMode, Long testRunId, + String... messages ) + { + encodeHeader( result, operation, runMode, testRunId ); + encodeStringData( result, encoder, messages ); + } + + public void encode( CharsetEncoder encoder, ByteBuffer result, E operation, String... messages ) + { + encodeHeader( result, operation ); + encodeStringData( result, encoder, messages ); + } + + private void encodeStringData( ByteBuffer result, CharsetEncoder encoder, String... messages ) { - encodeHeader( result, operation, runMode ); encodeCharset( result ); for ( String message : messages ) { @@ -152,7 +173,7 @@ public void encode( CharsetEncoder encoder, ByteBuffer result, E operation, RunM } public int estimateBufferLength( int opcodeLength, RunMode runMode, CharsetEncoder encoder, - int integersCounter, String... strings ) + int integersCounter, int longsCounter, String... strings ) { assert !( encoder == null && strings.length != 0 ); @@ -173,12 +194,15 @@ public int estimateBufferLength( int opcodeLength, RunMode runMode, CharsetEncod } // one byte (0x00 if NULL) + 4 bytes for integer + one delimiter character ':' - int lengthOfData = ( 1 + 1 + 4 ) * integersCounter; + int lengthOfData = ( 1 + 4 + 1 ) * integersCounter; + + // one byte (0x00 if NULL) + 8 bytes for long + one delimiter character ':' + lengthOfData += ( 1 + 8 + 1 ) * longsCounter; for ( String string : strings ) { String s = nonNull( string ); - // 4 bytes of string length + one delimiter character ':' + + one delimiter character ':' + // 4 bytes of length of the string + one delimiter character ':' + + one delimiter character ':' lengthOfData += 4 + 1 + (int) ceil( encoder.maxBytesPerChar() * s.length() ) + 1; } diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/SegmentType.java b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/SegmentType.java index f81d2cec81..97932f1aa8 100644 --- a/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/SegmentType.java +++ b/surefire-api/src/main/java/org/apache/maven/surefire/api/stream/SegmentType.java @@ -25,6 +25,7 @@ public enum SegmentType { RUN_MODE, + TEST_RUN_ID, STRING_ENCODING, DATA_STRING, DATA_INTEGER, diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoderTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoderTest.java index 2dd9c72722..2ff06eab62 100644 --- a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoderTest.java +++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamDecoderTest.java @@ -39,7 +39,6 @@ import org.apache.maven.surefire.api.booter.ForkedProcessEventType; import org.apache.maven.surefire.api.event.Event; import org.apache.maven.surefire.api.fork.ForkNodeArguments; -import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.stream.AbstractStreamDecoder.MalformedFrameException; import org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Memento; import org.apache.maven.surefire.api.stream.AbstractStreamDecoder.Segment; @@ -686,9 +685,7 @@ protected SegmentType[] nextSegmentType( @Nonnull ForkedProcessEventType message @Nonnull @Override - protected Event toMessage( - @Nonnull ForkedProcessEventType messageType, RunMode runMode, - @Nonnull Memento memento ) throws MalformedFrameException + protected Event toMessage( @Nonnull ForkedProcessEventType messageType, @Nonnull Memento memento ) { return null; } diff --git a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java index bec5a58aaf..a94ce76b01 100644 --- a/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java +++ b/surefire-api/src/test/java/org/apache/maven/surefire/api/stream/AbstractStreamEncoderTest.java @@ -69,109 +69,109 @@ public void shouldComputeStreamPreemptiveLength() Encoder streamEncoder = new Encoder( new DummyChannel() ); CharsetEncoder encoder = streamEncoder.newCharsetEncoder(); - // :maven-surefire-event:8:sys-prop:10:normal-run:5:UTF-8:0001:kkk:0001:vvv: + // :maven-surefire-event:8:sys-prop:10:normal-run:1:5:UTF-8:0003:kkk:0003:vvv: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_SYSPROPS.getOpcodeBinary().length, NORMAL_RUN, - encoder, 0, "k", "v" ) ) - .isEqualTo( 72 ); + encoder, 0, 1, "k", "v" ) ) + .isEqualTo( 82 ); - // :maven-surefire-event:16:testset-starting:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:16:testset-starting:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TESTSET_STARTING.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 149 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 159 ); - // :maven-surefire-event:17:testset-completed:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:17:testset-completed:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TESTSET_COMPLETED.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 150 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 160 ); - // :maven-surefire-event:13:test-starting:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:13:test-starting:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_STARTING.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 146 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 156 ); - // :maven-surefire-event:14:test-succeeded:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:14:test-succeeded:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_SUCCEEDED.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 147 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 157 ); - // :maven-surefire-event:11:test-failed:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:11:test-failed:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_FAILED.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 144 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 154 ); - // :maven-surefire-event:12:test-skipped:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:12:test-skipped:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_SKIPPED.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 145 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 155 ); - // :maven-surefire-event:10:test-error:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:10:test-error:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_ERROR.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 143 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 153 ); - // :maven-surefire-event:23:test-assumption-failure:10:normal-run:5:UTF-8:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:0001:sss:X0001:0001:sss:0001:sss:0001:sss: + // :maven-surefire-event:23:test-assumption-failure:10:normal-run:1:5:UTF-8:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:0003:sss:X0003:0003:sss:0003:sss:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_TEST_ASSUMPTIONFAILURE.getOpcodeBinary().length, - NORMAL_RUN, encoder, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) - .isEqualTo( 156 ); + NORMAL_RUN, encoder, 1, 1, "s", "s", "s", "s", "s", "s", "s", "s", "s" ) ) + .isEqualTo( 166 ); - // :maven-surefire-event:14:std-out-stream:10:normal-run:5:UTF-8:0001:sss: + // :maven-surefire-event:14:std-out-stream:10:normal-run:1:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STDOUT.getOpcodeBinary().length, - NORMAL_RUN, encoder, 0, "s" ) ) - .isEqualTo( 69 ); + NORMAL_RUN, encoder, 0, 1, "s" ) ) + .isEqualTo( 79 ); - // :maven-surefire-event:23:std-out-stream-new-line:10:normal-run:5:UTF-8:0001:sss: + // :maven-surefire-event:23:std-out-stream-new-line:10:normal-run:1:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STDOUT_NEW_LINE.getOpcodeBinary().length, - NORMAL_RUN, encoder, 0, "s" ) ) - .isEqualTo( 78 ); + NORMAL_RUN, encoder, 0, 1, "s" ) ) + .isEqualTo( 88 ); - // :maven-surefire-event:14:std-err-stream:10:normal-run:5:UTF-8:0001:sss: + // :maven-surefire-event:14:std-err-stream:10:normal-run:1:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STDERR.getOpcodeBinary().length, - NORMAL_RUN, encoder, 0, "s" ) ) - .isEqualTo( 69 ); + NORMAL_RUN, encoder, 0, 1, "s" ) ) + .isEqualTo( 79 ); - // :maven-surefire-event:23:std-err-stream-new-line:10:normal-run:5:UTF-8:0001:sss: + // :maven-surefire-event:23:std-err-stream-new-line:10:normal-run:1:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STDERR_NEW_LINE.getOpcodeBinary().length, - NORMAL_RUN, encoder, 0, "s" ) ) - .isEqualTo( 78 ); + NORMAL_RUN, encoder, 0, 1, "s" ) ) + .isEqualTo( 88 ); - // :maven-surefire-event:16:console-info-log:5:UTF-8:0001:sss: + // :maven-surefire-event:16:console-info-log:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_INFO.getOpcodeBinary().length, - null, encoder, 0, "s" ) ) + null, encoder, 0, 0, "s" ) ) .isEqualTo( 58 ); - // :maven-surefire-event:17:console-debug-log:5:UTF-8:0001:sss: + // :maven-surefire-event:17:console-debug-log:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_DEBUG.getOpcodeBinary().length, - null, encoder, 0, "s" ) ) + null, encoder, 0, 0, "s" ) ) .isEqualTo( 59 ); - // :maven-surefire-event:19:console-warning-log:5:UTF-8:0001:sss: + // :maven-surefire-event:19:console-warning-log:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_WARNING.getOpcodeBinary().length, - null, encoder, 0, "s" ) ) + null, encoder, 0, 0, "s" ) ) .isEqualTo( 61 ); - // :maven-surefire-event:17:console-error-log:5:UTF-8:0001:sss: + // :maven-surefire-event:17:console-error-log:5:UTF-8:0003:sss: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcodeBinary().length, - null, encoder, 0, "s" ) ) + null, encoder, 0, 0, "s" ) ) .isEqualTo( 59 ); // :maven-surefire-event:3:bye: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_BYE.getOpcodeBinary().length, - null, null, 0 ) ) + null, null, 0, 0 ) ) .isEqualTo( 28 ); // :maven-surefire-event:17:stop-on-next-test: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_STOP_ON_NEXT_TEST.getOpcodeBinary().length, - null, null, 0 ) ) + null, null, 0, 0 ) ) .isEqualTo( 42 ); // :maven-surefire-event:9:next-test: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_NEXT_TEST.getOpcodeBinary().length, - null, null, 0 ) ) + null, null, 0, 0 ) ) .isEqualTo( 34 ); // :maven-surefire-event:14:jvm-exit-error: assertThat( streamEncoder.estimateBufferLength( BOOTERCODE_JVM_EXIT_ERROR.getOpcodeBinary().length, - null, null, 0 ) ) + null, null, 0, 0 ) ) .isEqualTo( 39 ); } @@ -180,12 +180,13 @@ public void testSendOpcode() { Encoder streamEncoder = new Encoder( new DummyChannel() ); ByteBuffer result = ByteBuffer.allocate( 128 ); - streamEncoder.encodeHeader( result, BOOTERCODE_TEST_ERROR, NORMAL_RUN ); + streamEncoder.encodeHeader( result, BOOTERCODE_TEST_ERROR, NORMAL_RUN, 1L ); assertThat( toString( result ) ) - .isEqualTo( ":maven-surefire-event:" + (char) 10 + ":test-error:" + (char) 10 + ":normal-run:" ); + .isEqualTo( ":maven-surefire-event:" + (char) 10 + ":test-error:" + (char) 10 + + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" ); result = ByteBuffer.allocate( 1024 ); - streamEncoder.encodeHeader( result, BOOTERCODE_CONSOLE_ERROR, null ); + streamEncoder.encodeHeader( result, BOOTERCODE_CONSOLE_ERROR ); streamEncoder.encodeCharset( result ); assertThat( toString( result ) ) .isEqualTo( ":maven-surefire-event:" + (char) 17 + ":console-error-log:" + (char) 5 + ":UTF-8:" ); @@ -196,10 +197,11 @@ public void testEncodedString() { Encoder streamEncoder = new Encoder( new DummyChannel() ); ByteBuffer result = ByteBuffer.allocate( 128 ); - streamEncoder.encode( streamEncoder.newCharsetEncoder(), result, BOOTERCODE_STDOUT, NORMAL_RUN, null, "msg" ); + streamEncoder.encode( streamEncoder.newCharsetEncoder(), result, BOOTERCODE_STDOUT, NORMAL_RUN, 1L, "msg" ); assertThat( toString( result ) ) .isEqualTo( ":maven-surefire-event:\u000e:std-out-stream:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0001:\u0000:\u0000\u0000\u0000\u0003:msg:" ); + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001" + + ":\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:" ); } @Test 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 b3fc7d77ff..b4a234d490 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 @@ -43,7 +43,6 @@ import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicBoolean; -import static java.util.Objects.requireNonNull; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_BYE; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_CONSOLE_DEBUG; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_CONSOLE_ERROR; @@ -65,7 +64,6 @@ import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_SKIPPED; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_STARTING; import static org.apache.maven.surefire.api.booter.ForkedProcessEventType.BOOTERCODE_TEST_SUCCEEDED; -import static org.apache.maven.surefire.api.report.RunMode.NORMAL_RUN; /** * magic number : opcode : run mode [: opcode specific data]* @@ -77,44 +75,19 @@ @SuppressWarnings( "checkstyle:linelength" ) public class EventChannelEncoder extends EventEncoder implements MasterProcessChannelEncoder { - private final RunMode runMode; private final AtomicBoolean trouble = new AtomicBoolean(); private volatile boolean onExit; /** - * The encoder for events and normal test mode. + * The encoder for events. * * @param out the channel available for writing the events */ public EventChannelEncoder( @Nonnull WritableBufferedByteChannel out ) - { - this( out, NORMAL_RUN ); - } - - /** - * The encoder for events and any test mode. - * - * @param out the channel available for writing the events - * @param runMode run mode - */ - public EventChannelEncoder( @Nonnull WritableBufferedByteChannel out, @Nonnull RunMode runMode ) { super( out ); - this.runMode = requireNonNull( runMode ); - } - - /*@Override - public MasterProcessChannelEncoder asRerunMode() // todo apply this and rework providers - { - return new EventChannelEncoder( streamEncoder, RERUN_TEST_AFTER_FAILURE ); } - @Override - public MasterProcessChannelEncoder asNormalMode() - { - return new EventChannelEncoder( streamEncoder, NORMAL_RUN ); - }*/ - @Override public boolean checkError() { @@ -128,7 +101,7 @@ public void onJvmExit() write( ByteBuffer.wrap( new byte[] {'\n'} ), true ); } - private void encodeSystemProperties( Map sysProps, RunMode rm, Long testRunId ) + void encodeSystemProperties( Map sysProps, RunMode runMode, Long testRunId ) { CharsetEncoder encoder = newCharsetEncoder(); ByteBuffer result = null; @@ -139,11 +112,11 @@ private void encodeSystemProperties( Map sysProps, RunMode rm, L String value = entry.getValue(); int bufferLength = - estimateBufferLength( BOOTERCODE_SYSPROPS.getOpcode().length(), runMode, encoder, 0, key, value ); + estimateBufferLength( BOOTERCODE_SYSPROPS.getOpcode().length(), runMode, encoder, 0, 1, key, value ); result = result != null && result.capacity() >= bufferLength ? result : ByteBuffer.allocate( bufferLength ); ( (Buffer) result ).clear(); - // :maven-surefire-event:sys-prop:rerun-test-after-failure:UTF-8::::: - encode( encoder, result, BOOTERCODE_SYSPROPS, runMode, key, value ); + // :maven-surefire-event:sys-prop:::UTF-8::::: + encode( encoder, result, BOOTERCODE_SYSPROPS, runMode, testRunId, key, value ); boolean sync = !it.hasNext(); write( result, sync ); } @@ -152,50 +125,50 @@ private void encodeSystemProperties( Map sysProps, RunMode rm, L @Override public void testSetStarting( TestSetReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TESTSET_STARTING, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TESTSET_STARTING, reportEntry, trimStackTraces, true ); } @Override public void testSetCompleted( TestSetReportEntry reportEntry, boolean trimStackTraces ) { - encodeSystemProperties( reportEntry.getSystemProperties(), null, null ); // todo in next commit - encode( BOOTERCODE_TESTSET_COMPLETED, runMode, reportEntry, trimStackTraces, true ); + encodeSystemProperties( reportEntry.getSystemProperties(), reportEntry.getRunMode(), reportEntry.getTestRunId() ); + encode( BOOTERCODE_TESTSET_COMPLETED, reportEntry, trimStackTraces, true ); } @Override public void testStarting( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_STARTING, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_STARTING, reportEntry, trimStackTraces, true ); } @Override public void testSucceeded( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_SUCCEEDED, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_SUCCEEDED, reportEntry, trimStackTraces, true ); } @Override public void testFailed( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_FAILED, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_FAILED, reportEntry, trimStackTraces, true ); } @Override public void testSkipped( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_SKIPPED, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_SKIPPED, reportEntry, trimStackTraces, true ); } @Override public void testError( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_ERROR, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_ERROR, reportEntry, trimStackTraces, true ); } @Override public void testAssumptionFailure( ReportEntry reportEntry, boolean trimStackTraces ) { - encode( BOOTERCODE_TEST_ASSUMPTIONFAILURE, runMode, reportEntry, trimStackTraces, true ); + encode( BOOTERCODE_TEST_ASSUMPTIONFAILURE, reportEntry, trimStackTraces, true ); } @Override @@ -207,19 +180,19 @@ public void testOutput( TestOutputReportEntry reportEntry ) ForkedProcessEventType event = stdout ? ( newLine ? BOOTERCODE_STDOUT_NEW_LINE : BOOTERCODE_STDOUT ) : ( newLine ? BOOTERCODE_STDERR_NEW_LINE : BOOTERCODE_STDERR ); - setOutErr( event, msg ); /*todo*/ + setOutErr( event, reportEntry.getRunMode(), reportEntry.getTestRunId(), msg ); } - private void setOutErr( ForkedProcessEventType eventType, String message ) + private void setOutErr( ForkedProcessEventType eventType, RunMode runMode, Long testRunId, String message ) { - ByteBuffer result = encodeMessage( eventType, runMode, message ); + ByteBuffer result = encodeMessage( eventType, runMode, testRunId, message ); write( result, false ); } @Override public void consoleInfoLog( String message ) { - ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_INFO, null, message ); + ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_INFO, message ); write( result, true ); } @@ -240,10 +213,10 @@ public void consoleErrorLog( String message, Throwable t ) { CharsetEncoder encoder = newCharsetEncoder(); String stackTrace = t == null ? null : ConsoleLoggerUtils.toString( t ); - int bufferMaxLength = estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcode().length(), null, encoder, 0, + int bufferMaxLength = estimateBufferLength( BOOTERCODE_CONSOLE_ERROR.getOpcode().length(), null, encoder, 0, 0, message, stackTrace ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, BOOTERCODE_CONSOLE_ERROR, null ); + encodeHeader( result, BOOTERCODE_CONSOLE_ERROR ); encodeCharset( result ); encode( encoder, result, message, null, stackTrace ); write( result, true ); @@ -258,14 +231,14 @@ public void consoleErrorLog( StackTraceWriter stackTraceWriter, boolean trimStac @Override public void consoleDebugLog( String message ) { - ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_DEBUG, null, message ); + ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_DEBUG, message ); write( result, true ); } @Override public void consoleWarningLog( String message ) { - ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_WARNING, null, message ); + ByteBuffer result = encodeMessage( BOOTERCODE_CONSOLE_WARNING, message ); write( result, true ); } @@ -298,30 +271,30 @@ private void error( StackTraceWriter stackTraceWriter, boolean trimStackTraces, { CharsetEncoder encoder = newCharsetEncoder(); StackTrace stackTraceWrapper = new StackTrace( stackTraceWriter, trimStackTraces ); - int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), null, encoder, 0, + int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), null, encoder, 0, 0, stackTraceWrapper.message, stackTraceWrapper.smartTrimmedStackTrace, stackTraceWrapper.stackTrace ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, eventType, null ); + encodeHeader( result, eventType ); encodeCharset( result ); encode( encoder, result, stackTraceWrapper ); write( result, sync ); } // example - // :maven-surefire-event:testset-starting:rerun-test-after-failure:UTF-8::SourceName::SourceText::Name::NameText::Group::Message::ElapsedTime::LocalizedMessage::SmartTrimmedStackTrace::toStackTrace( stw, trimStackTraces ):: - private void encode( ForkedProcessEventType operation, RunMode runMode, ReportEntry reportEntry, + // :maven-surefire-event:testset-starting:rerun-test-after-failure:1:5:UTF-8::SourceName::SourceText::Name::NameText::Group::Message::ElapsedTime::LocalizedMessage::SmartTrimmedStackTrace::toStackTrace( stw, trimStackTraces ):: + private void encode( ForkedProcessEventType operation, ReportEntry reportEntry, boolean trimStackTraces, @SuppressWarnings( "SameParameterValue" ) boolean sync ) { - ByteBuffer result = encode( operation, runMode, reportEntry, trimStackTraces ); + ByteBuffer result = encode( operation, reportEntry, trimStackTraces ); write( result, sync ); } private void encodeOpcode( ForkedProcessEventType eventType, boolean sync ) { - int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), null, null, 0 ); + int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), null, null, 0, 0 ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, eventType, null ); + encodeHeader( result, eventType ); write( result, sync ); } @@ -387,21 +360,20 @@ private void encode( CharsetEncoder encoder, ByteBuffer result, *
                                  • {@link ForkedProcessEventType#BOOTERCODE_TEST_ASSUMPTIONFAILURE}.
                                  • * */ - ByteBuffer encode( ForkedProcessEventType operation, RunMode runMode, ReportEntry reportEntry, - boolean trimStackTraces ) + ByteBuffer encode( ForkedProcessEventType operation, ReportEntry reportEntry, boolean trimStackTraces ) { StackTrace stackTraceWrapper = new StackTrace( reportEntry.getStackTraceWriter(), trimStackTraces ); CharsetEncoder encoder = newCharsetEncoder(); - int bufferMaxLength = estimateBufferLength( operation.getOpcode().length(), runMode, encoder, 1, - reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), reportEntry.getNameText(), - reportEntry.getGroup(), reportEntry.getMessage(), stackTraceWrapper.message, + int bufferMaxLength = estimateBufferLength( operation.getOpcode().length(), reportEntry.getRunMode(), encoder, + 1, 1, reportEntry.getSourceName(), reportEntry.getSourceText(), reportEntry.getName(), + reportEntry.getNameText(), reportEntry.getGroup(), reportEntry.getMessage(), stackTraceWrapper.message, stackTraceWrapper.smartTrimmedStackTrace, stackTraceWrapper.stackTrace ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encodeHeader( result, operation, runMode ); + encodeHeader( result, operation, reportEntry.getRunMode(), reportEntry.getTestRunId() ); encodeCharset( result ); encodeString( encoder, result, reportEntry.getSourceName() ); @@ -417,12 +389,22 @@ ByteBuffer encode( ForkedProcessEventType operation, RunMode runMode, ReportEntr return result; } - ByteBuffer encodeMessage( ForkedProcessEventType eventType, RunMode runMode, String message ) + ByteBuffer encodeMessage( ForkedProcessEventType eventType, RunMode runMode, Long testRunId, String message ) + { + CharsetEncoder encoder = newCharsetEncoder(); + int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), runMode, encoder, 0, + testRunId == null ? 0 : 1, message ); + ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); + encode( encoder, result, eventType, runMode, testRunId, message ); + return result; + } + + ByteBuffer encodeMessage( ForkedProcessEventType eventType, String message ) { CharsetEncoder encoder = newCharsetEncoder(); - int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), runMode, encoder, 0, message ); + int bufferMaxLength = estimateBufferLength( eventType.getOpcode().length(), null, encoder, 0, 0, message ); ByteBuffer result = ByteBuffer.allocate( bufferMaxLength ); - encode( encoder, result, eventType, runMode, message ); + encode( encoder, result, eventType, message ); return result; } diff --git a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/stream/CommandDecoder.java b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/stream/CommandDecoder.java index 76148b07e7..4a7e257f71 100644 --- a/surefire-booter/src/main/java/org/apache/maven/surefire/booter/stream/CommandDecoder.java +++ b/surefire-booter/src/main/java/org/apache/maven/surefire/booter/stream/CommandDecoder.java @@ -23,7 +23,6 @@ import org.apache.maven.surefire.api.booter.MasterProcessCommand; import org.apache.maven.surefire.api.booter.Shutdown; import org.apache.maven.surefire.api.fork.ForkNodeArguments; -import org.apache.maven.surefire.api.report.RunMode; import org.apache.maven.surefire.api.stream.AbstractStreamDecoder; import org.apache.maven.surefire.api.stream.MalformedChannelException; import org.apache.maven.surefire.api.stream.SegmentType; @@ -46,10 +45,8 @@ import static org.apache.maven.surefire.api.booter.Command.toShutdown; import static org.apache.maven.surefire.api.booter.Constants.MAGIC_NUMBER_FOR_COMMANDS_BYTES; import static org.apache.maven.surefire.api.booter.MasterProcessCommand.COMMAND_TYPES; -import static org.apache.maven.surefire.api.report.RunMode.RUN_MODES; import static org.apache.maven.surefire.api.stream.SegmentType.DATA_STRING; import static org.apache.maven.surefire.api.stream.SegmentType.END_OF_FRAME; -import static org.apache.maven.surefire.api.stream.SegmentType.RUN_MODE; import static org.apache.maven.surefire.api.stream.SegmentType.STRING_ENCODING; import static org.apache.maven.surefire.shared.utils.cli.ShutdownHookUtils.addShutDownHook; @@ -65,13 +62,6 @@ public class CommandDecoder extends AbstractStreamDecoder> 24 ) ) diff --git a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/CommandChannelDecoderTest.java b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/CommandChannelDecoderTest.java index 7307460e7d..d6c67761de 100644 --- a/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/CommandChannelDecoderTest.java +++ b/surefire-booter/src/test/java/org/apache/maven/surefire/booter/spi/CommandChannelDecoderTest.java @@ -89,8 +89,6 @@ public void testDecoderRunClass() throws IOException .append( ":maven-surefire-command:" ) .append( (char) 13 ) .append( ":run-testclass:" ) - .append( (char) 10 ) - .append( ":normal-run:" ) .append( (char) 5 ) .append( ":UTF-8:" ) .append( (char) 0 ) @@ -312,6 +310,7 @@ public void shouldSkipCorruptedCommand() throws IOException public void testBinaryCommandStream() throws Exception { InputStream commands = getClass().getResourceAsStream( "/binary-commands/75171711-encoder.bin" ); + assertThat( commands ).isNotNull(); ConsoleLoggerMock logger = new ConsoleLoggerMock( true, true, true, true ); ForkNodeArguments args = new ForkNodeArgumentsMock( logger, new File( "" ) ); CommandChannelDecoder decoder = new CommandChannelDecoder( newChannel( commands ), args ); 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 15965e4209..5b28d3a13a 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 @@ -25,6 +25,7 @@ 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.ObjectUtils; import org.apache.maven.surefire.api.util.internal.WritableBufferedByteChannel; import org.junit.Test; @@ -78,6 +79,8 @@ public void reportEntry() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -88,13 +91,15 @@ public void reportEntry() throws IOException Stream out = Stream.newStream(); EventChannelEncoder encoder = new EventChannelEncoder( newBufferedChannel( out ) ); - ByteBuffer encoded = encoder.encode( BOOTERCODE_TEST_ERROR, NORMAL_RUN, reportEntry, false ); + ByteBuffer encoded = encoder.encode( BOOTERCODE_TEST_ERROR, reportEntry, false ); ByteArrayOutputStream expectedFrame = new ByteArrayOutputStream(); expectedFrame.write( ":maven-surefire-event:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":test-error:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -143,13 +148,15 @@ public void reportEntry() throws IOException out = Stream.newStream(); encoder = new EventChannelEncoder( newBufferedChannel( out ) ); - encoded = encoder.encode( BOOTERCODE_TEST_ERROR, NORMAL_RUN, reportEntry, true ); + encoded = encoder.encode( BOOTERCODE_TEST_ERROR, reportEntry, true ); expectedFrame = new ByteArrayOutputStream(); expectedFrame.write( ":maven-surefire-event:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":test-error:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -205,6 +212,8 @@ public void reportEntry() throws IOException expectedFrame.write( ":testset-starting:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -259,6 +268,8 @@ public void reportEntry() throws IOException expectedFrame.write( ":testset-starting:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -322,6 +333,8 @@ public void testSetCompleted() throws IOException Map props = systemProps(); TestSetReportEntry reportEntry = mock( TestSetReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -344,6 +357,8 @@ public void testSetCompleted() throws IOException expectedFrame.write( ":sys-prop:".getBytes() ); expectedFrame.write( 10 ); expectedFrame.write( ":normal-run:".getBytes() ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ":".getBytes() ); expectedFrame.write( 5 ); expectedFrame.write( ":UTF-8:".getBytes() ); int[] k = toBytes( entry.getKey().length() ); @@ -369,6 +384,8 @@ public void testSetCompleted() throws IOException expectedFrame.write( ":testset-completed:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -431,6 +448,8 @@ public void testStarting() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -450,6 +469,8 @@ public void testStarting() throws IOException expectedFrame.write( ":test-starting:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -511,6 +532,8 @@ public void testSuccess() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -529,6 +552,8 @@ public void testSuccess() throws IOException expectedFrame.write( ":test-succeeded:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -590,6 +615,8 @@ public void testFailed() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -608,6 +635,8 @@ public void testFailed() throws IOException expectedFrame.write( ":test-failed:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -668,6 +697,8 @@ public void testSkipped() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -686,6 +717,8 @@ public void testSkipped() throws IOException expectedFrame.write( ":test-skipped:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -746,6 +779,8 @@ public void testError() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( stackTrace ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( ELAPSED_TIME ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -763,6 +798,8 @@ public void testError() throws IOException expectedFrame.write( ":test-error:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -823,6 +860,8 @@ public void testAssumptionFailure() throws IOException when( stackTraceWriter.writeTraceToString() ).thenReturn( null ); ReportEntry reportEntry = mock( ReportEntry.class ); + when( reportEntry.getRunMode() ).thenReturn( NORMAL_RUN ); + when( reportEntry.getTestRunId() ).thenReturn( 1L ); when( reportEntry.getElapsed() ).thenReturn( null ); when( reportEntry.getGroup() ).thenReturn( "this group" ); when( reportEntry.getMessage() ).thenReturn( "skipped test" ); @@ -841,6 +880,8 @@ public void testAssumptionFailure() throws IOException expectedFrame.write( ":test-assumption-failure:".getBytes( UTF_8 ) ); expectedFrame.write( (byte) 10 ); expectedFrame.write( ":normal-run:".getBytes( UTF_8 ) ); + expectedFrame.write( "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001".getBytes() ); + expectedFrame.write( ':' ); expectedFrame.write( (byte) 5 ); expectedFrame.write( ":UTF-8:".getBytes( UTF_8 ) ); expectedFrame.write( new byte[] {0, 0, 0, 10} ); @@ -929,21 +970,26 @@ public void testAcquireNextTest() public void testSendOpcode() { Channel channel = new Channel(); - new EventChannelEncoder( channel ).testOutput( (TestOutputReportEntry) stdOut( "msg" ) ); + new EventChannelEncoder( channel ) + .testOutput( new TestOutputReportEntry( stdOut( "msg" ), NORMAL_RUN, 1L ) ); assertThat( toString( channel.src ) ) .isEqualTo( ":maven-surefire-event:" + (char) 14 + ":std-out-stream:" + (char) 10 + ":normal-run:" + + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + (char) 5 + ":UTF-8:\u0000\u0000\u0000\u0003:msg:" ); channel = new Channel(); - new EventChannelEncoder( channel ).testOutput( stdErr( null ) ); + new EventChannelEncoder( channel ) + .testOutput( new TestOutputReportEntry( stdErr( null ), NORMAL_RUN, 1L ) ); assertThat( toString( channel.src ) ) .isEqualTo( ":maven-surefire-event:" + (char) 14 + ":std-err-stream:" + (char) 10 + ":normal-run:" + + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + (char) 5 + ":UTF-8:\u0000\u0000\u0000\u0001:\u0000:" ); ByteBuffer result = new EventChannelEncoder( new Channel() ) - .encodeMessage( BOOTERCODE_TEST_ERROR, NORMAL_RUN, "msg" ); + .encodeMessage( BOOTERCODE_TEST_ERROR, NORMAL_RUN, 1L, "msg" ); assertThat( toString( result ) ) .isEqualTo( ":maven-surefire-event:" + (char) 10 + ":test-error:" + (char) 10 + ":normal-run:" + + "\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + (char) 5 + ":UTF-8:\u0000\u0000\u0000\u0003:msg:" ); } @@ -1115,11 +1161,12 @@ public void testStdOutStream() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.testOutput( (TestOutputReportEntry) stdOut( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOut( "msg" ), NORMAL_RUN, 1L ) ); channel.close(); String expected = ":maven-surefire-event:\u000e:std-out-stream:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; assertThat( new String( out.toByteArray(), UTF_8 ) ) .isEqualTo( expected ); @@ -1132,11 +1179,12 @@ public void testStdOutStreamLn() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.testOutput( stdOutln( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOutln( "msg" ), NORMAL_RUN, 1L ) ); channel.close(); String expected = ":maven-surefire-event:\u0017:std-out-stream-new-line:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; assertThat( new String( out.toByteArray(), UTF_8 ) ) .isEqualTo( expected ); @@ -1149,11 +1197,12 @@ public void testStdErrStream() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.testOutput( stdErr( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdErr( "msg" ), NORMAL_RUN, 1L ) ); channel.close(); String expected = ":maven-surefire-event:\u000e:std-err-stream:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; assertThat( new String( out.toByteArray(), UTF_8 ) ) .isEqualTo( expected ); @@ -1166,16 +1215,52 @@ public void testStdErrStreamLn() throws IOException WritableBufferedByteChannel channel = newBufferedChannel( out ); EventChannelEncoder encoder = new EventChannelEncoder( channel ); - encoder.testOutput( stdErrln( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdErrln( "msg" ), NORMAL_RUN, 1L ) ); channel.close(); String expected = ":maven-surefire-event:\u0017:std-err-stream-new-line:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001:" + + "\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:"; assertThat( new String( out.toByteArray(), UTF_8 ) ) .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.encodeSystemProperties( 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() { @@ -1220,7 +1305,7 @@ public void testInterruptHandling() throws IOException Thread.currentThread().interrupt(); try { - encoder.testOutput( (TestOutputReportEntry) stdOut( "msg" ) ); + encoder.testOutput( new TestOutputReportEntry( stdOut( "msg" ), NORMAL_RUN, 2L ) ); channel.close(); } finally @@ -1232,7 +1317,8 @@ public void testInterruptHandling() throws IOException assertThat( new String( out.toByteArray(), UTF_8 ) ) .isEqualTo( ":maven-surefire-event:\u000e:std-out-stream:" - + (char) 10 + ":normal-run:\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:" ); + + (char) 10 + ":normal-run:\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002" + + ":\u0005:UTF-8:\u0000\u0000\u0000\u0003:msg:" ); } private static class Stream extends PrintStream diff --git a/surefire-booter/src/test/resources/binary-commands/75171711-encoder.bin b/surefire-booter/src/test/resources/binary-commands/75171711-encoder.bin index bbc337bede381d7d967eda94195acd98b9b14643..0a4ce71f7a6f8dd1a94ae5873ddef9d47e710c17 100644 GIT binary patch delta 10 Rcmcc2c8qO;`^J#}OaK{M1cLwo delta 22 dcmX@ccA0I0I}evtUVc$-VvcT6Y2HFNW&m3B2f_dV 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 2b124c6473..92385e5fcd 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 @@ -123,6 +123,7 @@ public RunResult invoke( Object forkTestSet ) try { RunListenerAdapter adapter = new RunListenerAdapter( reporterFactory.createTestReportListener() ); + adapter.setRunMode( NORMAL_RUN ); startCapture( adapter ); setupJunitLogger(); if ( forkTestSet instanceof TestsToRun ) @@ -169,7 +170,6 @@ private TestsToRun scanClasspath() private void invokeAllTests( TestsToRun testsToRun, RunListenerAdapter adapter ) { - adapter.setRunMode( NORMAL_RUN ); try { execute( testsToRun, adapter ); 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 d4a57a9bf4..5c38caa70d 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 @@ -130,6 +130,7 @@ public RunResult invoke( Object forkTestSet ) { TestReportListener reporter = reporterFactory.createTestReportListener(); JUnit4RunListener listener = new JUnit4RunListener( reporter ); + listener.setRunMode( NORMAL_RUN ); startCapture( listener ); // startCapture() called in prior to setTestsToRun() @@ -280,7 +281,6 @@ private void executeWithRerun( Class clazz, Notifier notifier, RunModeSetter try { notifier.asFailFast( isFailFast() ); - runMode.setRunMode( NORMAL_RUN ); execute( clazz, notifier, hasMethodFilter ? createMethodFilter() : null ); } finally