You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ma...@apache.org on 2022/05/28 00:02:53 UTC

[logging-log4j2] 04/05: Make LoggerContextResolver use ResourceCloseable

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

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

commit ef13901831439af5115293216f9b1c71839beb57
Author: Matt Sicker <ma...@apache.org>
AuthorDate: Fri May 27 18:04:53 2022 -0500

    Make LoggerContextResolver use ResourceCloseable
    
    Signed-off-by: Matt Sicker <ma...@apache.org>
---
 .../log4j/core/test/junit/AppenderResolver.java    |   4 +-
 .../core/test/junit/ConfigurationResolver.java     |   4 +-
 .../core/test/junit/LoggerContextResolver.java     | 147 +++++++++------------
 .../log4j/core/test/junit/LoggerResolver.java      |   4 +-
 .../log4j/core/test/junit/package-info.java        |   6 +-
 5 files changed, 71 insertions(+), 94 deletions(-)

diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
index 099cced825..99069b8e1d 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderResolver.java
@@ -25,7 +25,7 @@ import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 import org.junit.jupiter.api.extension.ParameterResolver;
 
-import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getParameterLoggerContext;
+import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext;
 
 class AppenderResolver implements ParameterResolver {
     @Override
@@ -38,7 +38,7 @@ class AppenderResolver implements ParameterResolver {
     @Override
     public Object resolveParameter(
             ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        final LoggerContext loggerContext = getParameterLoggerContext(parameterContext, extensionContext);
+        final LoggerContext loggerContext = getLoggerContext(extensionContext);
         if (loggerContext == null) {
             throw new ParameterResolutionException("No LoggerContext defined");
         }
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/ConfigurationResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/ConfigurationResolver.java
index 274a6d909f..5226308ec4 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/ConfigurationResolver.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/ConfigurationResolver.java
@@ -23,13 +23,13 @@ import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 
-import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getParameterLoggerContext;
+import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext;
 
 class ConfigurationResolver extends TypeBasedParameterResolver<Configuration> {
     @Override
     public Configuration resolveParameter(
             ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        final LoggerContext loggerContext = getParameterLoggerContext(parameterContext, extensionContext);
+        final LoggerContext loggerContext = getLoggerContext(extensionContext);
         if (loggerContext == null) {
             throw new ParameterResolutionException("No LoggerContext defined");
         }
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextResolver.java
index cbbe479a14..72410a93c2 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextResolver.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextResolver.java
@@ -25,7 +25,6 @@ import org.apache.logging.log4j.core.impl.Log4jContextFactory;
 import org.apache.logging.log4j.core.util.NetUtils;
 import org.apache.logging.log4j.plugins.di.DI;
 import org.apache.logging.log4j.plugins.di.Injector;
-import org.junit.jupiter.api.extension.AfterAllCallback;
 import org.junit.jupiter.api.extension.AfterEachCallback;
 import org.junit.jupiter.api.extension.BeforeAllCallback;
 import org.junit.jupiter.api.extension.BeforeEachCallback;
@@ -33,7 +32,6 @@ import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.ParameterContext;
 import org.junit.jupiter.api.extension.ParameterResolutionException;
 
-import java.lang.reflect.Method;
 import java.net.URI;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
@@ -41,23 +39,15 @@ import java.util.concurrent.TimeUnit;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> implements BeforeAllCallback,
-        AfterAllCallback, BeforeEachCallback, AfterEachCallback {
+        BeforeEachCallback, AfterEachCallback {
+    private static final String FQCN = LoggerContextResolver.class.getName();
+
     @Override
     public void beforeAll(ExtensionContext context) throws Exception {
         final Class<?> testClass = context.getRequiredTestClass();
         final LoggerContextSource testSource = testClass.getAnnotation(LoggerContextSource.class);
         if (testSource != null) {
-            final LoggerContextConfig config = new LoggerContextConfig(testSource, context);
-            getTestClassStore(context).put(LoggerContext.class, config);
-        }
-    }
-
-    @Override
-    public void afterAll(ExtensionContext context) throws Exception {
-        final LoggerContextConfig config =
-                getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
-        if (config != null) {
-            config.close();
+            setUpLoggerContext(testSource, context);
         }
     }
 
@@ -65,45 +55,32 @@ class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> im
     public void beforeEach(ExtensionContext context) throws Exception {
         final Class<?> testClass = context.getRequiredTestClass();
         if (testClass.isAnnotationPresent(LoggerContextSource.class)) {
-            final LoggerContextConfig config = getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
-            if (config == null) {
+            final ExtensionContext.Store testClassStore = context.getStore(ExtensionContext.Namespace.create(LoggerContextSource.class, testClass));
+            final LoggerContextAccessor accessor = testClassStore.get(LoggerContextAccessor.class, LoggerContextAccessor.class);
+            if (accessor == null) {
                 throw new IllegalStateException(
                         "Specified @LoggerContextSource but no LoggerContext found for test class " +
                                 testClass.getCanonicalName());
             }
-            if (config.reconfigurationPolicy == ReconfigurationPolicy.BEFORE_EACH) {
-                config.reconfigure();
+            if (testClassStore.get(ReconfigurationPolicy.class, ReconfigurationPolicy.class) == ReconfigurationPolicy.BEFORE_EACH) {
+                accessor.getLoggerContext().reconfigure();
             }
         }
         final LoggerContextSource source = context.getRequiredTestMethod().getAnnotation(LoggerContextSource.class);
         if (source != null) {
-            final LoggerContextConfig config = new LoggerContextConfig(source, context);
-            if (config.reconfigurationPolicy == ReconfigurationPolicy.BEFORE_EACH) {
-                config.reconfigure();
+            final LoggerContext loggerContext = setUpLoggerContext(source, context);
+            if (source.reconfigure() == ReconfigurationPolicy.BEFORE_EACH) {
+                loggerContext.reconfigure();
             }
-            getTestInstanceStore(context).put(LoggerContext.class, config);
         }
     }
 
     @Override
     public void afterEach(ExtensionContext context) throws Exception {
-        // method-annotated variant
-        final LoggerContextConfig testInstanceConfig =
-                getTestInstanceStore(context).get(LoggerContext.class, LoggerContextConfig.class);
-        if (testInstanceConfig != null) {
-            testInstanceConfig.close();
-        }
-        // reloadable variant
-        final Class<?> testClass = context.getRequiredTestClass();
-        if (testClass.isAnnotationPresent(LoggerContextSource.class)) {
-            final LoggerContextConfig config = getTestClassStore(context).get(LoggerContext.class, LoggerContextConfig.class);
-            if (config == null) {
-                throw new IllegalStateException(
-                        "Specified @LoggerContextSource but no LoggerContext found for test class " +
-                                testClass.getCanonicalName());
-            }
-            if (config.reconfigurationPolicy == ReconfigurationPolicy.AFTER_EACH) {
-                config.reconfigure();
+        if (context.getRequiredTestClass().isAnnotationPresent(LoggerContextSource.class)) {
+            final ExtensionContext.Store testClassStore = context.getStore(ExtensionContext.Namespace.create(LoggerContextSource.class, context.getRequiredTestClass()));
+            if (testClassStore.get(ReconfigurationPolicy.class, ReconfigurationPolicy.class) == ReconfigurationPolicy.AFTER_EACH) {
+                testClassStore.get(LoggerContextAccessor.class, LoggerContextAccessor.class).getLoggerContext().reconfigure();
             }
         }
     }
@@ -111,61 +88,63 @@ class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> im
     @Override
     public LoggerContext resolveParameter(
             ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
-        return getParameterLoggerContext(parameterContext, extensionContext);
+        return getLoggerContext(extensionContext);
     }
 
-    private static ExtensionContext.Store getTestClassStore(final ExtensionContext context) {
-        return context.getStore(ExtensionContext.Namespace.create(LoggerContext.class, context.getRequiredTestClass()));
+    static LoggerContext getLoggerContext(ExtensionContext context) {
+        final LoggerContextAccessor accessor = context.getTestInstance()
+                .map(instance -> context.getStore(ExtensionContext.Namespace.create(LoggerContextSource.class, instance))
+                        .get(LoggerContextAccessor.class, LoggerContextAccessor.class))
+                .orElseGet(() -> context.getStore(ExtensionContext.Namespace.create(LoggerContextSource.class, context.getRequiredTestClass()))
+                        .get(LoggerContextAccessor.class, LoggerContextAccessor.class));
+        assertNotNull(accessor);
+        return accessor.getLoggerContext();
     }
 
-    private static ExtensionContext.Store getTestInstanceStore(final ExtensionContext context) {
-        return context.getStore(ExtensionContext.Namespace.create(LoggerContext.class, context.getRequiredTestInstance()));
+    private static ExtensionContext.Store getTestStore(final ExtensionContext context) {
+        final Object storeContext = context.getTestInstance().orElseGet(context::getRequiredTestClass);
+        return context.getStore(ExtensionContext.Namespace.create(LoggerContextSource.class, storeContext));
     }
 
-    static LoggerContext getParameterLoggerContext(ParameterContext parameterContext, ExtensionContext extensionContext) {
-        if (parameterContext.getDeclaringExecutable() instanceof Method) {
-            final LoggerContextAccessor accessor =
-                    getTestInstanceStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class);
-            return accessor != null ? accessor.getLoggerContext() :
-                    getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class).getLoggerContext();
+    private static LoggerContext setUpLoggerContext(final LoggerContextSource source, final ExtensionContext extensionContext) {
+        final String displayName = extensionContext.getDisplayName();
+        final Injector injector = extensionContext.getTestInstance().map(DI::createInjector).orElseGet(DI::createInjector);
+        injector.init();
+        final Log4jContextFactory loggerContextFactory;
+        if (source.bootstrap()) {
+            loggerContextFactory = new Log4jContextFactory(injector);
+            LogManager.setFactory(loggerContextFactory);
+        } else {
+            loggerContextFactory = (Log4jContextFactory) LogManager.getFactory();
+        }
+        final Class<?> testClass = extensionContext.getRequiredTestClass();
+        final ClassLoader classLoader = testClass.getClassLoader();
+        final Map.Entry<String, Object> injectorContext = Map.entry(Injector.class.getName(), injector);
+        final String configLocation = source.value();
+        final URI configUri;
+        if (source.v1config()) {
+            System.setProperty(ConfigurationFactory.LOG4J1_CONFIGURATION_FILE_PROPERTY, configLocation);
+            configUri = null; // handled by system property
+        } else {
+            configUri = configLocation.isEmpty() ? null : NetUtils.toURI(configLocation);
         }
-        return getTestClassStore(extensionContext).get(LoggerContext.class, LoggerContextAccessor.class).getLoggerContext();
+        final LoggerContext context = loggerContextFactory.getContext(FQCN, classLoader, injectorContext, false, configUri, displayName);
+        assertNotNull(context, () -> "No LoggerContext created for " + testClass + " and config file " + configLocation);
+        final ExtensionContext.Store store = getTestStore(extensionContext);
+        store.put(ReconfigurationPolicy.class, source.reconfigure());
+        store.put(LoggerContextAccessor.class, new ContextHolder(context, source.timeout(), source.unit()));
+        return context;
     }
 
-    private static class LoggerContextConfig implements AutoCloseable, LoggerContextAccessor {
-        private static final String FQCN = LoggerContextConfig.class.getName();
+    private static class ContextHolder implements ExtensionContext.Store.CloseableResource, LoggerContextAccessor {
         private final LoggerContext context;
-        private final ReconfigurationPolicy reconfigurationPolicy;
         private final long shutdownTimeout;
         private final TimeUnit unit;
 
-        private LoggerContextConfig(final LoggerContextSource source, final ExtensionContext extensionContext) {
-            final String displayName = extensionContext.getDisplayName();
-            final Injector injector = extensionContext.getTestInstance().map(DI::createInjector).orElseGet(DI::createInjector);
-            injector.init();
-            final Log4jContextFactory loggerContextFactory;
-            if (source.bootstrap()) {
-                loggerContextFactory = new Log4jContextFactory(injector);
-                LogManager.setFactory(loggerContextFactory);
-            } else {
-                loggerContextFactory = (Log4jContextFactory) LogManager.getFactory();
-            }
-            final Class<?> testClass = extensionContext.getRequiredTestClass();
-            final ClassLoader classLoader = testClass.getClassLoader();
-            final Map.Entry<String, Object> injectorContext = Map.entry(Injector.class.getName(), injector);
-            final String configLocation = source.value();
-            final URI configUri;
-            if (source.v1config()) {
-                System.setProperty(ConfigurationFactory.LOG4J1_CONFIGURATION_FILE_PROPERTY, configLocation);
-                configUri = null; // handled by system property
-            } else {
-                configUri = configLocation.isEmpty() ? null : NetUtils.toURI(configLocation);
-            }
-            context = loggerContextFactory.getContext(FQCN, classLoader, injectorContext, false, configUri, displayName);
-            assertNotNull(context, () -> "No LoggerContext created for " + testClass + " and config file " + configLocation);
-            reconfigurationPolicy = source.reconfigure();
-            shutdownTimeout = source.timeout();
-            unit = source.unit();
+        private ContextHolder(final LoggerContext context, final long shutdownTimeout, final TimeUnit unit) {
+            this.context = context;
+            this.shutdownTimeout = shutdownTimeout;
+            this.unit = unit;
         }
 
         @Override
@@ -173,12 +152,8 @@ class LoggerContextResolver extends TypeBasedParameterResolver<LoggerContext> im
             return context;
         }
 
-        public void reconfigure() {
-            context.reconfigure();
-        }
-
         @Override
-        public void close() {
+        public void close() throws Throwable {
             try {
                 context.stop(shutdownTimeout, unit);
             } finally {
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerResolver.java
index b31d26d333..80f72a8b14 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerResolver.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerResolver.java
@@ -27,7 +27,7 @@ import org.junit.jupiter.api.extension.ParameterResolver;
 
 import java.lang.reflect.Parameter;
 
-import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getParameterLoggerContext;
+import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext;
 
 class LoggerResolver implements ParameterResolver {
     @Override
@@ -39,7 +39,7 @@ class LoggerResolver implements ParameterResolver {
     @Override
     public Logger resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext)
             throws ParameterResolutionException {
-        final LoggerContext loggerContext = getParameterLoggerContext(parameterContext, extensionContext);
+        final LoggerContext loggerContext = getLoggerContext(extensionContext);
         if (loggerContext == null) {
             throw new ParameterResolutionException("No LoggerContext defined");
         }
diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/package-info.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/package-info.java
index 9baeb0b22b..56f68c873d 100644
--- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/package-info.java
+++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/package-info.java
@@ -16,7 +16,9 @@
  */
 
 /**
- * JUnit helper classes and TestRules.
- * @see org.junit.rules.TestRule
+ * Log4j test fixtures for JUnit 4 and JUnit 5.
+ *
+ * @see org.apache.logging.log4j.core.test.junit.LoggerContextSource JUnit 5 extension
+ * @see org.apache.logging.log4j.core.test.junit.LoggerContextRule JUnit 4 test rule
  */
 package org.apache.logging.log4j.core.test.junit;