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

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


The following commit(s) were added to refs/heads/master by this push:
     new 71fdc2c8c Fix capturing of output of JUnit `LauncherSessionListener` 
(#3157)
71fdc2c8c is described below

commit 71fdc2c8c59d3e48369ad27f84557193639440b2
Author: Daniel Clausen <[email protected]>
AuthorDate: Sat Jul 19 18:53:16 2025 +0200

    Fix capturing of output of JUnit `LauncherSessionListener` (#3157)
    
    * Adjust outputIsCaptured test for output from launcher session listeners
    
    * Make sure capturing output starts before opening the launcher session
    
    A launcher session listener can also produce output.
    We want to capture this. Therefore, we have to start capturing
    before opening the launcher session.
    
    * Update 
surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
    
    Co-authored-by: Marc Philipp <[email protected]>
    
    ---------
    
    Co-authored-by: Marc Philipp <[email protected]>
---
 .../junitplatform/JUnitPlatformProvider.java       |  8 ++--
 .../junitplatform/JUnitPlatformProviderTest.java   | 46 ++++++++++++++++++++--
 2 files changed, 46 insertions(+), 8 deletions(-)

diff --git 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
index 70e0cac92..3be6ceffd 100644
--- 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
+++ 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
@@ -107,11 +107,11 @@ public Iterable<Class<?>> getSuites() {
     public RunResult invoke(Object forkTestSet) throws TestSetFailedException, 
ReporterException {
         ReporterFactory reporterFactory = parameters.getReporterFactory();
         final RunResult runResult;
-        try (LauncherSessionAdapter launcherSession = 
launcherSessionFactory.openSession()) {
-            RunListenerAdapter adapter = new 
RunListenerAdapter(reporterFactory.createTestReportListener());
-            adapter.setRunMode(NORMAL_RUN);
+        RunListenerAdapter adapter = new 
RunListenerAdapter(reporterFactory.createTestReportListener());
+        adapter.setRunMode(NORMAL_RUN);
+        startCapture(adapter);
 
-            startCapture(adapter);
+        try (LauncherSessionAdapter launcherSession = 
launcherSessionFactory.openSession()) {
             setupJunitLogger();
             Launcher launcher = launcherSession.getLauncher();
             if (forkTestSet instanceof TestsToRun) {
diff --git 
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
 
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
index bde1c35c5..67ed25fb0 100644
--- 
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
+++ 
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
@@ -50,6 +50,7 @@
 import org.junit.jupiter.api.Nested;
 import org.junit.platform.launcher.EngineFilter;
 import org.junit.platform.launcher.LauncherSession;
+import org.junit.platform.launcher.LauncherSessionListener;
 import org.junit.platform.launcher.TestExecutionListener;
 import org.junit.platform.launcher.TestIdentifier;
 import org.junit.platform.launcher.TestPlan;
@@ -692,14 +693,24 @@ public void allDiscoveredTestsAreInvokedForNullArgument() 
throws Exception {
     public void outputIsCaptured() throws Exception {
         TestReportListener<TestOutputReportEntry> runListener = 
runListenerMock();
 
-        JUnitPlatformProvider provider = new 
JUnitPlatformProvider(providerParametersMock(runListener));
+        LauncherSessionFactory launcherSessionFactory =
+                launcherSessionFactoryWithLauncherSessionListener(new 
VerboseLauncherSessionListener());
+        JUnitPlatformProvider provider =
+                new JUnitPlatformProvider(providerParametersMock(runListener), 
launcherSessionFactory);
 
         invokeProvider(provider, VerboseTestClass.class);
 
         ArgumentCaptor<TestOutputReportEntry> captor = 
ArgumentCaptor.forClass(TestOutputReportEntry.class);
-        verify(runListener, times(2)).writeTestOutput(captor.capture());
-        assertThat(captor.getAllValues().get(0).getLog()).isEqualTo("stdout");
-        assertThat(captor.getAllValues().get(1).getLog()).isEqualTo("stderr");
+        verify(runListener, times(6)).writeTestOutput(captor.capture());
+        assertThat(captor.getAllValues())
+                .extracting(TestOutputReportEntry::getLog)
+                .containsExactly(
+                        "stdout from launcherSessionOpened",
+                        "stderr from launcherSessionOpened",
+                        "stdout",
+                        "stderr",
+                        "stdout from launcherSessionClosed",
+                        "stderr from launcherSessionClosed");
     }
 
     @Test
@@ -1141,6 +1152,18 @@ private static LauncherSessionFactory 
spyingLauncherSessionFactory(
         };
     }
 
+    private static LauncherSessionFactory 
launcherSessionFactoryWithLauncherSessionListener(
+            LauncherSessionListener launcherSessionListener) {
+        LauncherConfig launcherConfig = LauncherConfig.builder()
+                .addLauncherSessionListeners(launcherSessionListener)
+                .build();
+
+        return () -> {
+            LauncherSession session = 
LauncherFactory.openSession(launcherConfig);
+            return new ConcreteLauncherSessionAdapter(session);
+        };
+    }
+
     static class TestClass1 {
 
         static final int TESTS_FOUND = 4;
@@ -1207,6 +1230,21 @@ void test() {
         }
     }
 
+    static class VerboseLauncherSessionListener implements 
LauncherSessionListener {
+
+        @Override
+        public void launcherSessionOpened(LauncherSession session) {
+            System.out.println("stdout from launcherSessionOpened");
+            System.err.println("stderr from launcherSessionOpened");
+        }
+
+        @Override
+        public void launcherSessionClosed(LauncherSession session) {
+            System.out.println("stdout from launcherSessionClosed");
+            System.out.println("stderr from launcherSessionClosed");
+        }
+    }
+
     @Test
     public void usesClassNamesForXmlReport() throws TestSetFailedException {
         String[] classNames = {Sub1Tests.class.getName(), 
Sub2Tests.class.getName()};

Reply via email to