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;