You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2019/04/24 01:57:51 UTC

[maven-surefire] branch 1546-1222 updated (e9bdb39 -> 767deae)

This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a change to branch 1546-1222
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git.


    from e9bdb39  improved method concatenateWithTestGroup() from dotted group
     new 6a28467  extension StatelessTestsetInfoReporter for console/file reporter
     new 767deae  implemented extension StatelessTestsetInfoReporter

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../plugin/surefire/AbstractSurefireMojo.java      |  26 +++-
 .../maven/plugin/surefire/CommonReflector.java     |  22 +++-
 .../surefire/StartupReportConfiguration.java       |  78 ++++++++---
 .../output/ThreadedStreamConsumer.java             |   2 +-
 .../extensions/DefaultConsoleOutputReporter.java   |  81 ++++++++++++
 .../DefaultStatelessReportMojoConfiguration.java   |   4 +-
 .../extensions/DefaultStatelessReporter.java       |   6 +-
 .../DefaultStatelessTestsetInfoReporter.java       |  82 ++++++++++++
 .../extensions/JUnit5ConsoleOutputReporter.java    | 104 +++++++++++++++
 .../JUnit5StatelessTestsetInfoReporter.java        | 144 +++++++++++++++++++++
 .../extensions/JUnit5Xml30StatelessReporter.java   |  17 ++-
 .../extensions/StatelessReporterEvent.java         |  58 ---------
 .../surefire/report/ConsoleOutputFileReporter.java |  23 ++--
 .../plugin/surefire/report/ConsoleReporter.java    |  43 +++---
 .../surefire/report/DefaultReporterFactory.java    |  32 ++---
 .../surefire/report/DirectConsoleOutput.java       |   6 +-
 .../maven/plugin/surefire/report/FileReporter.java |  33 +++--
 .../report/NullConsoleOutputReceiver.java}         |  33 +++--
 .../surefire/report/NullConsoleReporter.java       |   6 +-
 .../plugin/surefire/report/NullFileReporter.java   |   2 +-
 .../surefire/report/StatelessXmlReporter.java      |   8 +-
 .../plugin/surefire/report/TestSetRunListener.java |  23 ++--
 .../maven/plugin/surefire/report/TestSetStats.java |  37 ++++--
 .../report/TestcycleConsoleOutputReceiver.java     |   9 +-
 .../plugin/surefire/report/WrappedReportEntry.java |  11 +-
 .../booterclient/TestSetMockReporterFactory.java   |   5 +-
 .../report/DefaultReporterFactoryTest.java         |   5 +-
 .../report/ConsoleOutputFileReporterTest.java      |  16 ++-
 .../maven/surefire/report/FileReporterTest.java    |   4 +-
 .../surefire/report/CategorizedReportEntry.java    |  10 +-
 .../apache/maven/surefire/report/ReportEntry.java  |   7 +
 .../maven/surefire/report/SimpleReportEntry.java   |   6 +
 surefire-extensions-api/pom.xml                    |   1 +
 .../ConsoleOutputReportEventListener.java          |  16 ++-
 ...essReporter.java => ConsoleOutputReporter.java} |  42 +++---
 .../extensions/StatelessReportEventListener.java   |  21 ++-
 .../StatelessReportMojoConfiguration.java          |   2 +-
 .../surefire/extensions/StatelessReporter.java     |  23 ++--
 ...elessTestsetInfoConsoleReportEventListener.java |  53 ++++++++
 ...atelessTestsetInfoFileReportEventListener.java} |  52 ++++----
 ...rter.java => StatelessTestsetInfoReporter.java} |  49 +++----
 surefire-its/pom.xml                               |   7 -
 .../maven/surefire/its/JUnitPlatformEnginesIT.java |   5 +-
 .../apache/maven/surefire/its/JUnitPlatformIT.java |  19 ++-
 .../junit-platform-engine-jupiter/pom.xml          |  14 ++
 .../maven/surefire/junitcore/JUnitCoreTester.java  |   5 +-
 46 files changed, 906 insertions(+), 346 deletions(-)
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultConsoleOutputReporter.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5ConsoleOutputReporter.java
 create mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
 delete mode 100644 maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/StatelessReporterEvent.java
 copy maven-surefire-common/src/{test/java/org/apache/maven/plugin/surefire/booterclient/MockNotifiableTestStream.java => main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java} (61%)
 copy maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ForkedProcessReportEventListener.java => surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java (65%)
 copy surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/{StatelessReporter.java => ConsoleOutputReporter.java} (58%)
 create mode 100644 surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoConsoleReportEventListener.java
 copy surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/{StatelessReportMojoConfiguration.java => StatelessTestsetInfoFileReportEventListener.java} (50%)
 copy surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/{StatelessReporter.java => StatelessTestsetInfoReporter.java} (52%)


[maven-surefire] 01/02: extension StatelessTestsetInfoReporter for console/file reporter

Posted by ti...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch 1546-1222
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit 6a28467678e4b00e1fbd6971d55f9e97acd244b9
Author: tibordigana <ti...@apache.org>
AuthorDate: Sat Apr 20 16:58:52 2019 +0200

    extension StatelessTestsetInfoReporter for console/file reporter
---
 .../plugin/surefire/AbstractSurefireMojo.java      |  16 +++-
 .../maven/plugin/surefire/CommonReflector.java     |   9 +-
 .../surefire/StartupReportConfiguration.java       |  47 ++++++----
 .../output/ThreadedStreamConsumer.java             |   2 +-
 .../extensions/DefaultConsoleOutputReporter.java   |  81 ++++++++++++++++
 .../DefaultStatelessReportMojoConfiguration.java   |   4 +-
 .../extensions/DefaultStatelessReporter.java       |   6 +-
 .../DefaultStatelessTestsetInfoReporter.java       |  82 ++++++++++++++++
 .../extensions/JUnit5ConsoleOutputReporter.java    | 104 +++++++++++++++++++++
 .../JUnit5StatelessTestsetInfoReporter.java        | 104 +++++++++++++++++++++
 .../extensions/JUnit5Xml30StatelessReporter.java   |  17 +++-
 .../extensions/StatelessReporterEvent.java         |  58 ------------
 .../surefire/report/ConsoleOutputFileReporter.java |  23 +++--
 .../plugin/surefire/report/ConsoleReporter.java    |  30 +++---
 .../surefire/report/DefaultReporterFactory.java    |  12 ++-
 .../surefire/report/DirectConsoleOutput.java       |   6 +-
 .../maven/plugin/surefire/report/FileReporter.java |  25 ++---
 ...eporter.java => NullConsoleOutputReceiver.java} |  35 ++++---
 .../surefire/report/NullConsoleReporter.java       |   4 +-
 .../plugin/surefire/report/NullFileReporter.java   |   2 +-
 .../surefire/report/StatelessXmlReporter.java      |   8 +-
 .../plugin/surefire/report/TestSetRunListener.java |  12 +--
 .../report/TestcycleConsoleOutputReceiver.java     |   9 +-
 .../booterclient/TestSetMockReporterFactory.java   |   3 +-
 .../report/DefaultReporterFactoryTest.java         |   3 +-
 .../report/ConsoleOutputFileReporterTest.java      |  16 ++--
 .../maven/surefire/report/FileReporterTest.java    |   4 +-
 surefire-extensions-api/pom.xml                    |   1 +
 .../ConsoleOutputReportEventListener.java          |  21 +++--
 ...essReporter.java => ConsoleOutputReporter.java} |  42 ++++-----
 .../extensions/StatelessReportEventListener.java   |  21 ++---
 .../StatelessReportMojoConfiguration.java          |   2 +-
 .../surefire/extensions/StatelessReporter.java     |  23 +++--
 ...elessTestsetInfoConsoleReportEventListener.java |  53 +++++++++++
 ...atelessTestsetInfoFileReportEventListener.java} |  52 +++++------
 ...rter.java => StatelessTestsetInfoReporter.java} |  49 +++-------
 surefire-its/pom.xml                               |  11 +--
 .../maven/surefire/its/JUnitPlatformEnginesIT.java |   5 +-
 .../junit-platform-engine-jupiter/pom.xml          |   1 +
 .../maven/surefire/junitcore/JUnitCoreTester.java  |   3 +-
 40 files changed, 700 insertions(+), 306 deletions(-)

diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
index 0ebcce8..5dc9288 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
@@ -25,9 +25,11 @@ import org.apache.maven.artifact.DefaultArtifact;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.model.Dependency;
+import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReportMojoConfiguration;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
-import org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
+import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.project.ProjectBuildingRequest;
 import org.apache.maven.repository.RepositorySystem;
@@ -72,6 +74,7 @@ import org.apache.maven.surefire.booter.StartupConfiguration;
 import org.apache.maven.surefire.booter.SurefireBooterForkException;
 import org.apache.maven.surefire.booter.SurefireExecutionException;
 import org.apache.maven.surefire.cli.CommandLineOption;
+import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReporter;
 import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.ReporterConfiguration;
@@ -163,8 +166,9 @@ public abstract class AbstractSurefireMojo
     /**
      * Note: use the legacy system property <em>disableXmlReport</em> set to {@code true} to disable the report.
      */
-    @Parameter
-    private StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration> statelessReporter;
+
+    @Parameter private
+    StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> statelessReporter;
 
     /**
      * Information about this plugin, mainly used to lookup this plugin's configuration from the currently executing
@@ -1946,19 +1950,21 @@ public abstract class AbstractSurefireMojo
 
     private StartupReportConfiguration getStartupReportConfiguration( String configChecksum, boolean isForkMode )
     {
-        StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration> xmlReporter =
+        StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> xmlReporter =
                 statelessReporter == null
                         ? new DefaultStatelessReporter( /*todo call def. constr.*/ isDisableXmlReport(), "3.0" )
                         : statelessReporter;
 
         xmlReporter.setDisable( isDisableXmlReport() ); // todo change to Boolean in the version 3.0.0-M6
 
+        ConsoleOutputReporter consoleOutputReporter = new DefaultConsoleOutputReporter();
+
         return new StartupReportConfiguration( isUseFile(), isPrintSummary(), getReportFormat(),
                                                isRedirectTestOutputToFile(),
                                                getReportsDirectory(), isTrimStackTrace(), getReportNameSuffix(),
                                                getStatisticsFile( configChecksum ), requiresRunHistory(),
                                                getRerunFailingTestsCount(), getReportSchemaLocation(), getEncoding(),
-                                               isForkMode, xmlReporter );
+                                               isForkMode, xmlReporter, consoleOutputReporter );
     }
 
     private boolean isSpecificTestSpecified()
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
index 39d128a..8d00125 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
@@ -22,6 +22,7 @@ package org.apache.maven.plugin.surefire;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.surefire.booter.SurefireReflector;
+import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReporter;
 import org.apache.maven.surefire.util.SurefireReflectionException;
 
@@ -41,6 +42,7 @@ public class CommonReflector
     private final Class<?> startupReportConfiguration;
     private final Class<?> consoleLogger;
     private final Class<?> statelessReporter;
+    private final Class<?> consoleOutputReporter;
     private final ClassLoader surefireClassLoader;
 
     public CommonReflector( @Nonnull ClassLoader surefireClassLoader )
@@ -52,6 +54,7 @@ public class CommonReflector
             startupReportConfiguration = surefireClassLoader.loadClass( StartupReportConfiguration.class.getName() );
             consoleLogger = surefireClassLoader.loadClass( ConsoleLogger.class.getName() );
             statelessReporter = surefireClassLoader.loadClass( StatelessReporter.class.getName() );
+            consoleOutputReporter = surefireClassLoader.loadClass( ConsoleOutputReporter.class.getName() );
         }
         catch ( ClassNotFoundException e )
         {
@@ -75,7 +78,7 @@ public class CommonReflector
                                                            String.class, boolean.class, File.class,
                                                            boolean.class, String.class, File.class, boolean.class,
                                                            int.class, String.class, String.class, boolean.class,
-                                                           statelessReporter );
+                                                           statelessReporter, consoleOutputReporter );
         //noinspection BooleanConstructorCall
         Object[] params = { reporterConfiguration.isUseFile(), reporterConfiguration.isPrintSummary(),
             reporterConfiguration.getReportFormat(), reporterConfiguration.isRedirectTestOutputToFile(),
@@ -84,7 +87,9 @@ public class CommonReflector
             reporterConfiguration.getStatisticsFile(), reporterConfiguration.isRequiresRunHistory(),
             reporterConfiguration.getRerunFailingTestsCount(), reporterConfiguration.getXsdSchemaLocation(),
             reporterConfiguration.getEncoding().name(), reporterConfiguration.isForkMode(),
-            reporterConfiguration.getXmlReporter().clone( surefireClassLoader ) };
+            reporterConfiguration.getXmlReporter().clone( surefireClassLoader ),
+            reporterConfiguration.getConsoleOutputReporter().clone( surefireClassLoader )
+        };
         return newInstance( constructor, params );
     }
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
index 2c4d302..9bfbd12 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
@@ -20,13 +20,12 @@ package org.apache.maven.plugin.surefire;
  */
 
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReportMojoConfiguration;
-import org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent;
-import org.apache.maven.plugin.surefire.report.ConsoleOutputFileReporter;
-import org.apache.maven.plugin.surefire.report.DirectConsoleOutput;
 import org.apache.maven.plugin.surefire.report.FileReporter;
-import org.apache.maven.plugin.surefire.report.TestcycleConsoleOutputReceiver;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
 import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
+import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReporter;
 
@@ -84,17 +83,21 @@ public final class StartupReportConfiguration
 
     private final boolean isForkMode;
 
