blob: 5784c1bd30799541b7ea84be3b7f7b8d8f4f0c18 [file] [log] [blame]
package org.slf4j.simple;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.event.Level;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public abstract class LoggerTestSuite {
public static class ListAppendingOutputStream extends OutputStream {
private final StringBuilder word = new StringBuilder();
private int index = 0;
private final List<String> list;
private ListAppendingOutputStream(List<String> list) {this.list = list;}
@Override
public void write(int b) throws IOException {
word.append((char) b);
}
@Override
public void flush() {
list.add(word.toString());
word.delete(0, word.length());
index++;
}
}
private ListAppendingOutputStream prepareSink(List<String> source) {
return new ListAppendingOutputStream(source);
}
@Test
public void testTrace() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.TRACE);
assertTrue("Trace level should be enabled for this test", configuredLogger.isTraceEnabled());
configuredLogger.trace("Simple trace message");
assertEquals("Trace message should've been captured", 1, loggingEvents.size());
assertTrue("Message should be logged in trace level", isTraceMessage(loggingEvents.get(0)));
assertEquals("Supplied trace message wasn't found in the log",
"Simple trace message",
extractMessage(loggingEvents.get(0)));
loggingEvents.clear();
configuredLogger.debug("Simple debug message");
configuredLogger.info("Simple info message");
configuredLogger.warn("Simple warn message");
configuredLogger.error("Simple error message");
assertEquals("The other levels should have been captured", 4, loggingEvents.size());
}
@Test
public void testDebug() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.DEBUG);
configuredLogger.trace("Simple trace message");
assertEquals("Lower levels should have been ignored", 0, loggingEvents.size());
assertTrue("Debug level should be enabled for this test", configuredLogger.isDebugEnabled());
configuredLogger.debug("Simple debug message");
assertEquals("Debug message should've been captured", 1, loggingEvents.size());
assertTrue("Message should be logged in debug level", isDebugMessage(loggingEvents.get(0)));
assertEquals("Supplied debug message wasn't found in the log",
"Simple debug message",
extractMessage(loggingEvents.get(0)));
loggingEvents.clear();
configuredLogger.info("Simple info message");
configuredLogger.warn("Simple warn message");
configuredLogger.error("Simple error message");
assertEquals("The other levels should have been captured", 3, loggingEvents.size());
}
@Test
public void testInfo() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.INFO);
configuredLogger.trace("Simple trace message");
configuredLogger.debug("Simple debug message");
assertEquals("Lower levels should have been ignored", 0, loggingEvents.size());
assertTrue("Info level should be enabled for this test", configuredLogger.isInfoEnabled());
configuredLogger.info("Simple info message");
assertEquals("Info message should've been captured", 1, loggingEvents.size());
assertTrue("Message should be logged in debug level", isInfoMessage(loggingEvents.get(0)));
assertEquals("Supplied info message wasn't found in the log",
"Simple info message",
extractMessage(loggingEvents.get(0)));
loggingEvents.clear();
configuredLogger.warn("Simple warn message");
configuredLogger.error("Simple error message");
assertEquals("The other levels should have been captured", 2, loggingEvents.size());
}
@Test
public void testWarn() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.WARN);
configuredLogger.trace("Simple trace message");
configuredLogger.debug("Simple debug message");
configuredLogger.info("Simple info message");
assertEquals("Lower levels should have been ignored", 0, loggingEvents.size());
assertTrue("Warn level should be enabled for this test", configuredLogger.isWarnEnabled());
configuredLogger.warn("Simple warn message");
assertEquals("Warn message should've been captured", 1, loggingEvents.size());
assertTrue("Message should be logged in warn level", isWarnMessage(loggingEvents.get(0)));
assertEquals("Supplied warn message wasn't found in the log",
"Simple warn message",
extractMessage(loggingEvents.get(0)));
loggingEvents.clear();
configuredLogger.error("Simple error message");
assertEquals("The other levels should have been captured", 1, loggingEvents.size());
}
@Test
public void testError() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.ERROR);
configuredLogger.trace("Simple trace message");
configuredLogger.debug("Simple debug message");
configuredLogger.info("Simple info message");
configuredLogger.warn("Simple warn message");
assertEquals("Lower levels should have been ignored", 0, loggingEvents.size());
assertTrue("Error level should be enabled for this test", configuredLogger.isErrorEnabled());
configuredLogger.error("Simple error message");
assertEquals("Error message should've been captured", 1, loggingEvents.size());
assertTrue("Message should be logged in error level", isErrorMessage(loggingEvents.get(0)));
assertEquals("Supplied error message wasn't found in the log",
"Simple error message",
extractMessage(loggingEvents.get(0)));
}
@Test
public void testFormatting() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.INFO);
configuredLogger.info("Some {} string", "formatted");
assertEquals("The formatted message should've been captured", 1, loggingEvents.size());
assertEquals("Message should've been formatted", "Some formatted string", extractMessage(loggingEvents.get(0)));
}
@Test
public void testException() {
ArrayList<String> loggingEvents = new ArrayList<>();
Logger configuredLogger = createLogger(prepareSink(loggingEvents), Level.INFO);
Exception exception = new RuntimeException("My error");
configuredLogger.info("Logging with an exception", exception);
assertEquals("The formatted message should've been captured", 1, loggingEvents.size());
assertEquals("Message should've been formatted",
"My error",
extractExceptionMessage(loggingEvents.get(0)));
assertEquals("Message should've been formatted",
"java.lang.RuntimeException",
extractExceptionType(loggingEvents.get(0)));
}
/**
* Allows tests to check whether the log message contains a trace message.
* Override if needed.
* @param message String containing the full log message
* @return whether it is a trace message or not
*/
protected boolean isTraceMessage(String message) {
return message.toLowerCase().contains("trace");
}
/**
* Allows tests to check whether the log message contains a debug message.
* Override if needed.
* @param message String containing the full log message
* @return whether it is a debug message or not
*/
protected boolean isDebugMessage(String message) {
return message.toLowerCase().contains("debug");
}
/**
* Allows tests to check whether the log message contains an info message.
* Override if needed.
* @param message String containing the full log message
* @return whether it is an info message or not
*/
protected boolean isInfoMessage(String message) {
return message.toLowerCase().contains("info");
}
/**
* Allows tests to check whether the log message contains a warn message.
* Override if needed.
* @param message String containing the full log message
* @return whether it is a warn message or not
*/
protected boolean isWarnMessage(String message) {
return message.toLowerCase().contains("warn");
}
/**
* Allows tests to check whether the log message contains an error message.
* Override if needed.
* @param message String containing the full log message
* @return whether it is an error message or not
*/
protected boolean isErrorMessage(String message) {
return message.toLowerCase().contains("error");
}
/**
* Extracts only the part of the log string that should represent the `message` string.
* @param message the full log message
* @return only the supplied message
*/
public abstract String extractMessage(String message);
/**
* Extracts only the part of the log string that should represent the supplied exception message, if any.
* @param message the full log message
* @return only the supplied exception message
*/
public abstract String extractExceptionMessage(String message);
/**
* Extracts only the part of the log string that should represent the supplied exception type.
* @param message the full log message
* @return only the supplied exception type name
*/
public abstract String extractExceptionType(String message);
/**
* Configures the logger for running the tests.
* @param outputStream The output stream for logs to be written to
* @param level The expected level the tests will run for this logger
* @return a configured logger able to run the tests
*/
public abstract Logger createLogger(ListAppendingOutputStream outputStream, Level level);
}