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 51d865ee79f85a8a5b61cc451e704c53dcbf8a43 Author: Matt Sicker <mattsic...@apache.org> AuthorDate: Sat Jun 18 16:25:27 2022 -0500 Add parameter resolver for Appender AbstractManager This adds a resolver similar to the one for Appender to obtain its AbstractManager instance. Signed-off-by: Matt Sicker <mattsic...@apache.org> --- .../core/test/junit/AppenderManagerResolver.java | 69 ++++++++++++++++++++++ .../log4j/core/test/junit/AppenderResolver.java | 10 +++- .../log4j/core/test/junit/LoggerContextSource.java | 5 +- .../rolling/AbstractRollingListenerTest.java | 39 ++++++++++++ 4 files changed, 120 insertions(+), 3 deletions(-) diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java new file mode 100644 index 0000000000..ea5f36e400 --- /dev/null +++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/AppenderManagerResolver.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ + +package org.apache.logging.log4j.core.test.junit; + +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.AbstractManager; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.plugins.di.Keys; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.ParameterContext; +import org.junit.jupiter.api.extension.ParameterResolutionException; +import org.junit.jupiter.api.extension.ParameterResolver; +import org.junit.platform.commons.support.ReflectionSupport; + +import java.lang.reflect.Parameter; + +import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext; + +/** + * Resolves parameters that extend {@link AbstractManager} and have a {@link org.apache.logging.log4j.plugins.Named} + * parameter of the corresponding appender that uses the manager. + */ +class AppenderManagerResolver implements ParameterResolver { + @Override + public boolean supportsParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException { + final Parameter parameter = parameterContext.getParameter(); + return AbstractManager.class.isAssignableFrom(parameter.getType()) && Keys.hasName(parameter); + } + + @Override + public Object resolveParameter(final ParameterContext parameterContext, final ExtensionContext extensionContext) throws ParameterResolutionException { + final LoggerContext loggerContext = getLoggerContext(extensionContext); + if (loggerContext == null) { + throw new ParameterResolutionException("No LoggerContext defined"); + } + final Configuration configuration = loggerContext.getConfiguration(); + final Parameter parameter = parameterContext.getParameter(); + final String name = Keys.getName(parameter); + final Appender appender = configuration.getAppender(name); + if (appender == null) { + throw new ParameterResolutionException("No appender named " + name); + } + final Class<? extends Appender> appenderClass = appender.getClass(); + final Object manager = ReflectionSupport.findMethod(appenderClass, "getManager") + .map(method -> ReflectionSupport.invokeMethod(method, appender)) + .orElseThrow(() -> new ParameterResolutionException("Cannot find getManager() on appender " + appenderClass)); + final Class<?> parameterType = parameter.getType(); + if (!parameterType.isInstance(manager)) { + throw new ParameterResolutionException("Expected type " + parameterType + " but got type " + manager.getClass()); + } + return manager; + } +} 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 99069b8e1d..6e206591a3 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,14 +25,20 @@ import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; import org.junit.jupiter.api.extension.ParameterResolver; +import java.lang.reflect.Parameter; + import static org.apache.logging.log4j.core.test.junit.LoggerContextResolver.getLoggerContext; +/** + * Resolves parameters that implement {@link Appender} and have a {@link org.apache.logging.log4j.plugins.Named} + * value of the name of the appender. + */ class AppenderResolver implements ParameterResolver { @Override public boolean supportsParameter( ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - return Appender.class.isAssignableFrom(parameterContext.getParameter().getType()) && - Keys.hasName(parameterContext.getParameter()); + final Parameter parameter = parameterContext.getParameter(); + return Appender.class.isAssignableFrom(parameter.getType()) && Keys.hasName(parameter); } @Override diff --git a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java index 6e4bdef993..ccdc502764 100644 --- a/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java +++ b/log4j-core-test/src/main/java/org/apache/logging/log4j/core/test/junit/LoggerContextSource.java @@ -20,6 +20,7 @@ package org.apache.logging.log4j.core.test.junit; import org.apache.logging.log4j.core.Appender; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.AbstractManager; import org.apache.logging.log4j.core.config.Configuration; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.extension.ExtendWith; @@ -42,7 +43,8 @@ import java.util.concurrent.TimeUnit; * <li>{@link LoggerContext};</li> * <li>{@link Configuration};</li> * <li>{@link Logger} (with a {@link Named} annotation to use a different Logger than the test class;</li> - * <li>any subclass of {@link Appender} paired with a {@link Named} annotation to select the appender by name.</li> + * <li>any subclass of {@link Appender} paired with a {@link Named} annotation to select the appender by name;</li> + * <li>any subclass of {@link AbstractManager} paired with a {@link Named} annotation to select the appender by name.</li> * </ul> * * Tests using this extension will automatically be tagged as {@code functional} to indicate they perform functional tests that @@ -58,6 +60,7 @@ import java.util.concurrent.TimeUnit; @ExtendWith(LoggerContextResolver.class) @ExtendWith(ConfigurationResolver.class) @ExtendWith(AppenderResolver.class) +@ExtendWith(AppenderManagerResolver.class) @ExtendWith(LoggerResolver.class) public @interface LoggerContextSource { /** diff --git a/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java new file mode 100644 index 0000000000..bf8cb2e340 --- /dev/null +++ b/log4j-core-test/src/test/java/org/apache/logging/log4j/core/appender/rolling/AbstractRollingListenerTest.java @@ -0,0 +1,39 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache license, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the license for the specific language governing permissions and + * limitations under the license. + */ + +package org.apache.logging.log4j.core.appender.rolling; + +import org.apache.logging.log4j.core.time.Clock; +import org.apache.logging.log4j.plugins.Factory; + +import java.util.concurrent.atomic.AtomicLong; + +/** + * Provides a controllable clock for rolling appender tests. + */ +public abstract class AbstractRollingListenerTest implements RolloverListener { + protected final AtomicLong currentTimeMillis = new AtomicLong(System.currentTimeMillis()); + + @Factory + Clock clock() { + return currentTimeMillis::get; + } + + @Override + public void rolloverTriggered(final String fileName) { + } +}