-    private final StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration> xmlReporter;
+    private final
+    StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> xmlReporter;
+
+    private final ConsoleOutputReporter consoleOutputReporter;
 
     private StatisticsReporter statisticsReporter;
 
     @SuppressWarnings( "checkstyle:parameternumber" )
     public StartupReportConfiguration( boolean useFile, boolean printSummary, String reportFormat,
-                   boolean redirectTestOutputToFile,
-                   @Nonnull File reportsDirectory, boolean trimStackTrace, String reportNameSuffix,
-                   File statisticsFile, boolean requiresRunHistory, int rerunFailingTestsCount,
-                   String xsdSchemaLocation, String encoding, boolean isForkMode,
-                   StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration> xmlReporter )
+               boolean redirectTestOutputToFile,
+               @Nonnull File reportsDirectory, boolean trimStackTrace, String reportNameSuffix,
+               File statisticsFile, boolean requiresRunHistory, int rerunFailingTestsCount,
+               String xsdSchemaLocation, String encoding, boolean isForkMode,
+               StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> xmlReporter,
+               ConsoleOutputReporter consoleOutputReporter )
     {
         this.useFile = useFile;
         this.printSummary = printSummary;
@@ -113,6 +116,7 @@ public final class StartupReportConfiguration
         this.encoding = charset == null ? UTF_8 : Charset.forName( charset );
         this.isForkMode = isForkMode;
         this.xmlReporter = xmlReporter;
+        this.consoleOutputReporter = consoleOutputReporter;
     }
 
     public boolean isUseFile()
@@ -155,7 +159,8 @@ public final class StartupReportConfiguration
         return rerunFailingTestsCount;
     }
 
-    public StatelessReportEventListener<StatelessReporterEvent> instantiateStatelessXmlReporter( Integer forkNumber )
+    public StatelessReportEventListener<WrappedReportEntry, TestSetStats> instantiateStatelessXmlReporter(
+            Integer forkNumber )
     {
         assert ( forkNumber == null ) == !isForkMode;
 
@@ -172,13 +177,13 @@ public final class StartupReportConfiguration
                 new DefaultStatelessReportMojoConfiguration( resolveReportsDirectory( forkNumber ), reportNameSuffix,
                         trimStackTrace, rerunFailingTestsCount, xsdSchemaLocation, testClassMethodRunHistory );
 
-        return isDisableXmlReport() ? null : xmlReporter.createStatelessReportEventListener( xmlReporterConfig );
+        return isDisableXmlReport() ? null : xmlReporter.createListener( xmlReporterConfig );
     }
 
     public FileReporter instantiateFileReporter( Integer forkNumber )
     {
         return isUseFile() && isBriefOrPlainFormat()
-            ? new FileReporter( resolveReportsDirectory( forkNumber ), reportNameSuffix, encoding )
+            ? new FileReporter( resolveReportsDirectory( forkNumber ), reportNameSuffix, encoding, false )
             : null;
     }
 
@@ -188,11 +193,12 @@ public final class StartupReportConfiguration
         return BRIEF.equals( fmt ) || PLAIN.equals( fmt );
     }
 
-    public TestcycleConsoleOutputReceiver instantiateConsoleOutputFileReporter( Integer forkNumber )
+    public ConsoleOutputReportEventListener instantiateConsoleOutputFileReporter( Integer forkNum )
     {
-        return isRedirectTestOutputToFile()
-            ? new ConsoleOutputFileReporter( resolveReportsDirectory( forkNumber ), reportNameSuffix, forkNumber )
-            : new DirectConsoleOutput( originalSystemOut, originalSystemErr );
+        ConsoleOutputReportEventListener outputReport = isRedirectTestOutputToFile()
+                ? consoleOutputReporter.createListener( resolveReportsDirectory( forkNum ), reportNameSuffix, forkNum )
+                : consoleOutputReporter.createListener( originalSystemOut, originalSystemErr );
+        return consoleOutputReporter.isDisable() ? null : outputReport;
     }
 
     public synchronized StatisticsReporter getStatisticsReporter()
@@ -244,8 +250,13 @@ public final class StartupReportConfiguration
         return forkNumber == null ? reportsDirectory : replaceForkThreadsInPath( reportsDirectory, forkNumber );
     }
 
-    public StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration> getXmlReporter()
+    public StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> getXmlReporter()
     {
         return xmlReporter;
     }
+
+    public ConsoleOutputReporter getConsoleOutputReporter()
+    {
+        return consoleOutputReporter;
+    }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
index dad88fd..388f16d 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/booterclient/output/ThreadedStreamConsumer.java
@@ -40,7 +40,7 @@ public final class ThreadedStreamConsumer
 {
     private static final String END_ITEM = "";
 
-    private static final int ITEM_LIMIT_BEFORE_SLEEP = 10 * 1000;
+    private static final int ITEM_LIMIT_BEFORE_SLEEP = 10_000;
 
     private final BlockingQueue<String> items = new ArrayBlockingQueue<>( ITEM_LIMIT_BEFORE_SLEEP );
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultConsoleOutputReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultConsoleOutputReporter.java
new file mode 100644
index 0000000..77bfecc
--- /dev/null
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultConsoleOutputReporter.java
@@ -0,0 +1,81 @@
+package org.apache.maven.plugin.surefire.extensions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.surefire.report.ConsoleOutputFileReporter;
+import org.apache.maven.plugin.surefire.report.DirectConsoleOutput;
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
+import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
+
+import java.io.File;
+import java.io.PrintStream;
+
+/**
+ * Extension for logger.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ */
+public class DefaultConsoleOutputReporter
+        extends ConsoleOutputReporter
+{
+    @Override
+    public ConsoleOutputReportEventListener createListener( File reportsDirectory, String reportNameSuffix,
+                                                            Integer forkNumber )
+    {
+        return new ConsoleOutputFileReporter( reportsDirectory, reportNameSuffix, false, forkNumber, getEncoding() );
+    }
+
+    @Override
+    public ConsoleOutputReportEventListener createListener( PrintStream out, PrintStream err )
+    {
+        return new DirectConsoleOutput( out, err );
+    }
+
+    @Override
+    public Object clone( ClassLoader target )
+    {
+        try
+        {
+            Class<?> cls = target.loadClass( getClass().getName() );
+            Object clone = cls.newInstance();
+
+            cls.getMethod( "setDisable", boolean.class )
+                    .invoke( clone, isDisable() );
+            cls.getMethod( "setEncoding", String.class )
+                    .invoke( clone, getEncoding() );
+
+            return clone;
+        }
+        catch ( ReflectiveOperationException e )
+        {
+            throw new IllegalStateException( e.getLocalizedMessage() );
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return "DefaultConsoleOutputReporter{"
+                + "disable=" + isDisable()
+                + ", encoding=" + getEncoding()
+                + '}';
+    }
+}
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReportMojoConfiguration.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReportMojoConfiguration.java
index b223deb..0eb6b52 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReportMojoConfiguration.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReportMojoConfiguration.java
@@ -30,8 +30,8 @@ import java.util.Map;
  * Why Deprecated: The field {@code testClassMethodRunHistory} makes
  * {@link org.apache.maven.plugin.surefire.report.StatelessXmlReporter} stateful and overloads reporter by permanently
  * overriding XML using re-run feature. To fix this issue, the providers should use more events for re-run feature and
- * events bounding provider's execution. After provider's execution is finished, this reporter should be announced with
- * {@link StatelessReporterEvent event} only once per test class. All test report entries should be cached in
+ * events bounding provider's execution. After provider's execution is finished, this reporter should be announced
+ * only once per test class. All test report entries should be cached in
  * {@link org.apache.maven.plugin.surefire.report.TestSetRunListener} keeping it already stateful.
  */
 @Deprecated
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReporter.java
index a292e66..e52fa5a 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessReporter.java
@@ -20,6 +20,8 @@ package org.apache.maven.plugin.surefire.extensions;
  */
 
 import org.apache.maven.plugin.surefire.report.StatelessXmlReporter;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
+import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReporter;
 
@@ -30,7 +32,7 @@ import org.apache.maven.surefire.extensions.StatelessReporter;
  * @since 3.0.0-M4
  */
 public class DefaultStatelessReporter
-        extends StatelessReporter<StatelessReporterEvent, DefaultStatelessReportMojoConfiguration>
+        extends StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration>
 {
     /**
      * Activated in the injection point of MOJO.
@@ -52,7 +54,7 @@ public class DefaultStatelessReporter
     }
 
     @Override
-    public StatelessReportEventListener<StatelessReporterEvent> createStatelessReportEventListener(
+    public StatelessReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             DefaultStatelessReportMojoConfiguration configuration )
     {
         return new StatelessXmlReporter( configuration.getReportsDirectory(),
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
new file mode 100644
index 0000000..2f57966
--- /dev/null
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
@@ -0,0 +1,82 @@
+package org.apache.maven.plugin.surefire.extensions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.report.ConsoleReporter;
+import org.apache.maven.plugin.surefire.report.FileReporter;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
+import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoReporter;
+
+import java.io.File;
+import java.nio.charset.Charset;
+
+/**
+ * Extension listener for stateless file and console reporter of test-set.
+ * Signatures can be changed between major, minor versions or milestones.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ */
+public class DefaultStatelessTestsetInfoReporter
+        extends StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats>
+{
+    @Override
+    public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createListener(
+            ConsoleLogger logger )
+    {
+        return new ConsoleReporter( logger );
+    }
+
+    @Override
+    public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> createListener(
+            File reportsDirectory, String reportNameSuffix, Charset encoding )
+    {
+        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, false );
+    }
+
+    @Override
+    public Object clone( ClassLoader target )
+    {
+        try
+        {
+            Class<?> cls = target.loadClass( getClass().getName() );
+            Object clone = cls.newInstance();
+
+            cls.getMethod( "setDisable", boolean.class )
+                    .invoke( clone, isDisable() );
+
+            return clone;
+        }
+        catch ( ReflectiveOperationException e )
+        {
+            throw new IllegalStateException( e.getLocalizedMessage() );
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return "DefaultStatelessTestsetInfoReporter{disable=" + isDisable() + "}";
+    }
+}
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5ConsoleOutputReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5ConsoleOutputReporter.java
new file mode 100644
index 0000000..af13c38
--- /dev/null
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5ConsoleOutputReporter.java
@@ -0,0 +1,104 @@
+package org.apache.maven.plugin.surefire.extensions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.surefire.report.ConsoleOutputFileReporter;
+import org.apache.maven.plugin.surefire.report.DirectConsoleOutput;
+import org.apache.maven.plugin.surefire.report.StatelessXmlReporter;
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
+import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
+
+import java.io.File;
+import java.io.PrintStream;
+
+/**
+ * The extension of {@link StatelessXmlReporter logger} for JUnit5.
+ * Selectively enables report files upon JUnit5 annotation <em>DisplayName</em>.
+ *
+ * author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ */
+public class JUnit5ConsoleOutputReporter
+        extends ConsoleOutputReporter
+{
+    /**
+     * {@code false} by default.
+     * <br>
+     * This action takes effect only in JUnit5 provider together with a test class annotated <em>DisplayName</em>.
+     */
+    private boolean usePhrasedFileName;
+
+    public boolean isUsePhrasedFileName()
+    {
+        return usePhrasedFileName;
+    }
+
+    public void setUsePhrasedFileName( boolean usePhrasedFileName )
+    {
+        this.usePhrasedFileName = usePhrasedFileName;
+    }
+
+    @Override
+    public ConsoleOutputReportEventListener createListener( File reportsDirectory, String reportNameSuffix,
+                                                            Integer forkNumber )
+    {
+        return new ConsoleOutputFileReporter( reportsDirectory, reportNameSuffix, isUsePhrasedFileName(), forkNumber,
+                getEncoding() );
+    }
+
+    @Override
+    public ConsoleOutputReportEventListener createListener( PrintStream out, PrintStream err )
+    {
+        return new DirectConsoleOutput( out, err );
+    }
+
+    @Override
+    public Object clone( ClassLoader target )
+    {
+        try
+        {
+            Class<?> cls = target.loadClass( getClass().getName() );
+            Object clone = cls.newInstance();
+
+            cls.getMethod( "setDisable", boolean.class )
+                    .invoke( clone, isDisable() );
+            cls.getMethod( "setEncoding", String.class )
+                    .invoke( clone, getEncoding() );
+            cls.getMethod( "setUsePhrasedFileName", boolean.class )
+                    .invoke( clone, isUsePhrasedFileName() );
+
+            return clone;
+        }
+        catch ( ReflectiveOperationException e )
+        {
+            throw new IllegalStateException( e.getLocalizedMessage() );
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return "JUnit5ConsoleOutputReporter{"
+                + "disable=" + isDisable()
+                + ", encoding=" + getEncoding()
+                + ", usePhrasedFileName=" + isUsePhrasedFileName()
+                + '}';
+    }
+}
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
new file mode 100644
index 0000000..333a8d9
--- /dev/null
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
@@ -0,0 +1,104 @@
+package org.apache.maven.plugin.surefire.extensions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.plugin.surefire.report.ConsoleReporter;
+import org.apache.maven.plugin.surefire.report.FileReporter;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
+import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoReporter;
+
+import java.io.File;
+import java.nio.charset.Charset;
+
+/**
+ * Extension of {@link StatelessTestsetInfoConsoleReportEventListener file and console reporter of test-set} for JUnit5.
+ * Signatures can be changed between major, minor versions or milestones.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ */
+public class JUnit5StatelessTestsetInfoReporter
+        extends StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats>
+{
+    /**
+     * {@code false} by default.
+     * <br>
+     * This action takes effect only in JUnit5 provider together with a test class annotated <em>DisplayName</em>.
+     */
+    private boolean usePhrasedFileName;
+
+    public boolean isUsePhrasedFileName()
+    {
+        return usePhrasedFileName;
+    }
+
+    public void setUsePhrasedFileName( boolean usePhrasedFileName )
+    {
+        this.usePhrasedFileName = usePhrasedFileName;
+    }
+
+    @Override
+    public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createListener(
+            ConsoleLogger logger )
+    {
+        return new ConsoleReporter( logger );
+    }
+
+    @Override
+    public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> createListener(
+            File reportsDirectory, String reportNameSuffix, Charset encoding )
+    {
+        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, isUsePhrasedFileName() );
+    }
+
+    @Override
+    public Object clone( ClassLoader target )
+    {
+        try
+        {
+            Class<?> cls = target.loadClass( getClass().getName() );
+            Object clone = cls.newInstance();
+
+            cls.getMethod( "setDisable", boolean.class )
+                    .invoke( clone, isDisable() );
+            cls.getMethod( "setUsePhrasedFileName", boolean.class )
+                    .invoke( clone, isUsePhrasedFileName() );
+
+            return clone;
+        }
+        catch ( ReflectiveOperationException e )
+        {
+            throw new IllegalStateException( e.getLocalizedMessage() );
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return "JUnit5StatelessTestsetInfoReporter{"
+                + "disable=" + isDisable()
+                + ", usePhrasedFileName=" + isUsePhrasedFileName()
+                + "}";
+    }
+}
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5Xml30StatelessReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5Xml30StatelessReporter.java
index 8f3fc8e..ce2553d 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5Xml30StatelessReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5Xml30StatelessReporter.java
@@ -20,6 +20,8 @@ package org.apache.maven.plugin.surefire.extensions;
  */
 
 import org.apache.maven.plugin.surefire.report.StatelessXmlReporter;
+import org.apache.maven.plugin.surefire.report.TestSetStats;
+import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 
 /**
@@ -101,7 +103,7 @@ public class JUnit5Xml30StatelessReporter
     }
 
     @Override
-    public StatelessReportEventListener<StatelessReporterEvent> createStatelessReportEventListener(
+    public StatelessReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             DefaultStatelessReportMojoConfiguration configuration )
     {
         return new StatelessXmlReporter( configuration.getReportsDirectory(),
@@ -141,4 +143,17 @@ public class JUnit5Xml30StatelessReporter
             throw new IllegalStateException( e.getLocalizedMessage() );
         }
     }
+
+    @Override
+    public String toString()
+    {
+        return "StatelessReporter{"
+                + "version=" + getVersion()
+                + ", disable=" + isDisable()
+                + ", usePhrasedFileName=" + getUsePhrasedFileName()
+                + ", usePhrasedTestSuiteClassName=" + getUsePhrasedTestSuiteClassName()
+                + ", usePhrasedTestCaseClassName=" + getUsePhrasedTestCaseClassName()
+                + ", usePhrasedTestCaseMethodName=" + getUsePhrasedTestCaseMethodName()
+                + '}';
+    }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/StatelessReporterEvent.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/StatelessReporterEvent.java
deleted file mode 100644
index 7e87052..0000000
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/StatelessReporterEvent.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.apache.maven.plugin.surefire.extensions;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import org.apache.maven.plugin.surefire.report.TestSetStats;
-import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
-
-import java.util.EventObject;
-
-/**
- * author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
- * @since 3.0.0-M4
- */
-public final class StatelessReporterEvent extends EventObject
-{
-    private final WrappedReportEntry testSetReportEntry;
-    private final TestSetStats testSetStats;
-
-    /**
-     * Constructs a prototypical Event.
-     *
-     * @param source The object on which the Event initially occurred.
-     * @throws IllegalArgumentException if source is null.
-     */
-    public StatelessReporterEvent( Object source, WrappedReportEntry testSetReportEntry, TestSetStats testSetStats )
-    {
-        super( source );
-        this.testSetReportEntry = testSetReportEntry;
-        this.testSetStats = testSetStats;
-    }
-
-    public WrappedReportEntry getTestSetReportEntry()
-    {
-        return testSetReportEntry;
-    }
-
-    public TestSetStats getTestSetStats()
-    {
-        return testSetStats;
-    }
-}
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java
index 857b68e..3bc3f2c 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleOutputFileReporter.java
@@ -21,16 +21,17 @@ package org.apache.maven.plugin.surefire.report;
 
 import org.apache.maven.plugin.surefire.booterclient.output.InPluginProcessDumpSingleton;
 import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.FilterOutputStream;
 import java.io.IOException;
+import java.nio.charset.Charset;
 import java.util.concurrent.atomic.AtomicStampedReference;
 import java.util.concurrent.locks.ReentrantLock;
 
-import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.apache.maven.plugin.surefire.report.FileReporter.getReportFile;
 import static org.apache.maven.surefire.util.internal.StringUtils.NL;
 
@@ -43,14 +44,16 @@ import static org.apache.maven.surefire.util.internal.StringUtils.NL;
 public class ConsoleOutputFileReporter
     implements TestcycleConsoleOutputReceiver
 {
-    private static final int STREAM_BUFFER_SIZE = 16 * 1024;
+    private static final int STREAM_BUFFER_SIZE = 64 * 1024;
     private static final int OPEN = 0;
     private static final int CLOSED_TO_REOPEN = 1;
     private static final int CLOSED = 2;
 
     private final File reportsDirectory;
     private final String reportNameSuffix;
+    private final boolean usePhrasedFileName;
     private final Integer forkNumber;
+    private final String encoding;
 
     private final AtomicStampedReference<FilterOutputStream> fileOutputStream =
             new AtomicStampedReference<>( null, OPEN );
@@ -59,15 +62,18 @@ public class ConsoleOutputFileReporter
 
     private volatile String reportEntryName;
 
-    public ConsoleOutputFileReporter( File reportsDirectory, String reportNameSuffix, Integer forkNumber )
+    public ConsoleOutputFileReporter( File reportsDirectory, String reportNameSuffix, boolean usePhrasedFileName,
+                                      Integer forkNumber, String encoding )
     {
         this.reportsDirectory = reportsDirectory;
         this.reportNameSuffix = reportNameSuffix;
+        this.usePhrasedFileName = usePhrasedFileName;
         this.forkNumber = forkNumber;
+        this.encoding = encoding;
     }
 
     @Override
-    public void testSetStarting( ReportEntry reportEntry )
+    public void testSetStarting( TestSetReportEntry reportEntry )
     {
         lock.lock();
         try
@@ -81,7 +87,7 @@ public class ConsoleOutputFileReporter
     }
 
     @Override
-    public void testSetCompleted( ReportEntry report )
+    public void testSetCompleted( TestSetReportEntry report )
     {
     }
 
@@ -128,10 +134,11 @@ public class ConsoleOutputFileReporter
                 {
                     output = "null";
                 }
-                os.write( output.getBytes( UTF_8 ) );
+                Charset charset = Charset.forName( encoding );
+                os.write( output.getBytes( charset ) );
                 if ( newLine )
                 {
-                    os.write( NL.getBytes( UTF_8 ) );
+                    os.write( NL.getBytes( charset ) );
                 }
             }
         }
@@ -162,7 +169,7 @@ public class ConsoleOutputFileReporter
         finally
         {
             // prepare <class>-output.txt report file
-            reportEntryName = reportEntry.getSourceName();
+            reportEntryName = usePhrasedFileName ? reportEntry.getSourceText() : reportEntry.getSourceName();
         }
     }
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
index 36f311b..91a3fe0 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
@@ -23,8 +23,9 @@ import java.util.List;
 
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.shared.utils.logging.MessageBuilder;
-import org.apache.maven.surefire.report.ReportEntry;
 import org.apache.maven.plugin.surefire.log.api.Level;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 import static org.apache.maven.plugin.surefire.log.api.Level.resolveLevel;
 import static org.apache.maven.plugin.surefire.report.TestSetStats.concatenateWithTestGroup;
@@ -37,6 +38,7 @@ import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
  * @author Kristian Rosenvold
  */
 public class ConsoleReporter
+        extends StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats>
 {
     public static final String BRIEF = "brief";
 
@@ -44,24 +46,20 @@ public class ConsoleReporter
 
     private static final String TEST_SET_STARTING_PREFIX = "Running ";
 
-    private final ConsoleLogger logger;
-
     public ConsoleReporter( ConsoleLogger logger )
     {
-        this.logger = logger;
-    }
-
-    public ConsoleLogger getConsoleLogger()
-    {
-        return logger;
+        super( logger );
     }
 
-    public void testSetStarting( ReportEntry report )
+    @Override
+    public void testSetStarting( TestSetReportEntry report )
     {
         MessageBuilder builder = buffer();
-        logger.info( concatenateWithTestGroup( builder.a( TEST_SET_STARTING_PREFIX ), report ) );
+        getConsoleLogger()
+                .info( concatenateWithTestGroup( builder.a( TEST_SET_STARTING_PREFIX ), report ) );
     }
 
+    @Override
     public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetStats, List<String> testResults )
     {
         boolean success = testSetStats.getCompletedCount() > 0;
@@ -78,6 +76,7 @@ public class ConsoleReporter
         }
     }
 
+    @Override
     public void reset()
     {
     }
@@ -87,13 +86,16 @@ public class ConsoleReporter
         switch ( level )
         {
             case FAILURE:
-                logger.error( message );
+                getConsoleLogger()
+                        .error( message );
                 break;
             case UNSTABLE:
-                logger.warning( message );
+                getConsoleLogger()
+                        .warning( message );
                 break;
             default:
-                logger.info( message );
+                getConsoleLogger()
+                        .info( message );
         }
     }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
