fix bugs detected by SubstituteLoggerTest

This commit is contained in:
Ceki Gulcu 2021-07-01 10:03:25 +02:00
parent 10d78b04d6
commit 601405b76f
5 changed files with 206 additions and 92 deletions

View File

@ -31,8 +31,10 @@ import java.util.Queue;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.EventRecodingLogger;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
import org.slf4j.event.SubstituteLoggingEvent;
import org.slf4j.spi.LoggingEventBuilder;
/**
* A logger implementation which logs via a delegate logger. By default, the delegate is a
@ -61,174 +63,242 @@ public class SubstituteLogger implements Logger {
this.createdPostInitialization = createdPostInitialization;
}
@Override
public String getName() {
return name;
}
@Override
public LoggingEventBuilder makeLoggingEventBuilder(Level level) {
return delegate().makeLoggingEventBuilder(level);
}
@Override
public boolean isEnabledForLevel(Level level) {
return delegate().isEnabledForLevel(level);
}
@Override
public boolean isTraceEnabled() {
return delegate().isTraceEnabled();
}
@Override
public void trace(String msg) {
delegate().trace(msg);
}
@Override
public void trace(String format, Object arg) {
delegate().trace(format, arg);
}
@Override
public void trace(String format, Object arg1, Object arg2) {
delegate().trace(format, arg1, arg2);
}
@Override
public void trace(String format, Object... arguments) {
delegate().trace(format, arguments);
}
}
@Override
public void trace(String msg, Throwable t) {
delegate().trace(msg, t);
}
@Override
public boolean isTraceEnabled(Marker marker) {
return delegate().isTraceEnabled(marker);
}
@Override
public void trace(Marker marker, String msg) {
delegate().trace(marker, msg);
}
@Override
public void trace(Marker marker, String format, Object arg) {
delegate().trace(marker, format, arg);
}
@Override
public void trace(Marker marker, String format, Object arg1, Object arg2) {
delegate().trace(marker, format, arg1, arg2);
}
@Override
public void trace(Marker marker, String format, Object... arguments) {
delegate().trace(marker, format, arguments);
}
@Override
public void trace(Marker marker, String msg, Throwable t) {
delegate().trace(marker, msg, t);
}
@Override
public LoggingEventBuilder atTrace() {
return delegate().atTrace();
}
@Override
public boolean isDebugEnabled() {
return delegate().isDebugEnabled();
}
@Override
public void debug(String msg) {
delegate().debug(msg);
}
@Override
public void debug(String format, Object arg) {
delegate().debug(format, arg);
}
@Override
public void debug(String format, Object arg1, Object arg2) {
delegate().debug(format, arg1, arg2);
}
@Override
public void debug(String format, Object... arguments) {
delegate().debug(format, arguments);
}
@Override
public void debug(String msg, Throwable t) {
delegate().debug(msg, t);
}
@Override
public boolean isDebugEnabled(Marker marker) {
return delegate().isDebugEnabled(marker);
}
@Override
public void debug(Marker marker, String msg) {
delegate().debug(marker, msg);
}
@Override
public void debug(Marker marker, String format, Object arg) {
delegate().debug(marker, format, arg);
}
@Override
public void debug(Marker marker, String format, Object arg1, Object arg2) {
delegate().debug(marker, format, arg1, arg2);
}
@Override
public void debug(Marker marker, String format, Object... arguments) {
delegate().debug(marker, format, arguments);
}
@Override
public void debug(Marker marker, String msg, Throwable t) {
delegate().debug(marker, msg, t);
}
@Override
public LoggingEventBuilder atDebug() {
return delegate().atDebug();
}
@Override
public boolean isInfoEnabled() {
return delegate().isInfoEnabled();
}
@Override
public void info(String msg) {
delegate().info(msg);
}
@Override
public void info(String format, Object arg) {
delegate().info(format, arg);
}
@Override
public void info(String format, Object arg1, Object arg2) {
delegate().info(format, arg1, arg2);
}
@Override
public void info(String format, Object... arguments) {
delegate().info(format, arguments);
}
@Override
public void info(String msg, Throwable t) {
delegate().info(msg, t);
}
@Override
public boolean isInfoEnabled(Marker marker) {
return delegate().isInfoEnabled(marker);
}
@Override
public void info(Marker marker, String msg) {
delegate().info(marker, msg);
}
@Override
public void info(Marker marker, String format, Object arg) {
delegate().info(marker, format, arg);
}
@Override
public void info(Marker marker, String format, Object arg1, Object arg2) {
delegate().info(marker, format, arg1, arg2);
}
@Override
public void info(Marker marker, String format, Object... arguments) {
delegate().info(marker, format, arguments);
}
@Override
public void info(Marker marker, String msg, Throwable t) {
delegate().info(marker, msg, t);
}
@Override
public LoggingEventBuilder atInfo() {
return delegate().atInfo();
}
@Override
public boolean isWarnEnabled() {
return delegate().isWarnEnabled();
}
@Override
public void warn(String msg) {
delegate().warn(msg);
}
@Override
public void warn(String format, Object arg) {
delegate().warn(format, arg);
}
@Override
public void warn(String format, Object arg1, Object arg2) {
delegate().warn(format, arg1, arg2);
}
@Override
public void warn(String format, Object... arguments) {
delegate().warn(format, arguments);
}
@Override
public void warn(String msg, Throwable t) {
delegate().warn(msg, t);
}
@ -236,75 +306,104 @@ public class SubstituteLogger implements Logger {
public boolean isWarnEnabled(Marker marker) {
return delegate().isWarnEnabled(marker);
}
@Override
public void warn(Marker marker, String msg) {
delegate().warn(marker, msg);
}
@Override
public void warn(Marker marker, String format, Object arg) {
delegate().warn(marker, format, arg);
}
@Override
public void warn(Marker marker, String format, Object arg1, Object arg2) {
delegate().warn(marker, format, arg1, arg2);
}
@Override
public void warn(Marker marker, String format, Object... arguments) {
delegate().warn(marker, format, arguments);
}
@Override
public void warn(Marker marker, String msg, Throwable t) {
delegate().warn(marker, msg, t);
}
@Override
public LoggingEventBuilder atWarn() {
return delegate().atWarn();
}
@Override
public boolean isErrorEnabled() {
return delegate().isErrorEnabled();
}
@Override
public void error(String msg) {
delegate().error(msg);
}
@Override
public void error(String format, Object arg) {
delegate().error(format, arg);
}
@Override
public void error(String format, Object arg1, Object arg2) {
delegate().error(format, arg1, arg2);
}
@Override
public void error(String format, Object... arguments) {
delegate().error(format, arguments);
}
@Override
public void error(String msg, Throwable t) {
delegate().error(msg, t);
}
@Override
public boolean isErrorEnabled(Marker marker) {
return delegate().isErrorEnabled(marker);
}
@Override
public void error(Marker marker, String msg) {
delegate().error(marker, msg);
}
@Override
public void error(Marker marker, String format, Object arg) {
delegate().error(marker, format, arg);
}
@Override
public void error(Marker marker, String format, Object arg1, Object arg2) {
delegate().error(marker, format, arg1, arg2);
}
@Override
public void error(Marker marker, String format, Object... arguments) {
delegate().error(marker, format, arguments);
}
@Override
public void error(Marker marker, String msg, Throwable t) {
delegate().error(marker, msg, t);
}
@Override
public LoggingEventBuilder atError() {
return delegate().atError();
}
@Override
public boolean equals(Object o) {
if (this == o)
@ -367,7 +466,7 @@ public class SubstituteLogger implements Logger {
}
return delegateEventAware;
}
public void log(LoggingEvent event) {
if (isDelegateEventAware()) {
try {

View File

@ -1,13 +1,27 @@
package org.slf4j;
package org.slf4j.basicTests;
import static org.junit.Assert.assertFalse;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.event.Level;
public class LoggerUsage {
public class FluentAPIUsage {
@Test
public void test() {
org.slf4j.Logger logger = LoggerFactory.getLogger("aa");
logger.atTrace().addKeyValue("a", "n").setCause(new Throwable()).log("aa");
public void smoke() {
String name = "smoke";
Logger logger = LoggerFactory.getLogger(name);
logger.atTrace().addKeyValue("a", "n").setCause(new Throwable()).log("hello");
}
@Test
public void smokxce() {
String name = "smoke";
Logger logger = LoggerFactory.getLogger("aa");
assertFalse(logger.isEnabledForLevel(Level.DEBUG));
}
}

View File

@ -31,10 +31,8 @@ import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.junit.Test;
@ -43,15 +41,24 @@ import org.slf4j.event.EventRecodingLogger;
/**
* @author Chetan Mehrotra
* @author Ceki Gülcü
*/
public class SubstitutableLoggerTest {
// atTrace excluded during development of 2.0 API
// NOTE: previous implementations of this class performed a hand crafted conversion of
// a method to a string. In this implementation we just invoke method.toString().
// WARNING: if you need to add an excluded method to have tests pass, ask yourself whether you
// forgot to implement the said method with delegation in SubstituteLogger. You probably did.
private static final Set<String> EXCLUDED_METHODS = new HashSet<String>(
Arrays.asList("getName", "makeLoggingEventBuilder", "isEnabledForLevel", "atTrace", "atDebug", "atInfo", "atWarn", "atError"));
Arrays.asList("getName"));
/**
* Test that all SubstituteLogger methods invoke the delegate, except for explicitly excluded methods.
*/
@Test
public void testDelegate() throws Exception {
public void delegateIsInvokedTest() throws Exception {
SubstituteLogger substituteLogger = new SubstituteLogger("foo", null, false);
assertTrue(substituteLogger.delegate() instanceof EventRecodingLogger);
@ -60,7 +67,7 @@ public class SubstitutableLoggerTest {
Logger proxyLogger = (Logger) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { Logger.class }, ih);
substituteLogger.setDelegate(proxyLogger);
invokeMethods(substituteLogger);
invokeAllMethodsOf(substituteLogger);
// Assert that all methods are delegated
expectedMethodSignatures.removeAll(ih.getInvokedMethodSignatures());
@ -69,19 +76,32 @@ public class SubstitutableLoggerTest {
}
}
private void invokeMethods(Logger proxyLogger) throws InvocationTargetException, IllegalAccessException {
private void invokeAllMethodsOf(Logger logger) throws InvocationTargetException, IllegalAccessException {
for (Method m : Logger.class.getDeclaredMethods()) {
if (!EXCLUDED_METHODS.contains(m.getName())) {
m.invoke(proxyLogger, new Object[m.getParameterTypes().length]);
m.invoke(logger, new Object[m.getParameterTypes().length]);
}
}
}
private static Set<String> determineMethodSignatures(Class<Logger> loggerClass) {
Set<String> methodSignatures = new HashSet<String>();
// Note: Class.getDeclaredMethods() does not include inherited methods
for (Method m : loggerClass.getDeclaredMethods()) {
if (!EXCLUDED_METHODS.contains(m.getName())) {
methodSignatures.add(m.toString());
}
}
return methodSignatures;
}
// implements InvocationHandler
private class LoggerInvocationHandler implements InvocationHandler {
private final Set<String> invokedMethodSignatures = new HashSet<String>();
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
invokedMethodSignatures.add(getMethodSignature(method));
invokedMethodSignatures.add(method.toString());
if (method.getName().startsWith("is")) {
return true;
}
@ -92,23 +112,4 @@ public class SubstitutableLoggerTest {
return invokedMethodSignatures;
}
}
private static Set<String> determineMethodSignatures(Class<Logger> loggerClass) {
Set<String> methodSignatures = new HashSet<String>();
for (Method m : loggerClass.getDeclaredMethods()) {
if (!EXCLUDED_METHODS.contains(m.getName())) {
methodSignatures.add(getMethodSignature(m));
}
}
return methodSignatures;
}
private static String getMethodSignature(Method m) {
List<String> result = new ArrayList<String>();
result.add(m.getName());
for (Class<?> clazz : m.getParameterTypes()) {
result.add(clazz.getSimpleName());
}
return result.toString();
}
}

View File

@ -3,7 +3,7 @@ document.write('<table class="footer" border="0">')
document.write('<tr>')
document.write(' <td valign="top" align="left">Copyright &copy; 2004-2019 <a href="http://www.qos.ch/">QOS.ch</a></td>')
document.write(' <td valign="top" align="left">Copyright &copy; 2004-2021 <a href="http://www.qos.ch/">QOS.ch</a></td>')
//document.write(' <td rowspan="2">');
//document.write(' <a href="http://twitter.com/qos_ch">');