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

pkarwasz pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/logging-log4j2.git

commit 6983e119f10fde8566e82ed5f97a4c61874e8e94
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Fri Sep 8 16:27:30 2023 +0200

    Extend `ListStatusListener` logging range
    
    This extends the range of the status messages stored by
    `ListStatusListener` to include also those that are sent during the
    initialization phase of the entire test.
    
    This is necessary to deal with classes annotated with
    `@LoggerContextSource`.
    
    Part of #1776
---
 .../log4j/test/junit/StatusLoggerExtension.java    | 28 +++++++++++++++++-----
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
 
b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
index 0452d63bd8..cdbc220b49 100644
--- 
a/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
+++ 
b/log4j-api-test/src/main/java/org/apache/logging/log4j/test/junit/StatusLoggerExtension.java
@@ -26,6 +26,7 @@ import org.apache.logging.log4j.status.StatusConsoleListener;
 import org.apache.logging.log4j.status.StatusData;
 import org.apache.logging.log4j.status.StatusLogger;
 import org.apache.logging.log4j.test.ListStatusListener;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.BeforeEachCallback;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import 
org.junit.jupiter.api.extension.ExtensionContext.Store.CloseableResource;
@@ -34,7 +35,7 @@ import 
org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
 
 class StatusLoggerExtension extends 
TypeBasedParameterResolver<ListStatusListener>
-        implements BeforeEachCallback, TestExecutionExceptionHandler {
+        implements BeforeAllCallback, BeforeEachCallback, 
TestExecutionExceptionHandler {
 
     private static final StatusLogger LOGGER = StatusLogger.getLogger();
     private static final StatusConsoleListener CONSOLE_LISTENER = new 
StatusConsoleListener(Level.ALL);
@@ -44,9 +45,21 @@ class StatusLoggerExtension extends 
TypeBasedParameterResolver<ListStatusListene
         super(ListStatusListener.class);
     }
 
+    @Override
+    public void beforeAll(ExtensionContext context) throws Exception {
+        // Stores the per-class status listener to catch the messages caused 
by other
+        // `beforeAll` methods and extensions.
+        final ListStatusListenerHolder holder = new 
ListStatusListenerHolder(context, null);
+        ExtensionContextAnchor.setAttribute(KEY, holder, context);
+    }
+
     @Override
     public void beforeEach(final ExtensionContext context) throws Exception {
-        final ListStatusListenerHolder holder = new 
ListStatusListenerHolder(context);
+        // Retrieves the per-class status listener
+        final ListStatusListenerHolder parentHolder = 
ExtensionContextAnchor.getAttribute(KEY,
+                ListStatusListenerHolder.class, context);
+        final ListStatusListener parent = parentHolder != null ? 
parentHolder.getStatusListener() : null;
+        final ListStatusListenerHolder holder = new 
ListStatusListenerHolder(context, parent);
         ExtensionContextAnchor.setAttribute(KEY, holder, context);
     }
 
@@ -69,8 +82,8 @@ class StatusLoggerExtension extends 
TypeBasedParameterResolver<ListStatusListene
 
         private final ListStatusListener statusListener;
 
-        public ListStatusListenerHolder(final ExtensionContext context) {
-            this.statusListener = new JUnitListStatusListener(context);
+        public ListStatusListenerHolder(final ExtensionContext context, final 
ListStatusListener parent) {
+            this.statusListener = new JUnitListStatusListener(context, parent);
             LOGGER.registerListener(statusListener);
         }
 
@@ -88,10 +101,12 @@ class StatusLoggerExtension extends 
TypeBasedParameterResolver<ListStatusListene
     private static class JUnitListStatusListener implements ListStatusListener 
{
 
         private final ExtensionContext context;
+        private final ListStatusListener parent;
         private final ArrayList<StatusData> statusData = new ArrayList<>();
 
-        public JUnitListStatusListener(final ExtensionContext context) {
+        public JUnitListStatusListener(final ExtensionContext context, final 
ListStatusListener parent) {
             this.context = context;
+            this.parent = parent;
         }
 
         @Override
@@ -116,7 +131,8 @@ class StatusLoggerExtension extends 
TypeBasedParameterResolver<ListStatusListene
         @Override
         public Stream<StatusData> getStatusData() {
             synchronized (statusData) {
-                return ((List<StatusData>) statusData.clone()).stream();
+                final List<StatusData> clone = (List<StatusData>) 
statusData.clone();
+                return parent != null ? Stream.concat(parent.getStatusData(), 
clone.stream()) : clone.stream();
             }
         }
 

Reply via email to