index 8448596..2309f31 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
@@ -20,11 +20,11 @@ package org.apache.maven.plugin.surefire.report;
  */
 
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
-import org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.log.api.Level;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
 import org.apache.maven.shared.utils.logging.MessageBuilder;
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.report.RunListener;
@@ -126,16 +126,18 @@ public class DefaultReporterFactory
         return useNonNull( fileReporter, NullFileReporter.INSTANCE );
     }
 
-    private StatelessReportEventListener<StatelessReporterEvent> createSimpleXMLReporter()
+    private StatelessReportEventListener<WrappedReportEntry, TestSetStats> createSimpleXMLReporter()
     {
-        StatelessReportEventListener<StatelessReporterEvent> xmlReporter =
+        StatelessReportEventListener<WrappedReportEntry, TestSetStats> xmlReporter =
                 reportConfiguration.instantiateStatelessXmlReporter( forkNumber );
         return useNonNull( xmlReporter, NullStatelessXmlReporter.INSTANCE );
     }
 
-    private TestcycleConsoleOutputReceiver createConsoleOutputReceiver()
+    private ConsoleOutputReportEventListener createConsoleOutputReceiver()
     {
-        return reportConfiguration.instantiateConsoleOutputFileReporter( forkNumber );
+        ConsoleOutputReportEventListener outputReporter =
+                reportConfiguration.instantiateConsoleOutputFileReporter( forkNumber );
+        return useNonNull( outputReporter, NullConsoleOutputReceiver.INSTANCE );
     }
 
     private StatisticsReporter createStatisticsReporter()
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java
index 6a94562..0d3aaef 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DirectConsoleOutput.java
@@ -19,7 +19,7 @@ package org.apache.maven.plugin.surefire.report;
  * under the License.
  */
 
-import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 import java.io.PrintStream;
 
@@ -61,12 +61,12 @@ public class DirectConsoleOutput
     }
 
     @Override
-    public void testSetStarting( ReportEntry reportEntry )
+    public void testSetStarting( TestSetReportEntry reportEntry )
     {
     }
 
     @Override
-    public void testSetCompleted( ReportEntry report )
+    public void testSetCompleted( TestSetReportEntry report )
     {
     }
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
index 9571f87..8dc34a0 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
@@ -19,6 +19,7 @@ package org.apache.maven.plugin.surefire.report;
  * under the License.
  */
 
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
 import org.apache.maven.surefire.report.ReporterException;
 
 import java.io.BufferedWriter;
@@ -40,41 +41,43 @@ import static org.apache.maven.surefire.util.internal.StringUtils.isNotBlank;
  * @author Kristian Rosenvold
  */
 public class FileReporter
+        extends StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats>
 {
-    private final File reportsDirectory;
-    private final String reportNameSuffix;
-    private final Charset encoding;
+    private final boolean usePhrasedFileName;
 
-    public FileReporter( File reportsDirectory, String reportNameSuffix, Charset encoding )
+    public FileReporter( File reportsDirectory, String reportNameSuffix, Charset encoding, boolean usePhrasedFileName )
     {
-        this.reportsDirectory = reportsDirectory;
-        this.reportNameSuffix = reportNameSuffix;
-        this.encoding = encoding;
+        super( reportsDirectory, reportNameSuffix, encoding );
+        this.usePhrasedFileName = usePhrasedFileName;
     }
 
     static File getReportFile( File reportsDirectory, String reportEntryName, String reportNameSuffix,
-                                      String fileExtension )
+                               String fileExtension )
     {
         String fileName =
                 reportEntryName + ( isNotBlank( reportNameSuffix ) ? "-" + reportNameSuffix : "" ) + fileExtension;
         return new File( reportsDirectory, stripIllegalFilenameChars( fileName ) );
     }
 
