/**
* Copyright (C) 2000-2016 Atomikos <info@atomikos.com>
*
* LICENSE CONDITIONS
*
* See http://www.atomikos.com/Main/WhichLicenseApplies for details.
*/
package com.atomikos.logging;
import org.apache.log4j.Appender;
import org.apache.log4j.Level;
import org.apache.log4j.spi.LoggingEvent;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
public class Log4JLoggerFactoryTestJUnit extends AbstractLoggerFactoryTest {
// can't mock the "logger" Itself but Logger call a "publish" method on a
// mocked handler
private Appender mockedAppender = Mockito.mock(Appender.class);
public void setUp() {
LoggerFactory.setLoggerFactoryDelegate(new Log4JLoggerFactoryDelegate());
logger = LoggerFactory.createLogger(getClass());
getUnderlyingLogger().addAppender(mockedAppender);
getUnderlyingLogger().setLevel(Level.INFO);
}
public void testAssertSlf4jLoggerCreated() {
assertTrue(logger instanceof Log4JLogger);
}
public void testLogDebug() {
configureLoggingFrameworkWithDebug();
logger.logDebug(MESSAGE);
assertLoggedAsDebug();
}
@Override
protected void assertLoggedAsDebug() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.DEBUG, false);
}
@Override
protected void assertLoggedAsDebugWithException() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.DEBUG, true);
}
private void assertLoggingEvent(LoggingEvent loggingEvent,
Level expectedLevel, boolean withThrowable) {
assertEquals(MESSAGE, loggingEvent.getMessage());
assertEquals(expectedLevel, loggingEvent.getLevel());
if (withThrowable) {
assertNotNull(loggingEvent.getThrowableInformation());
} else {
assertNull(loggingEvent.getThrowableInformation());
}
}
@Override
protected void assertLoggedAsInfo() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.INFO, false);
}
@Override
protected void assertLoggedAsInfoWithException() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.INFO, true);
}
@Override
protected void assertLoggedAsWarning() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.WARN, false);
}
@Override
protected void assertLoggedAsWarningWithException() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.WARN, true);
}
public void testIsInfoEnabled() {
getUnderlyingLogger().setLevel(Level.WARN);
super.testIsInfoEnabled();
}
@Override
protected void configureLoggingFrameworkWithInfo() {
getUnderlyingLogger().setLevel(Level.INFO);
}
@Override
protected void configureLoggingFrameworkWithDebug() {
getUnderlyingLogger().setLevel(Level.DEBUG);
}
private org.apache.log4j.Logger getUnderlyingLogger() {
return org.apache.log4j.Logger.getLogger(getClass());
}
@Override
protected void assertLoggedAsError() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.ERROR, false);
}
@Override
protected void assertLoggedAsErrorWithException() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.ERROR, true);
}
@Override
protected void configureLoggingFrameworkWithNone() {
getUnderlyingLogger().setLevel(Level.OFF);
}
@Override
protected void configureLoggingFrameworkWithError() {
getUnderlyingLogger().setLevel(Level.ERROR);
}
@Override
protected void configureLoggingFrameworkWithTrace() {
getUnderlyingLogger().setLevel(Level.TRACE);
}
@Override
protected void assertLoggedAsTrace() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.TRACE, false);
}
@Override
protected void assertLoggedAsTraceWithException() {
ArgumentCaptor<LoggingEvent> arg = ArgumentCaptor.forClass(LoggingEvent.class);
Mockito.verify(mockedAppender).doAppend(arg.capture());
LoggingEvent loggingEvent = arg.getValue();
assertLoggingEvent(loggingEvent, Level.TRACE, true);
}
}