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 <[email protected]> AuthorDate: Fri May 27 18:04:53 2022 -0500 Make LoggerContextResolver use ResourceCloseable Signed-off-by: Matt Sicker <[email protected]> --- .../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;