+    @Override
     public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetStats, List<String> testResults )
     {
-        File reportFile = getReportFile( reportsDirectory, report.getSourceName(), reportNameSuffix, ".txt" );
+        File reportFile = getReportFile( getReportsDirectory(),
+                                         usePhrasedFileName ? report.getReportSourceName() : report.getSourceName(),
+                                         getReportNameSuffix(),
+                              ".txt" );
 
         File reportDir = reportFile.getParentFile();
 
         // noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
 
-        try ( BufferedWriter writer = createFileReporterWriter( reportFile, encoding ) )
+        try ( BufferedWriter writer = createFileReporterWriter( reportFile, getEncoding() ) )
         {
             writer.write( "-------------------------------------------------------------------------------" );
             writer.newLine();
 
-            writer.write( "Test set: " + report.getReportSourceName() );
+            writer.write( "Test set: " + report.getSourceName() );
             writer.newLine();
 
             writer.write( "-------------------------------------------------------------------------------" );
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java
similarity index 57%
copy from maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
copy to maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java
index af68d1e..a826b67 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleOutputReceiver.java
@@ -19,40 +19,45 @@ package org.apache.maven.plugin.surefire.report;
  * under the License.
  */
 
-import java.util.List;
-
-import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
-import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 /**
- * ConsoleReporter doing nothing rather than using null.
+ * TestcycleConsoleOutputReceiver doing nothing rather than using null.
  *
- * @author <a href="mailto:britter@apache.org">Benedikt Ritter</a>
- * @since 2.20
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
  */
-class NullConsoleReporter
-    extends ConsoleReporter
+public class NullConsoleOutputReceiver
+    implements TestcycleConsoleOutputReceiver
 {
 
-    static final NullConsoleReporter INSTANCE = new NullConsoleReporter();
+    static final NullConsoleOutputReceiver INSTANCE = new NullConsoleOutputReceiver();
 
-    private NullConsoleReporter()
+    private NullConsoleOutputReceiver()
     {
-        super( new NullConsoleLogger() );
     }
 
     @Override
-    public void testSetStarting( ReportEntry report )
+    public void testSetStarting( TestSetReportEntry reportEntry )
     {
+
     }
 
     @Override
-    public void testSetCompleted( WrappedReportEntry report, TestSetStats testSetStats, List<String> testResults )
+    public void testSetCompleted( TestSetReportEntry report )
     {
+
     }
 
     @Override
-    public void reset()
+    public void close()
     {
+
+    }
+
+    @Override
+    public void writeTestOutput( String output, boolean newLine, boolean stdout )
+    {
+
     }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
index af68d1e..76f9563 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
@@ -22,7 +22,7 @@ package org.apache.maven.plugin.surefire.report;
 import java.util.List;
 
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
-import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 /**
  * ConsoleReporter doing nothing rather than using null.
@@ -42,7 +42,7 @@ class NullConsoleReporter
     }
 
     @Override
-    public void testSetStarting( ReportEntry report )
+    public void testSetStarting( TestSetReportEntry report )
     {
     }
 
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
index df1bf9d..c0e546f 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
@@ -35,7 +35,7 @@ class NullFileReporter
 
     private NullFileReporter()
     {
-        super( null, null, null );
+        super( null, null, null, false );
     }
 
     @Override
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
index e3710c9..6abf2e2 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/StatelessXmlReporter.java
@@ -20,7 +20,6 @@ package org.apache.maven.plugin.surefire.report;
  */
 
 import org.apache.maven.plugin.surefire.booterclient.output.InPluginProcessDumpSingleton;
-import org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent;
 import org.apache.maven.shared.utils.xml.PrettyPrintXMLWriter;
 import org.apache.maven.shared.utils.xml.XMLWriter;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
@@ -85,7 +84,7 @@ import static org.apache.maven.surefire.util.internal.StringUtils.isBlank;
  */
 @Deprecated // this is no more stateless due to existence of testClassMethodRunHistoryMap since of 2.19. Rename to StatefulXmlReporter in 3.0.
 public class StatelessXmlReporter
-        implements StatelessReportEventListener<StatelessReporterEvent>
+        implements StatelessReportEventListener<WrappedReportEntry, TestSetStats>
 {
     private final File reportsDirectory;
 
@@ -131,11 +130,6 @@ public class StatelessXmlReporter
     }
 
     @Override
-    public void testSetCompleted( StatelessReporterEvent event )
-    {
-        testSetCompleted( event.getTestSetReportEntry(), event.getTestSetStats() );
-    }
-
     public void testSetCompleted( WrappedReportEntry testSetReportEntry, TestSetStats testSetStats )
     {
         Map<String, Map<String, List<WrappedReportEntry>>> classMethodStatistics =
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
index 6a7d619..f97140c 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
@@ -25,9 +25,9 @@ import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
-import org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
 import org.apache.maven.surefire.report.ReportEntry;
@@ -55,11 +55,11 @@ public class TestSetRunListener
 
     private final TestSetStats detailsForThis;
 
-    private final TestcycleConsoleOutputReceiver consoleOutputReceiver;
+    private final ConsoleOutputReportEventListener consoleOutputReceiver;
 
     private final boolean briefOrPlainFormat;
 
-    private final StatelessReportEventListener<StatelessReporterEvent> simpleXMLReporter;
+    private final StatelessReportEventListener<WrappedReportEntry, TestSetStats> simpleXMLReporter;
 
     private final ConsoleReporter consoleReporter;
 
@@ -75,8 +75,8 @@ public class TestSetRunListener
 
     @SuppressWarnings( "checkstyle:parameternumber" )
     public TestSetRunListener( ConsoleReporter consoleReporter, FileReporter fileReporter,
-                               StatelessReportEventListener<StatelessReporterEvent> simpleXMLReporter,
-                               TestcycleConsoleOutputReceiver consoleOutputReceiver,
+                               StatelessReportEventListener<WrappedReportEntry, TestSetStats> simpleXMLReporter,
+                               ConsoleOutputReportEventListener consoleOutputReceiver,
                                StatisticsReporter statisticsReporter, boolean trimStackTrace,
                                boolean isPlainFormat, boolean briefOrPlainFormat )
     {
@@ -185,7 +185,7 @@ public class TestSetRunListener
         final List<String> testResults =
                 briefOrPlainFormat ? detailsForThis.getTestResults() : Collections.<String>emptyList();
         fileReporter.testSetCompleted( wrap, detailsForThis, testResults );
-        simpleXMLReporter.testSetCompleted( new StatelessReporterEvent( this, wrap, detailsForThis ) );
+        simpleXMLReporter.testSetCompleted( wrap, detailsForThis );
         statisticsReporter.testSetCompleted();
         consoleReporter.testSetCompleted( wrap, detailsForThis, testResults );
         consoleOutputReceiver.testSetCompleted( wrap );
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java
index f1b5b5a..cdd4b3a 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java
@@ -19,18 +19,19 @@ package org.apache.maven.plugin.surefire.report;
  * under the License.
  */
 
+import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
-import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 /**
  * @author Kristian Rosenvold
  */
 public interface TestcycleConsoleOutputReceiver
-    extends ConsoleOutputReceiver
+    extends ConsoleOutputReceiver, ConsoleOutputReportEventListener
 {
-    void testSetStarting( ReportEntry reportEntry );
+    void testSetStarting( TestSetReportEntry reportEntry );
 
-    void testSetCompleted( ReportEntry report );
+    void testSetCompleted( TestSetReportEntry report );
 
     void close();
 }
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 fe69aed..b646800 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
@@ -20,6 +20,7 @@ package org.apache.maven.plugin.surefire.booterclient;
  */
 
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
+import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
@@ -57,6 +58,6 @@ public class TestSetMockReporterFactory
         File target = new File( "./target" );
         File statisticsFile = new File( target, "TESTHASH" );
         return new StartupReportConfiguration( true, true, "PLAIN", false, target, false, null, statisticsFile,
-                false, 0, null, null, true, new DefaultStatelessReporter() );
+                false, 0, null, null, true, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
     }
 }
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
index 7a674a0..37d9cbb 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
@@ -28,6 +28,7 @@ import java.util.Queue;
 import junit.framework.TestCase;
 
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
+import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.shared.utils.logging.MessageUtils;
@@ -70,7 +71,7 @@ public class DefaultReporterFactoryTest
         StartupReportConfiguration reportConfig =
                 new StartupReportConfiguration( true, true, "PLAIN", false, reportsDirectory, false, null,
                         new File( reportsDirectory, "TESTHASH" ), false, 1, null, null, false,
-                        new DefaultStatelessReporter() );
+                        new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
 
         DummyTestReporter reporter = new DummyTestReporter();
 
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java
index 9e35723..7fdd9ff 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/ConsoleOutputFileReporterTest.java
@@ -45,8 +45,9 @@ public class ConsoleOutputFileReporterTest
         File reportDir = new File( new File( System.getProperty( "user.dir" ), "target" ), "tmp1" );
         //noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
-        ReportEntry reportEntry = new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null );
-        ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, null );
+        TestSetReportEntry reportEntry =
+                new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null );
+        ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, false, null, "UTF-8" );
         reporter.testSetStarting( reportEntry );
         reporter.writeTestOutput( "some ", false, true );
         reporter.testSetCompleted( reportEntry );
@@ -73,8 +74,10 @@ public class ConsoleOutputFileReporterTest
         //noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
         String suffixText = "sampleSuffixText";
-        ReportEntry reportEntry = new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null );
-        ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, suffixText, null );
+        TestSetReportEntry reportEntry =
+                new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null );
+        ConsoleOutputFileReporter reporter =
+                new ConsoleOutputFileReporter( reportDir, suffixText, false, null, "UTF-8" );
         reporter.testSetStarting( reportEntry );
         reporter.writeTestOutput( "some ", false, true );
         reporter.testSetCompleted( reportEntry );
@@ -97,7 +100,7 @@ public class ConsoleOutputFileReporterTest
         File reportDir = new File( new File( System.getProperty( "user.dir" ), "target" ), "tmp3" );
         //noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
-        ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, null );
+        ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, false, null, "UTF-8" );
         reporter.writeTestOutput( "some text", false, true );
         reporter.testSetCompleted( new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null ) );
         reporter.close();
@@ -119,7 +122,8 @@ public class ConsoleOutputFileReporterTest
         File reportDir = new File( new File( System.getProperty( "user.dir" ), "target" ), "tmp4" );
         //noinspection ResultOfMethodCallIgnored
         reportDir.mkdirs();
-        final ConsoleOutputFileReporter reporter = new ConsoleOutputFileReporter( reportDir, null, null );
+        final ConsoleOutputFileReporter reporter =
+                new ConsoleOutputFileReporter( reportDir, null, false, null, "UTF-8" );
         reporter.testSetStarting( new SimpleReportEntry( getClass().getName(), null, getClass().getName(), null ) );
         ExecutorService scheduler = Executors.newFixedThreadPool( 10 );
         final ArrayList<Callable<Void>> jobs = new ArrayList<>();
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
index 0693626..ee63fc1 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
@@ -45,7 +45,7 @@ public class FileReporterTest
         reportEntry = new SimpleReportEntry( getClass().getName(), null, testName, null );
         WrappedReportEntry wrappedReportEntry =
             new WrappedReportEntry( reportEntry, ReportEntryType.SUCCESS, 12, null, null );
-        reporter = new FileReporter( reportDir, null, Charset.defaultCharset() );
+        reporter = new FileReporter( reportDir, null, Charset.defaultCharset(), false );
         reporter.testSetCompleted( wrappedReportEntry, createTestSetStats(), new ArrayList<String>() );
 
         File expectedReportFile = new File( reportDir, testName + ".txt" );
@@ -67,7 +67,7 @@ public class FileReporterTest
         reportEntry = new SimpleReportEntry( getClass().getName(), null, testName, null );
         WrappedReportEntry wrappedReportEntry =
             new WrappedReportEntry( reportEntry, ReportEntryType.SUCCESS, 12, null, null );
-        reporter = new FileReporter( reportDir, suffixText, Charset.defaultCharset() );
+        reporter = new FileReporter( reportDir, suffixText, Charset.defaultCharset(), false );
         reporter.testSetCompleted( wrappedReportEntry, createTestSetStats(), new ArrayList<String>() );
 
         File expectedReportFile = new File( reportDir, testName + "-" + suffixText + ".txt" );
diff --git a/surefire-extensions-api/pom.xml b/surefire-extensions-api/pom.xml
index a2bce4e..6daae03 100644
--- a/surefire-extensions-api/pom.xml
+++ b/surefire-extensions-api/pom.xml
@@ -30,6 +30,7 @@
     </parent>
 
     <artifactId>surefire-extensions-api</artifactId>
+    <name>Surefire Extensions API</name>
 
     <dependencies>
         <dependency>
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java
similarity index 60%
copy from maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java
copy to surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java
index f1b5b5a..5163a96 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestcycleConsoleOutputReceiver.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReportEventListener.java
@@ -1,4 +1,4 @@
-package org.apache.maven.plugin.surefire.report;
+package org.apache.maven.surefire.extensions;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,18 +19,19 @@ package org.apache.maven.plugin.surefire.report;
  * under the License.
  */
 
-import org.apache.maven.surefire.report.ConsoleOutputReceiver;
-import org.apache.maven.surefire.report.ReportEntry;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 /**
- * @author Kristian Rosenvold
+ * Extension listener for logger.
+ * The signature can be changed between major, minor versions or milestones.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
  */
-public interface TestcycleConsoleOutputReceiver
-    extends ConsoleOutputReceiver
+public interface ConsoleOutputReportEventListener
 {
-    void testSetStarting( ReportEntry reportEntry );
-
-    void testSetCompleted( ReportEntry report );
-
+    void testSetStarting( TestSetReportEntry reportEntry );
+    void testSetCompleted( TestSetReportEntry report );
     void close();
+    void writeTestOutput( String output, boolean newLine, boolean stdout );
 }
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReporter.java
similarity index 58%
copy from surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
copy to surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReporter.java
index 5c690c4..0262beb 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/ConsoleOutputReporter.java
@@ -19,36 +19,34 @@ package org.apache.maven.surefire.extensions;
  * under the License.
  */
 
-import java.util.EventObject;
+import java.io.File;
+import java.io.PrintStream;
+
+import static org.apache.maven.surefire.util.internal.StringUtils.isBlank;
 
 /**
- * Extension for stateless reporter.
- * Signatures can be changed between major or minor versions.
+ * Extension for logger.
+ * The signature can be changed between major, minor versions or milestones.
  *
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
- * @param <E> Generic type of event type
- * @param <C> mojo config
  */
-public abstract class StatelessReporter<E extends EventObject, C extends StatelessReportMojoConfiguration>
+public abstract class ConsoleOutputReporter
 {
     /**
      * {@code false} by default
      */
-    //todo remove isDisableXmlReport() in AbstractSurefireMojo and use this param instead
     private boolean disable;
 
     /**
-     * Version of reporter. It is version <em>3.0</em> used by default in XML reporter.
+     * The content is encoded <em>UTF-8</em> by default.
      */
-    private String version = "3.0";
+    private String encoding;
 
-    /**
-     * Creates reporter.
-     *
-     * @return reporter object
-     */
-    public abstract StatelessReportEventListener<E> createStatelessReportEventListener( C configuration );
+    public abstract ConsoleOutputReportEventListener createListener( File reportsDirectory, String reportNameSuffix,
+                                                                     Integer forkNumber );
+
+    public abstract ConsoleOutputReportEventListener createListener( PrintStream out, PrintStream err );
 
     public abstract Object clone( ClassLoader target );
 
@@ -62,22 +60,22 @@ public abstract class StatelessReporter<E extends EventObject, C extends Statele
         this.disable = disable;
     }
 
-    public String getVersion()
+    public String getEncoding()
     {
-        return version;
+        return isBlank( encoding ) ? "UTF-8" : encoding;
     }
 
-    public void setVersion( String version )
+    public void setEncoding( String encoding )
     {
-        this.version = version;
+        this.encoding = encoding;
     }
 
     @Override
     public String toString()
     {
-        return "StatelessReporter{"
-                + "version=" + version
-                + ", disable=" + disable
+        return "ConsoleOutputReporter{"
+                + "disable=" + isDisable()
+                + ", encoding=" + getEncoding()
                 + '}';
     }
 }
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportEventListener.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportEventListener.java
index 8ea318f..3187802 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportEventListener.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportEventListener.java
@@ -19,8 +19,7 @@ package org.apache.maven.surefire.extensions;
  * under the License.
  */
 
-import java.util.EventListener;
-import java.util.EventObject;
+import org.apache.maven.surefire.report.TestSetReportEntry;
 
 /**
  * Creates a report upon handled event "<em>testSetCompleted</em>".
@@ -29,20 +28,16 @@ import java.util.EventObject;
  *
  * author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
- * @param <T> Generic type of event type (see org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent)
+ * @param <R> report entry type, see <em>WrappedReportEntry</em> from module the <em>maven-surefire-common</em>
+ * @param <S> test-set statistics, see <em>TestSetStats</em> from module the <em>maven-surefire-common</em>
  */
-public interface StatelessReportEventListener<T extends EventObject>
-        extends EventListener
+public interface StatelessReportEventListener<R extends TestSetReportEntry, S>
 {
     /**
-     * Event handled after the test class has been completed and the state of report is final.
-     * <br>
-     * The {@code event} (of type <em>org.apache.maven.plugin.surefire.extensions.StatelessReporterEvent</em>)
-     * wraps <em>WrappedReportEntry</em> and <em>TestSetStats</em> from the module <em>maven-surefire-common</em>.
-     * <br>
-     * The {@link EventObject#getSource()} may access <em>TestSetRunListener</em> object.
+     * The callback is called after the test class has been completed and the state of report is final.
      *
-     * @param event event wrapper (type can be changed between major or minor versions)
+     * @param report <em>WrappedReportEntry</em>
+     * @param testSetStats <em>TestSetStats</em>
      */
-     void testSetCompleted( T event );
+     void testSetCompleted( R report, S testSetStats );
 }
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java
index 7baebfd..f176fce 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java
@@ -24,7 +24,7 @@ import java.io.File;
 /**
  * Configuration passed to the constructor of default reporter
  * <em>org.apache.maven.plugin.surefire.report.StatelessXmlReporter</em>.
- * Signatures can be changed between major or minor versions.
+ * Signatures can be changed between major, minor versions or milestones.
  */
 public class StatelessReportMojoConfiguration
 {
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
index 5c690c4..2732e3b 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
@@ -19,18 +19,21 @@ package org.apache.maven.surefire.extensions;
  * under the License.
  */
 
-import java.util.EventObject;
+import org.apache.maven.surefire.report.TestSetReportEntry;
+
+import static org.apache.maven.surefire.util.internal.StringUtils.isBlank;
 
 /**
  * Extension for stateless reporter.
- * Signatures can be changed between major or minor versions.
+ * Signatures can be changed between major, minor versions or milestones.
  *
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
- * @param <E> Generic type of event type
- * @param <C> mojo config
+ * @param <R> report entry type, see <em>WrappedReportEntry</em> from module the <em>maven-surefire-common</em>
+ * @param <S> test-set statistics, see <em>TestSetStats</em> from module the <em>maven-surefire-common</em>
+ * @param <C> mojo config, see <em>DefaultStatelessReportMojoConfiguration</em> from <em>maven-surefire-common</em>
  */
-public abstract class StatelessReporter<E extends EventObject, C extends StatelessReportMojoConfiguration>
+public abstract class StatelessReporter<R extends TestSetReportEntry, S, C extends StatelessReportMojoConfiguration>
 {
     /**
      * {@code false} by default
@@ -41,14 +44,14 @@ public abstract class StatelessReporter<E extends EventObject, C extends Statele
     /**
      * Version of reporter. It is version <em>3.0</em> used by default in XML reporter.
      */
-    private String version = "3.0";
+    private String version;
 
     /**
      * Creates reporter.
      *
      * @return reporter object
      */
-    public abstract StatelessReportEventListener<E> createStatelessReportEventListener( C configuration );
+    public abstract StatelessReportEventListener<R, S> createListener( C configuration );
 
     public abstract Object clone( ClassLoader target );
 
@@ -64,7 +67,7 @@ public abstract class StatelessReporter<E extends EventObject, C extends Statele
 
     public String getVersion()
     {
-        return version;
+        return isBlank( version ) ? "3.0" : version;
     }
 
     public void setVersion( String version )
@@ -76,8 +79,8 @@ public abstract class StatelessReporter<E extends EventObject, C extends Statele
     public String toString()
     {
         return "StatelessReporter{"
-                + "version=" + version
-                + ", disable=" + disable
+                + "version=" + getVersion()
+                + ", disable=" + isDisable()
                 + '}';
     }
 }
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoConsoleReportEventListener.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoConsoleReportEventListener.java
new file mode 100644
index 0000000..f01acff
--- /dev/null
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoConsoleReportEventListener.java
@@ -0,0 +1,53 @@
+package org.apache.maven.surefire.extensions;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.surefire.report.TestSetReportEntry;
+
+import java.util.List;
+
+/**
+ * Extension listener for stateless console reporter of test-set.
+ * Signatures can be changed between major, minor versions or milestones.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ * @param <R> report entry type, see <em>WrappedReportEntry</em> from module the <em>maven-surefire-common</em>
+ * @param <S> test-set statistics, see <em>TestSetStats</em> from module the <em>maven-surefire-common</em>
+ */
+public abstract class StatelessTestsetInfoConsoleReportEventListener<R extends TestSetReportEntry, S>
+{
+    private final ConsoleLogger logger;
+
+    public StatelessTestsetInfoConsoleReportEventListener( ConsoleLogger logger )
+    {
+        this.logger = logger;
+    }
+
+    public abstract void testSetStarting( TestSetReportEntry report );
+    public abstract void testSetCompleted( R report, S testSetStats, List<String> testResults );
+    public abstract void reset();
+
+    public ConsoleLogger getConsoleLogger()
+    {
+        return logger;
+    }
+}
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoFileReportEventListener.java
similarity index 50%
copy from surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java
copy to surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoFileReportEventListener.java
index 7baebfd..91e460a 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReportMojoConfiguration.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoFileReportEventListener.java
@@ -19,57 +19,49 @@ package org.apache.maven.surefire.extensions;
  * under the License.
  */
 
+import org.apache.maven.surefire.report.TestSetReportEntry;
+
 import java.io.File;
+import java.nio.charset.Charset;
+import java.util.List;
 
 /**
- * Configuration passed to the constructor of default reporter
- * <em>org.apache.maven.plugin.surefire.report.StatelessXmlReporter</em>.
- * Signatures can be changed between major or minor versions.
+ * Extension listener for stateless file reporter of test-set.
+ * Signatures can be changed between major, minor versions or milestones.
+ *
+ * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
+ * @since 3.0.0-M4
+ * @param <R> report entry type, see <em>WrappedReportEntry</em> from module the <em>maven-surefire-common</em>
+ * @param <S> test-set statistics, see <em>TestSetStats</em> from module the <em>maven-surefire-common</em>
  */
-public class StatelessReportMojoConfiguration
+public abstract class StatelessTestsetInfoFileReportEventListener<R extends TestSetReportEntry, S>
 {
     private final File reportsDirectory;
-
     private final String reportNameSuffix;
+    private final Charset encoding;
 
-    private final boolean trimStackTrace;
-
-    private final int rerunFailingTestsCount;
-
-    private final String xsdSchemaLocation;
-
-    public StatelessReportMojoConfiguration( File reportsDirectory, String reportNameSuffix, boolean trimStackTrace,
-                                             int rerunFailingTestsCount, String xsdSchemaLocation )
+    public StatelessTestsetInfoFileReportEventListener( File reportsDirectory, String reportNameSuffix,
+                                                        Charset encoding )
     {
         this.reportsDirectory = reportsDirectory;
         this.reportNameSuffix = reportNameSuffix;
-        this.trimStackTrace = trimStackTrace;
-        this.rerunFailingTestsCount = rerunFailingTestsCount;
-        this.xsdSchemaLocation = xsdSchemaLocation;
+        this.encoding = encoding;
     }
 
-    public File getReportsDirectory()
+    public abstract void testSetCompleted( R report, S testSetStats, List<String> testResults );
+
+    protected File getReportsDirectory()
     {
         return reportsDirectory;
     }
 
-    public String getReportNameSuffix()
+    protected String getReportNameSuffix()
     {
         return reportNameSuffix;
     }
 
-    public boolean isTrimStackTrace()
-    {
-        return trimStackTrace;
-    }
-
-    public int getRerunFailingTestsCount()
-    {
-        return rerunFailingTestsCount;
-    }
-
-    public String getXsdSchemaLocation()
+    protected Charset getEncoding()
     {
-        return xsdSchemaLocation;
+        return encoding;
     }
 }
diff --git a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoReporter.java
similarity index 52%
copy from surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
copy to surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoReporter.java
index 5c690c4..9cdf824 100644
--- a/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessReporter.java
+++ b/surefire-extensions-api/src/main/java/org/apache/maven/surefire/extensions/StatelessTestsetInfoReporter.java
@@ -19,36 +19,30 @@ package org.apache.maven.surefire.extensions;
  * under the License.
  */
 
-import java.util.EventObject;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
+import org.apache.maven.surefire.report.TestSetReportEntry;
+
+import java.io.File;
+import java.nio.charset.Charset;
 
 /**
- * Extension for stateless reporter.
- * Signatures can be changed between major or minor versions.
+ * Extension listener for stateless file and console reporter of test-set.
+ * Signatures can be changed between major, minor versions or milestones.
  *
  * @author <a href="mailto:tibordigana@apache.org">Tibor Digana (tibor17)</a>
  * @since 3.0.0-M4
- * @param <E> Generic type of event type
- * @param <C> mojo config
+ * @param <R> report entry type, see <em>WrappedReportEntry</em> from module the <em>maven-surefire-common</em>
+ * @param <S> test-set statistics, see <em>TestSetStats</em> from module the <em>maven-surefire-common</em>
  */
-public abstract class StatelessReporter<E extends EventObject, C extends StatelessReportMojoConfiguration>
+public abstract class StatelessTestsetInfoReporter<R extends TestSetReportEntry, S>
 {
-    /**
-     * {@code false} by default
-     */
-    //todo remove isDisableXmlReport() in AbstractSurefireMojo and use this param instead
     private boolean disable;
 
-    /**
-     * Version of reporter. It is version <em>3.0</em> used by default in XML reporter.
-     */
-    private String version = "3.0";
+    public abstract StatelessTestsetInfoConsoleReportEventListener<R, S> createListener( ConsoleLogger logger );
 
-    /**
-     * Creates reporter.
-     *
-     * @return reporter object
-     */
-    public abstract StatelessReportEventListener<E> createStatelessReportEventListener( C configuration );
+    public abstract StatelessTestsetInfoFileReportEventListener<R, S> createListener( File reportsDirectory,
+                                                                                      String reportNameSuffix,
+                                                                                      Charset encoding );
 
     public abstract Object clone( ClassLoader target );
 
@@ -62,22 +56,9 @@ public abstract class StatelessReporter<E extends EventObject, C extends Statele
         this.disable = disable;
     }
 
-    public String getVersion()
-    {
-        return version;
-    }
-
-    public void setVersion( String version )
-    {
-        this.version = version;
-    }
-
     @Override
     public String toString()
     {
-        return "StatelessReporter{"
-                + "version=" + version
-                + ", disable=" + disable
-                + '}';
+        return "StatelessTestsetInfoReporter{disable=" + disable + '}';
     }
 }
diff --git a/surefire-its/pom.xml b/surefire-its/pom.xml
index 2da331f..9bc0b85 100644
--- a/surefire-its/pom.xml
+++ b/surefire-its/pom.xml
@@ -170,7 +170,9 @@
                     <forkMode>once</forkMode>
                     <argLine>-server -Xmx64m -XX:+UseG1GC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Djava.awt.headless=true -Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
                     <includes>
-                        <include>org/apache/**/*IT*.java</include>
+                        <include>org/apache/**/Surefire1396CustomProviderClassPathIT.java</include>
+                        <include>org/apache/**/JUnitPlatformIT.java</include>
+                        <include>org/apache/**/JUnitPlatformEnginesIT.java</include>
                     </includes>
                     <!-- Pass current surefire version to the main suite so that it -->
                     <!-- can forward to all integration test projects. SUREFIRE-513 -->
@@ -203,13 +205,6 @@
                 </executions>
             </plugin>
             <plugin>
-                <artifactId>maven-jar-plugin</artifactId>
-                <!-- todo dont skip since of failsafe:2.19 internal use if having src/main/java/... -->
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-            <plugin>
                 <groupId>org.jacoco</groupId>
                 <artifactId>jacoco-maven-plugin</artifactId>
                 <executions>
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformEnginesIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformEnginesIT.java
index af8f366..0cfafc4 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformEnginesIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformEnginesIT.java
@@ -64,8 +64,9 @@ public class JUnitPlatformEnginesIT
         args.add( new Object[] { "1.1.1", "5.1.1", "1.0.0", "1.0.0" } );
         args.add( new Object[] { "1.2.0", "5.2.0", "1.1.0", "1.0.0" } );
         args.add( new Object[] { "1.3.2", "5.3.2", "1.1.1", "1.0.0" } );
-        args.add( new Object[] { "1.4.0-SNAPSHOT", "5.4.0-SNAPSHOT", "1.1.1", "1.0.0" } );
-        args.add( new Object[] { "1.4.0-RC2", "5.4.0-RC2", "1.1.1", "1.0.0" } );
+        args.add( new Object[] { "1.4.2", "5.4.2", "1.1.1", "1.0.0" } );
+        args.add( new Object[] { "1.5.0-M1", "5.5.0-M1", "1.1.1", "1.0.0" } );
+        args.add( new Object[] { "1.5.0-SNAPSHOT", "5.5.0-SNAPSHOT", "1.2.0-SNAPSHOT", "1.0.0" } );
         return args;
     }
 
diff --git a/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml b/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
index e90cd36..ea04ce2 100644
--- a/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
+++ b/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
@@ -70,6 +70,7 @@
                 <artifactId>maven-surefire-plugin</artifactId>
                 <version>${surefire.version}</version>
                 <configuration>
+                    <forkCount>1.0C</forkCount>
                     <redirectTestOutputToFile>true</redirectTestOutputToFile>
                     <statelessReporter implementation="org.apache.maven.plugin.surefire.extensions.JUnit5Xml30StatelessReporter">
                         <usePhrasedFileName>false</usePhrasedFileName>
diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
index 7c3e046..3eda924 100644
--- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
+++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
@@ -20,6 +20,7 @@ package org.apache.maven.surefire.junitcore;
  */
 
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
+import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
@@ -106,6 +107,6 @@ public class JUnitCoreTester
         File target = new File( "./target" );
         File statisticsFile = new File( target, "TESTHASHxXML" );
         return new StartupReportConfiguration( true, true, "PLAIN", false, target, false, null, statisticsFile,
-                false, 0, null, null, false, new DefaultStatelessReporter() );
+                false, 0, null, null, false, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
     }
 }


[maven-surefire] 02/02: implemented extension StatelessTestsetInfoReporter

Posted by ti...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch 1546-1222
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit 767deae5e06b3c97b34d9ec408bf3481e2ead834
Author: tibordigana <ti...@apache.org>
AuthorDate: Wed Apr 24 03:57:29 2019 +0200

    implemented extension StatelessTestsetInfoReporter
---
 .../plugin/surefire/AbstractSurefireMojo.java      | 18 +++++++--
 .../maven/plugin/surefire/CommonReflector.java     | 17 ++++++---
 .../surefire/StartupReportConfiguration.java       | 35 ++++++++++++++---
 .../DefaultStatelessTestsetInfoReporter.java       |  4 +-
 .../JUnit5StatelessTestsetInfoReporter.java        | 44 +++++++++++++++++++++-
 .../plugin/surefire/report/ConsoleReporter.java    | 17 ++++++---
 .../surefire/report/DefaultReporterFactory.java    | 20 +++++-----
 .../maven/plugin/surefire/report/FileReporter.java | 14 +++++--
 .../surefire/report/NullConsoleReporter.java       |  2 +-
 .../plugin/surefire/report/NullFileReporter.java   |  2 +-
 .../plugin/surefire/report/TestSetRunListener.java | 11 ++++--
 .../maven/plugin/surefire/report/TestSetStats.java | 37 +++++++++++-------
 .../plugin/surefire/report/WrappedReportEntry.java | 11 ++++--
 .../booterclient/TestSetMockReporterFactory.java   |  4 +-
 .../report/DefaultReporterFactoryTest.java         |  4 +-
 .../maven/surefire/report/FileReporterTest.java    |  4 +-
 .../surefire/report/CategorizedReportEntry.java    | 10 ++++-
 .../apache/maven/surefire/report/ReportEntry.java  |  7 ++++
 .../maven/surefire/report/SimpleReportEntry.java   |  6 +++
 surefire-its/pom.xml                               |  4 +-
 .../apache/maven/surefire/its/JUnitPlatformIT.java | 19 +++++++++-
 .../junit-platform-engine-jupiter/pom.xml          | 13 +++++++
 .../maven/surefire/junitcore/JUnitCoreTester.java  |  4 +-
 23 files changed, 235 insertions(+), 72 deletions(-)

diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
index 5dc9288..6127e4c 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/AbstractSurefireMojo.java
@@ -28,6 +28,7 @@ import org.apache.maven.model.Dependency;
 import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReportMojoConfiguration;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
+import org.apache.maven.plugin.surefire.extensions.DefaultStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.report.TestSetStats;
 import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.plugins.annotations.Component;
@@ -76,6 +77,7 @@ import org.apache.maven.surefire.booter.SurefireExecutionException;
 import org.apache.maven.surefire.cli.CommandLineOption;
 import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReporter;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoReporter;
 import org.apache.maven.surefire.providerapi.SurefireProvider;
 import org.apache.maven.surefire.report.ReporterConfiguration;
 import org.apache.maven.surefire.suite.RunResult;
@@ -166,10 +168,15 @@ public abstract class AbstractSurefireMojo
     /**
      * Note: use the legacy system property <em>disableXmlReport</em> set to {@code true} to disable the report.
      */
-
     @Parameter private
     StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> statelessReporter;
 
+    @Parameter
+    private ConsoleOutputReporter consoleOutputReporter;
+
+    @Parameter
+    private StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats> statelessTestsetInfoReporter;
+
     /**
      * Information about this plugin, mainly used to lookup this plugin's configuration from the currently executing
      * project.
@@ -1957,14 +1964,19 @@ public abstract class AbstractSurefireMojo
 
         xmlReporter.setDisable( isDisableXmlReport() ); // todo change to Boolean in the version 3.0.0-M6
 
-        ConsoleOutputReporter consoleOutputReporter = new DefaultConsoleOutputReporter();
+        ConsoleOutputReporter outReporter =
+                consoleOutputReporter == null ? new DefaultConsoleOutputReporter() : consoleOutputReporter;
+
+        StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats> testsetReporter =
+                statelessTestsetInfoReporter == null
+                        ? new DefaultStatelessTestsetInfoReporter() : statelessTestsetInfoReporter;
 
         return new StartupReportConfiguration( isUseFile(), isPrintSummary(), getReportFormat(),
                                                isRedirectTestOutputToFile(),
                                                getReportsDirectory(), isTrimStackTrace(), getReportNameSuffix(),
                                                getStatisticsFile( configChecksum ), requiresRunHistory(),
                                                getRerunFailingTestsCount(), getReportSchemaLocation(), getEncoding(),
-                                               isForkMode, xmlReporter, consoleOutputReporter );
+                                               isForkMode, xmlReporter, outReporter, testsetReporter );
     }
 
     private boolean isSpecificTestSpecified()
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
index 8d00125..b49ce4f 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/CommonReflector.java
@@ -24,6 +24,7 @@ import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.surefire.booter.SurefireReflector;
 import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReporter;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoReporter;
 import org.apache.maven.surefire.util.SurefireReflectionException;
 
 import javax.annotation.Nonnull;
@@ -43,6 +44,7 @@ public class CommonReflector
     private final Class<?> consoleLogger;
     private final Class<?> statelessReporter;
     private final Class<?> consoleOutputReporter;
+    private final Class<?> statelessTestsetInfoReporter;
     private final ClassLoader surefireClassLoader;
 
     public CommonReflector( @Nonnull ClassLoader surefireClassLoader )
@@ -55,6 +57,8 @@ public class CommonReflector
             consoleLogger = surefireClassLoader.loadClass( ConsoleLogger.class.getName() );
             statelessReporter = surefireClassLoader.loadClass( StatelessReporter.class.getName() );
             consoleOutputReporter = surefireClassLoader.loadClass( ConsoleOutputReporter.class.getName() );
+            statelessTestsetInfoReporter =
+                    surefireClassLoader.loadClass( StatelessTestsetInfoReporter.class.getName() );
         }
         catch ( ClassNotFoundException e )
         {
@@ -75,10 +79,11 @@ public class CommonReflector
     private Object createStartupReportConfiguration( @Nonnull StartupReportConfiguration reporterConfiguration )
     {
         Constructor<?> constructor = getConstructor( startupReportConfiguration, boolean.class, boolean.class,
-                                                           String.class, boolean.class, File.class,
-                                                           boolean.class, String.class, File.class, boolean.class,
-                                                           int.class, String.class, String.class, boolean.class,
-                                                           statelessReporter, consoleOutputReporter );
+                                                     String.class, boolean.class, File.class,
+                                                     boolean.class, String.class, File.class, boolean.class,
+                                                     int.class, String.class, String.class, boolean.class,
+                                                     statelessReporter, consoleOutputReporter,
+                                                     statelessTestsetInfoReporter );
         //noinspection BooleanConstructorCall
         Object[] params = { reporterConfiguration.isUseFile(), reporterConfiguration.isPrintSummary(),
             reporterConfiguration.getReportFormat(), reporterConfiguration.isRedirectTestOutputToFile(),
@@ -88,9 +93,9 @@ public class CommonReflector
             reporterConfiguration.getRerunFailingTestsCount(), reporterConfiguration.getXsdSchemaLocation(),
             reporterConfiguration.getEncoding().name(), reporterConfiguration.isForkMode(),
             reporterConfiguration.getXmlReporter().clone( surefireClassLoader ),
-            reporterConfiguration.getConsoleOutputReporter().clone( surefireClassLoader )
+            reporterConfiguration.getConsoleOutputReporter().clone( surefireClassLoader ),
+            reporterConfiguration.getTestsetReporter().clone( surefireClassLoader )
         };
         return newInstance( constructor, params );
     }
-
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
index 9bfbd12..a68a8f5 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/StartupReportConfiguration.java
@@ -20,7 +20,7 @@ package org.apache.maven.plugin.surefire;
  */
 
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReportMojoConfiguration;
-import org.apache.maven.plugin.surefire.report.FileReporter;
+import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.report.TestSetStats;
 import org.apache.maven.plugin.surefire.report.WrappedReportEntry;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
@@ -28,6 +28,9 @@ import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.ConsoleOutputReporter;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReporter;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoReporter;
 
 import javax.annotation.Nonnull;
 import java.io.File;
@@ -88,6 +91,8 @@ public final class StartupReportConfiguration
 
     private final ConsoleOutputReporter consoleOutputReporter;
 
+    private final StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats> testsetReporter;
+
     private StatisticsReporter statisticsReporter;
 
     @SuppressWarnings( "checkstyle:parameternumber" )
@@ -97,7 +102,8 @@ public final class StartupReportConfiguration
                File statisticsFile, boolean requiresRunHistory, int rerunFailingTestsCount,
                String xsdSchemaLocation, String encoding, boolean isForkMode,
                StatelessReporter<WrappedReportEntry, TestSetStats, DefaultStatelessReportMojoConfiguration> xmlReporter,
-               ConsoleOutputReporter consoleOutputReporter )
+               ConsoleOutputReporter consoleOutputReporter,
+               StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats> testsetReporter )
     {
         this.useFile = useFile;
         this.printSummary = printSummary;
@@ -117,6 +123,7 @@ public final class StartupReportConfiguration
         this.isForkMode = isForkMode;
         this.xmlReporter = xmlReporter;
         this.consoleOutputReporter = consoleOutputReporter;
+        this.testsetReporter = testsetReporter;
     }
 
     public boolean isUseFile()
@@ -180,13 +187,21 @@ public final class StartupReportConfiguration
         return isDisableXmlReport() ? null : xmlReporter.createListener( xmlReporterConfig );
     }
 
-    public FileReporter instantiateFileReporter( Integer forkNumber )
+    public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> instantiateFileReporter(
+            Integer forkNumber )
     {
-        return isUseFile() && isBriefOrPlainFormat()
-            ? new FileReporter( resolveReportsDirectory( forkNumber ), reportNameSuffix, encoding, false )
+        return !testsetReporter.isDisable() && isUseFile() && isBriefOrPlainFormat()
+            ? testsetReporter.createListener( resolveReportsDirectory( forkNumber ), reportNameSuffix, encoding )
             : null;
     }
 
+    public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> instantiateConsoleReporter(
+            ConsoleLogger consoleLogger )
+    {
+        return !testsetReporter.isDisable() && shouldReportToConsole()
+                ? testsetReporter.createListener( consoleLogger ) : null;
+    }
+
     public boolean isBriefOrPlainFormat()
     {
         String fmt = getReportFormat();
@@ -259,4 +274,14 @@ public final class StartupReportConfiguration
     {
         return consoleOutputReporter;
     }
+
+    public StatelessTestsetInfoReporter<WrappedReportEntry, TestSetStats> getTestsetReporter()
+    {
+        return testsetReporter;
+    }
+
+    private boolean shouldReportToConsole()
+    {
+        return isUseFile() ? isPrintSummary() : isRedirectTestOutputToFile() || isBriefOrPlainFormat();
+    }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
index 2f57966..499d220 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/DefaultStatelessTestsetInfoReporter.java
@@ -45,14 +45,14 @@ public class DefaultStatelessTestsetInfoReporter
     public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             ConsoleLogger logger )
     {
-        return new ConsoleReporter( logger );
+        return new ConsoleReporter( logger, false, false );
     }
 
     @Override
     public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             File reportsDirectory, String reportNameSuffix, Charset encoding )
     {
-        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, false );
+        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, false, false, false );
     }
 
     @Override
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
index 333a8d9..27c4a51 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/extensions/JUnit5StatelessTestsetInfoReporter.java
@@ -48,6 +48,24 @@ public class JUnit5StatelessTestsetInfoReporter
      */
     private boolean usePhrasedFileName;
 
+    /**
+     * Phrased class name of test case in the console log (see xxx)
+     * <em>Running xxx</em> or file report log <em>Test set: xxx</em>.
+     * {@code false} by default.
+     * <br>
+     * This action takes effect only in JUnit5 provider together with a test class annotated <em>DisplayName</em>.
+     */
+    private boolean usePhrasedClassNameInRunning;
+
+    /**
+     * Phrased class name of test case in the log (see xxx)
+     * <em>Tests run: ., Failures: ., Errors: ., Skipped: ., Time elapsed: . s, - in xxx</em>.
+     * {@code false} by default.
+     * <br>
+     * This action takes effect only in JUnit5 provider together with a test class annotated <em>DisplayName</em>.
+     */
+    private boolean usePhrasedClassNameInTestCaseSummary;
+
     public boolean isUsePhrasedFileName()
     {
         return usePhrasedFileName;
@@ -58,18 +76,40 @@ public class JUnit5StatelessTestsetInfoReporter
         this.usePhrasedFileName = usePhrasedFileName;
     }
 
+    public boolean isUsePhrasedClassNameInRunning()
+    {
+        return usePhrasedClassNameInRunning;
+    }
+
+    public void setUsePhrasedClassNameInRunning( boolean usePhrasedClassNameInRunning )
+    {
+        this.usePhrasedClassNameInRunning = usePhrasedClassNameInRunning;
+    }
+
+    public boolean isUsePhrasedClassNameInTestCaseSummary()
+    {
+        return usePhrasedClassNameInTestCaseSummary;
+    }
+
+    public void setUsePhrasedClassNameInTestCaseSummary( boolean usePhrasedClassNameInTestCaseSummary )
+    {
+        this.usePhrasedClassNameInTestCaseSummary = usePhrasedClassNameInTestCaseSummary;
+    }
+
     @Override
     public StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             ConsoleLogger logger )
     {
-        return new ConsoleReporter( logger );
+        return new ConsoleReporter( logger, isUsePhrasedClassNameInRunning(),
+                                    isUsePhrasedClassNameInTestCaseSummary() );
     }
 
     @Override
     public StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> createListener(
             File reportsDirectory, String reportNameSuffix, Charset encoding )
     {
-        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, isUsePhrasedFileName() );
+        return new FileReporter( reportsDirectory, reportNameSuffix, encoding, isUsePhrasedFileName(),
+                                 isUsePhrasedClassNameInRunning(), isUsePhrasedClassNameInTestCaseSummary() );
     }
 
     @Override
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
index 91a3fe0..0bee687 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/ConsoleReporter.java
@@ -41,22 +41,27 @@ public class ConsoleReporter
         extends StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats>
 {
     public static final String BRIEF = "brief";
-
     public static final String PLAIN = "plain";
-
     private static final String TEST_SET_STARTING_PREFIX = "Running ";
 
-    public ConsoleReporter( ConsoleLogger logger )
+    private final boolean usePhrasedClassNameInRunning;
+    private final boolean usePhrasedClassNameInTestCaseSummary;
+
+    public ConsoleReporter( ConsoleLogger logger,
+                            boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary )
     {
         super( logger );
+        this.usePhrasedClassNameInRunning = usePhrasedClassNameInRunning;
+        this.usePhrasedClassNameInTestCaseSummary = usePhrasedClassNameInTestCaseSummary;
     }
 
     @Override
     public void testSetStarting( TestSetReportEntry report )
     {
-        MessageBuilder builder = buffer();
+        MessageBuilder builder = buffer().a( TEST_SET_STARTING_PREFIX );
+        String runningTestCase = concatenateWithTestGroup( builder, report, usePhrasedClassNameInRunning );
         getConsoleLogger()
-                .info( concatenateWithTestGroup( builder.a( TEST_SET_STARTING_PREFIX ), report ) );
+                .info( runningTestCase );
     }
 
     @Override
@@ -69,7 +74,7 @@ public class ConsoleReporter
         boolean flakes = testSetStats.getSkipped() > 0;
         Level level = resolveLevel( success, failures, errors, skipped, flakes );
 
-        println( testSetStats.getColoredTestSetSummary( report ), level );
+        println( testSetStats.getColoredTestSetSummary( report, usePhrasedClassNameInTestCaseSummary ), level );
         for ( String testResult : testResults )
         {
             println( testResult, level );
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
index 2309f31..0d5a9a5 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactory.java
@@ -26,6 +26,8 @@ import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
 import org.apache.maven.shared.utils.logging.MessageBuilder;
 import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
 import org.apache.maven.surefire.report.ReporterFactory;
 import org.apache.maven.surefire.report.RunListener;
 import org.apache.maven.surefire.report.RunStatistics;
@@ -115,14 +117,17 @@ public class DefaultReporterFactory
         return reportConfiguration.getReportsDirectory();
     }
 
-    private ConsoleReporter createConsoleReporter()
+    private StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> createConsoleReporter()
     {
-        return shouldReportToConsole() ? new ConsoleReporter( consoleLogger ) : NullConsoleReporter.INSTANCE;
+        StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> consoleReporter =
+                reportConfiguration.instantiateConsoleReporter( consoleLogger );
+        return useNonNull( consoleReporter, NullConsoleReporter.INSTANCE );
     }
 
-    private FileReporter createFileReporter()
+    private StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> createFileReporter()
     {
-        FileReporter fileReporter = reportConfiguration.instantiateFileReporter( forkNumber );
+        StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> fileReporter =
+                reportConfiguration.instantiateFileReporter( forkNumber );
         return useNonNull( fileReporter, NullFileReporter.INSTANCE );
     }
 
@@ -146,13 +151,6 @@ public class DefaultReporterFactory
         return useNonNull( statisticsReporter, NullStatisticsReporter.INSTANCE );
     }
 
-    private boolean shouldReportToConsole()
-    {
-        return reportConfiguration.isUseFile()
-                       ? reportConfiguration.isPrintSummary()
-                       : reportConfiguration.isRedirectTestOutputToFile() || reportConfiguration.isBriefOrPlainFormat();
-    }
-
     public void mergeFromOtherFactories( Collection<DefaultReporterFactory> factories )
     {
         for ( DefaultReporterFactory factory : factories )
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
index 8dc34a0..2301e34 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/FileReporter.java
@@ -44,11 +44,16 @@ public class FileReporter
         extends StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats>
 {
     private final boolean usePhrasedFileName;
+    private final boolean usePhrasedClassNameInRunning;
+    private final boolean usePhrasedClassNameInTestCaseSummary;
 
-    public FileReporter( File reportsDirectory, String reportNameSuffix, Charset encoding, boolean usePhrasedFileName )
+    public FileReporter( File reportsDirectory, String reportNameSuffix, Charset encoding, boolean usePhrasedFileName,
+                         boolean usePhrasedClassNameInRunning, boolean usePhrasedClassNameInTestCaseSummary )
     {
         super( reportsDirectory, reportNameSuffix, encoding );
         this.usePhrasedFileName = usePhrasedFileName;
+        this.usePhrasedClassNameInRunning = usePhrasedClassNameInRunning;
+        this.usePhrasedClassNameInTestCaseSummary = usePhrasedClassNameInTestCaseSummary;
     }
 
     static File getReportFile( File reportsDirectory, String reportEntryName, String reportNameSuffix,
@@ -65,7 +70,7 @@ public class FileReporter
         File reportFile = getReportFile( getReportsDirectory(),
                                          usePhrasedFileName ? report.getReportSourceName() : report.getSourceName(),
                                          getReportNameSuffix(),
-                              ".txt" );
+                                         ".txt" );
 
         File reportDir = reportFile.getParentFile();
 
@@ -77,13 +82,14 @@ public class FileReporter
             writer.write( "-------------------------------------------------------------------------------" );
             writer.newLine();
 
-            writer.write( "Test set: " + report.getSourceName() );
+            String tesSet = usePhrasedClassNameInRunning ? report.getReportSourceName() : report.getSourceName();
+            writer.write( "Test set: " + tesSet );
             writer.newLine();
 
             writer.write( "-------------------------------------------------------------------------------" );
             writer.newLine();
 
-            writer.write( testSetStats.getTestSetSummary( report ) );
+            writer.write( testSetStats.getTestSetSummary( report, usePhrasedClassNameInTestCaseSummary ) );
             writer.newLine();
             for ( String testResult : testResults )
             {
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
index 76f9563..f33fca1 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullConsoleReporter.java
@@ -38,7 +38,7 @@ class NullConsoleReporter
 
     private NullConsoleReporter()
     {
-        super( new NullConsoleLogger() );
+        super( new NullConsoleLogger(), false, false );
     }
 
     @Override
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
index c0e546f..be217eb 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/NullFileReporter.java
@@ -35,7 +35,7 @@ class NullFileReporter
 
     private NullFileReporter()
     {
-        super( null, null, null, false );
+        super( null, null, null, false, false, false );
     }
 
     @Override
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
index f97140c..5205a34 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetRunListener.java
@@ -29,6 +29,8 @@ import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.plugin.surefire.runorder.StatisticsReporter;
 import org.apache.maven.surefire.extensions.ConsoleOutputReportEventListener;
 import org.apache.maven.surefire.extensions.StatelessReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoConsoleReportEventListener;
+import org.apache.maven.surefire.extensions.StatelessTestsetInfoFileReportEventListener;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
 import org.apache.maven.surefire.report.ReportEntry;
 import org.apache.maven.surefire.report.RunListener;
@@ -61,9 +63,9 @@ public class TestSetRunListener
 
     private final StatelessReportEventListener<WrappedReportEntry, TestSetStats> simpleXMLReporter;
 
-    private final ConsoleReporter consoleReporter;
+    private final StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats> consoleReporter;
 
-    private final FileReporter fileReporter;
+    private final StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats> fileReporter;
 
     private final StatisticsReporter statisticsReporter;
 
@@ -74,7 +76,10 @@ public class TestSetRunListener
     private volatile RunMode runMode = NORMAL_RUN;
 
     @SuppressWarnings( "checkstyle:parameternumber" )
-    public TestSetRunListener( ConsoleReporter consoleReporter, FileReporter fileReporter,
+    public TestSetRunListener( StatelessTestsetInfoConsoleReportEventListener<WrappedReportEntry, TestSetStats>
+                                           consoleReporter,
+                               StatelessTestsetInfoFileReportEventListener<WrappedReportEntry, TestSetStats>
+                                       fileReporter,
                                StatelessReportEventListener<WrappedReportEntry, TestSetStats> simpleXMLReporter,
                                ConsoleOutputReportEventListener consoleOutputReceiver,
                                StatisticsReporter statisticsReporter, boolean trimStackTrace,
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java
index 2d9dfbb..3e360c1 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/TestSetStats.java
@@ -170,7 +170,7 @@ public class TestSetStats
         completedCount += 1;
     }
 
-    public String getTestSetSummary( WrappedReportEntry reportEntry )
+    public String getTestSetSummary( WrappedReportEntry reportEntry, boolean phrasedClassName )
     {
         String summary = TESTS_RUN + completedCount
                                  + COMMA
@@ -187,12 +187,13 @@ public class TestSetStats
             summary += FAILURE_MARKER;
         }
 
-        summary += IN_MARKER + reportEntry.getNameWithGroup();
+        summary += IN_MARKER;
+        summary += phrasedClassName ? reportEntry.getReportNameWithGroup() : reportEntry.getNameWithGroup();
 
         return summary;
     }
 
-    public String getColoredTestSetSummary( WrappedReportEntry reportEntry )
+    public String getColoredTestSetSummary( WrappedReportEntry reportEntry, boolean phrasedClassName )
     {
         final boolean isSuccessful = failures == 0 && errors == 0 && skipped == 0;
         final boolean isFailure = failures > 0;
@@ -256,7 +257,7 @@ public class TestSetStats
             builder.failure( FAILURE_MARKER );
         }
         builder.a( IN_MARKER );
-        return concatenateWithTestGroup( builder, reportEntry );
+        return concatenateWithTestGroup( builder, reportEntry, phrasedClassName );
     }
 
     public List<String> getTestResults()
@@ -288,21 +289,29 @@ public class TestSetStats
 
     /**
      * Append the test set message for a report.
-     * e.g. "org.foo.BarTest ( of group )"
+     * e.g. "org.foo.BarTest ( of group )" or phrased text "test class description ( of group )".
      *
      * @param builder    MessageBuilder with preceded text inside
      * @param report     report whose test set is starting
      * @return the message
      */
-    static String concatenateWithTestGroup( MessageBuilder builder, ReportEntry report )
+    static String concatenateWithTestGroup( MessageBuilder builder, ReportEntry report, boolean phrasedClassName )
     {
-        final String testClass = report.getNameWithGroup();
-        int indexOfGroup = testClass.indexOf( GROUP_PREFIX );
-        int delimiter = testClass.lastIndexOf( '.', indexOfGroup == -1 ? testClass.length() : indexOfGroup );
-        String pkg = testClass.substring( 0, 1 + delimiter );
-        String cls = testClass.substring( 1 + delimiter );
-        return builder.a( pkg )
-                       .strong( cls )
-                       .toString();
+        if ( phrasedClassName )
+        {
+            return builder.strong( report.getReportNameWithGroup() )
+                    .toString();
+        }
+        else
+        {
+            String testClass = report.getNameWithGroup();
+            int indexOfGroup = testClass.indexOf( GROUP_PREFIX );
+            int delimiter = testClass.lastIndexOf( '.', indexOfGroup == -1 ? testClass.length() : indexOfGroup );
+            String pkg = testClass.substring( 0, 1 + delimiter );
+            String cls = testClass.substring( 1 + delimiter );
+            return builder.a( pkg )
+                    .strong( cls )
+                    .toString();
+        }
     }
 }
diff --git a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
index fd4bba3..102eea4 100644
--- a/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
+++ b/maven-surefire-common/src/main/java/org/apache/maven/plugin/surefire/report/WrappedReportEntry.java
@@ -25,7 +25,6 @@ import org.apache.maven.surefire.report.TestSetReportEntry;
 
 import java.util.Collections;
 import java.util.Map;
-import java.util.Objects;
 
 import static java.util.Collections.unmodifiableMap;
 import static org.apache.maven.plugin.surefire.report.ReporterUtils.formatElapsedTime;
@@ -159,7 +158,7 @@ public class WrappedReportEntry
     {
         String sourceName = getSourceName();
         String sourceText = getSourceText();
-        return isBlank( sourceText ) || Objects.equals( sourceName, sourceText ) ? sourceName : sourceText;
+        return isBlank( sourceText ) ? sourceName : sourceText;
     }
 
     String getReportSourceName( String suffix )
@@ -176,7 +175,7 @@ public class WrappedReportEntry
     {
         String name = getName();
         String nameText = getNameText();
-        return isBlank( nameText ) || Objects.equals( name, nameText ) ? name : nameText;
+        return isBlank( nameText ) ? name : nameText;
     }
 
     public String getOutput( boolean trimStackTrace )
@@ -220,6 +219,12 @@ public class WrappedReportEntry
     }
 
     @Override
+    public String getReportNameWithGroup()
+    {
+        return original.getReportNameWithGroup();
+    }
+
+    @Override
     public Map<String, String> getSystemProperties()
     {
         return systemProperties;
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 b646800..9435bda 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
@@ -22,6 +22,7 @@ package org.apache.maven.plugin.surefire.booterclient;
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
 import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
+import org.apache.maven.plugin.surefire.extensions.DefaultStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.surefire.report.RunListener;
@@ -58,6 +59,7 @@ public class TestSetMockReporterFactory
         File target = new File( "./target" );
         File statisticsFile = new File( target, "TESTHASH" );
         return new StartupReportConfiguration( true, true, "PLAIN", false, target, false, null, statisticsFile,
-                false, 0, null, null, true, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
+                false, 0, null, null, true, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter(),
+                new DefaultStatelessTestsetInfoReporter() );
     }
 }
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
index 37d9cbb..7476acd 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/plugin/surefire/report/DefaultReporterFactoryTest.java
@@ -30,6 +30,7 @@ import junit.framework.TestCase;
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
 import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
+import org.apache.maven.plugin.surefire.extensions.DefaultStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.log.api.ConsoleLogger;
 import org.apache.maven.shared.utils.logging.MessageUtils;
 import org.apache.maven.surefire.report.RunStatistics;
@@ -71,7 +72,8 @@ public class DefaultReporterFactoryTest
         StartupReportConfiguration reportConfig =
                 new StartupReportConfiguration( true, true, "PLAIN", false, reportsDirectory, false, null,
                         new File( reportsDirectory, "TESTHASH" ), false, 1, null, null, false,
-                        new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
+                        new DefaultStatelessReporter(), new DefaultConsoleOutputReporter(),
+                        new DefaultStatelessTestsetInfoReporter() );
 
         DummyTestReporter reporter = new DummyTestReporter();
 
diff --git a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
index ee63fc1..0b9d84b 100644
--- a/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
+++ b/maven-surefire-common/src/test/java/org/apache/maven/surefire/report/FileReporterTest.java
@@ -45,7 +45,7 @@ public class FileReporterTest
         reportEntry = new SimpleReportEntry( getClass().getName(), null, testName, null );
         WrappedReportEntry wrappedReportEntry =
             new WrappedReportEntry( reportEntry, ReportEntryType.SUCCESS, 12, null, null );
-        reporter = new FileReporter( reportDir, null, Charset.defaultCharset(), false );
+        reporter = new FileReporter( reportDir, null, Charset.defaultCharset(), false, false, false );
         reporter.testSetCompleted( wrappedReportEntry, createTestSetStats(), new ArrayList<String>() );
 
         File expectedReportFile = new File( reportDir, testName + ".txt" );
@@ -67,7 +67,7 @@ public class FileReporterTest
         reportEntry = new SimpleReportEntry( getClass().getName(), null, testName, null );
         WrappedReportEntry wrappedReportEntry =
             new WrappedReportEntry( reportEntry, ReportEntryType.SUCCESS, 12, null, null );
-        reporter = new FileReporter( reportDir, suffixText, Charset.defaultCharset(), false );
+        reporter = new FileReporter( reportDir, suffixText, Charset.defaultCharset(), false, false, false );
         reporter.testSetCompleted( wrappedReportEntry, createTestSetStats(), new ArrayList<String>() );
 
         File expectedReportFile = new File( reportDir, testName + "-" + suffixText + ".txt" );
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/report/CategorizedReportEntry.java b/surefire-api/src/main/java/org/apache/maven/surefire/report/CategorizedReportEntry.java
index 7d7a54b..c35d6d5 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/report/CategorizedReportEntry.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/report/CategorizedReportEntry.java
@@ -21,6 +21,7 @@ package org.apache.maven.surefire.report;
 
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * @author Kristian Rosenvold
@@ -86,6 +87,12 @@ public class CategorizedReportEntry
     }
 
     @Override
+    public String getReportNameWithGroup()
+    {
+        return isNameWithGroup() ? getSourceText() + GROUP_PREFIX + getGroup() + GROUP_SUFIX : getSourceText();
+    }
+
+    @Override
     public boolean equals( Object o )
     {
         if ( this == o )
@@ -103,8 +110,7 @@ public class CategorizedReportEntry
 
         CategorizedReportEntry that = (CategorizedReportEntry) o;
 
-        return !( group != null ? !group.equals( that.group ) : that.group != null );
-
+        return Objects.equals( group, that.group );
     }
 
     @Override
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/report/ReportEntry.java b/surefire-api/src/main/java/org/apache/maven/surefire/report/ReportEntry.java
index 9d93b6c..6bc9618 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/report/ReportEntry.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/report/ReportEntry.java
@@ -98,4 +98,11 @@ public interface ReportEntry
      * @return A string with the test case name and group/category, or just the name.
      */
     String getNameWithGroup();
+
+    /**
+     * A source text of the test case together with the group or category (if any exists).
+     *
+     * @return A string with the test case text and group/category, or just the source text.
+     */
+    String getReportNameWithGroup();
 }
diff --git a/surefire-api/src/main/java/org/apache/maven/surefire/report/SimpleReportEntry.java b/surefire-api/src/main/java/org/apache/maven/surefire/report/SimpleReportEntry.java
index 8e8367e..df7b4c4 100644
--- a/surefire-api/src/main/java/org/apache/maven/surefire/report/SimpleReportEntry.java
+++ b/surefire-api/src/main/java/org/apache/maven/surefire/report/SimpleReportEntry.java
@@ -236,6 +236,12 @@ public class SimpleReportEntry
     }
 
     @Override
+    public String getReportNameWithGroup()
+    {
+        return getSourceText();
+    }
+
+    @Override
     public Map<String, String> getSystemProperties()
     {
         return systemProperties;
diff --git a/surefire-its/pom.xml b/surefire-its/pom.xml
index 9bc0b85..c6523cd 100644
--- a/surefire-its/pom.xml
+++ b/surefire-its/pom.xml
@@ -170,9 +170,7 @@
                     <forkMode>once</forkMode>
                     <argLine>-server -Xmx64m -XX:+UseG1GC -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Djava.awt.headless=true -Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
                     <includes>
-                        <include>org/apache/**/Surefire1396CustomProviderClassPathIT.java</include>
-                        <include>org/apache/**/JUnitPlatformIT.java</include>
-                        <include>org/apache/**/JUnitPlatformEnginesIT.java</include>
+                        <include>org/apache/**/*IT*.java</include>
                     </includes>
                     <!-- Pass current surefire version to the main suite so that it -->
                     <!-- can forward to all integration test projects. SUREFIRE-513 -->
diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
index 73f3748..161938f 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
@@ -54,7 +54,24 @@ public class JUnitPlatformIT
                 .verifyErrorFree( 7 );
 
         validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest.txt", UTF_8 )
-                 .assertContainsText( convertUnicodeToUTF8( "<< ✨ >>" ) );
+                 .assertContainsText( "<< ✨ >>" );
+
+        validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest.txt", UTF_8 )
+                .assertContainsText( "Test set: << ✨ >>" );
+
+        validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest.txt", UTF_8 )
+                .assertContainsText( " - in << ✨ >>" );
+
+
+        validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest-output.txt", UTF_8 )
+                .assertContainsText( "<< ✨ >>" );
+
+        validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest-output.txt", UTF_8 )
+                .assertContainsText( "73$71 ✔" );
+
+        validator.getSurefireReportsFile( "junitplatformenginejupiter.DisplayNameTest-output.txt", UTF_8 )
+                .assertContainsText( "73$72 ✔" );
+
 
         validator.getSurefireReportsFile( "TEST-junitplatformenginejupiter.DisplayNameTest.xml", UTF_8 )
         .assertContainsText( "testcase name=\"73$71 ✔\" classname=\"&lt;&lt; ✨ &gt;&gt;\"" )
diff --git a/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml b/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
index ea04ce2..4acb16a 100644
--- a/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
+++ b/surefire-its/src/test/resources/junit-platform-engine-jupiter/pom.xml
@@ -73,11 +73,24 @@
                     <forkCount>1.0C</forkCount>
                     <redirectTestOutputToFile>true</redirectTestOutputToFile>
                     <statelessReporter implementation="org.apache.maven.plugin.surefire.extensions.JUnit5Xml30StatelessReporter">
+                        <disable>false</disable>
+                        <version>3.0</version>
                         <usePhrasedFileName>false</usePhrasedFileName>
                         <usePhrasedTestSuiteClassName>false</usePhrasedTestSuiteClassName>
                         <usePhrasedTestCaseClassName>true</usePhrasedTestCaseClassName>
                         <usePhrasedTestCaseMethodName>true</usePhrasedTestCaseMethodName>
                     </statelessReporter>
+                    <consoleOutputReporter implementation="org.apache.maven.plugin.surefire.extensions.JUnit5ConsoleOutputReporter">
+                        <disable>false</disable>
+                        <encoding>UTF-8</encoding>
+                        <usePhrasedFileName>false</usePhrasedFileName>
+                    </consoleOutputReporter>
+                    <statelessTestsetInfoReporter implementation="org.apache.maven.plugin.surefire.extensions.JUnit5StatelessTestsetInfoReporter">
+                        <disable>false</disable>
+                        <usePhrasedFileName>false</usePhrasedFileName>
+                        <usePhrasedClassNameInRunning>true</usePhrasedClassNameInRunning>
+                        <usePhrasedClassNameInTestCaseSummary>true</usePhrasedClassNameInTestCaseSummary>
+                    </statelessTestsetInfoReporter>
                 </configuration>
             </plugin>
         </plugins>
diff --git a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
index 3eda924..5114482 100644
--- a/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
+++ b/surefire-providers/surefire-junit47/src/test/java/org/apache/maven/surefire/junitcore/JUnitCoreTester.java
@@ -22,6 +22,7 @@ package org.apache.maven.surefire.junitcore;
 import org.apache.maven.plugin.surefire.StartupReportConfiguration;
 import org.apache.maven.plugin.surefire.extensions.DefaultConsoleOutputReporter;
 import org.apache.maven.plugin.surefire.extensions.DefaultStatelessReporter;
+import org.apache.maven.plugin.surefire.extensions.DefaultStatelessTestsetInfoReporter;
 import org.apache.maven.plugin.surefire.log.api.NullConsoleLogger;
 import org.apache.maven.plugin.surefire.report.DefaultReporterFactory;
 import org.apache.maven.surefire.report.ConsoleOutputReceiver;
@@ -107,6 +108,7 @@ public class JUnitCoreTester
         File target = new File( "./target" );
         File statisticsFile = new File( target, "TESTHASHxXML" );
         return new StartupReportConfiguration( true, true, "PLAIN", false, target, false, null, statisticsFile,
-                false, 0, null, null, false, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter() );
+                false, 0, null, null, false, new DefaultStatelessReporter(), new DefaultConsoleOutputReporter(),
+                new DefaultStatelessTestsetInfoReporter() );
     }
 }