package org.marketcetera.util.test;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Base class for logger tests. Subclasses provide certain method
* overrides that this class uses to perform basic testing of said
* subclasses.
*
* @author tlerios@marketcetera.com
* @version $Id: LogTestBase.java 16154 2012-07-14 16:34:05Z colin $
* @since 2.0.0
*/
/* $License$ */
public abstract class LogTestBase
{
protected static final String TEST_MESSAGE=
"Test message (expected)";
private static final String TEST_CATEGORY_PREFIX=
"TestCategory";
private static final String TEST_LOCATION=
LogTestBase.class.getName();
private static int sNexttTextCategory=
0;
// Operations provided by subclasses.
protected abstract void setDefaultLevel
(Level level);
protected abstract void setLevel
(String name,
Level level);
protected abstract void assertEvent
(LoggingEvent event,
Level level,
String logger,
String message,
String location);
protected abstract MemoryAppender getAppender();
protected abstract void assertEventCount
(int count);
protected abstract void assertNoEvents();
protected abstract void assertLastEvent
(Level level,
String category,
String message,
String location);
protected abstract void assertSomeEvent
(Level level,
String category,
String message,
String location);
protected abstract void assertSingleEvent
(Level level,
String category,
String message,
String location);
// Test category generator.
protected static String getNextTestCategory()
{
return TEST_CATEGORY_PREFIX+(sNexttTextCategory++);
}
// Setup: ensure default logging is off. Subclass must ensure that
// the result of getAppender() is tied to the root logger.
@Before
public void setupLogTestBase()
{
Logger.getRootLogger().setLevel(Level.OFF);
}
// setDefaultLevel() tests.
@Test
public void defaultLevelSetting()
{
String c=getNextTestCategory();
// Default logging is turned off during setup.
assertEquals(Level.OFF,Logger.getRootLogger().getLevel());
Logger.getLogger(c).error(TEST_MESSAGE);
assertEquals(0,getAppender().getEvents().size());
setDefaultLevel(Level.WARN);
assertEquals(Level.WARN,Logger.getRootLogger().getLevel());
Logger.getLogger(c).info(TEST_MESSAGE);
assertEquals(0,getAppender().getEvents().size());
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEquals(1,getAppender().getEvents().size());
Logger.getLogger(c).error(TEST_MESSAGE);
assertEquals(2,getAppender().getEvents().size());
setDefaultLevel(Level.OFF);
assertEquals(Level.OFF,Logger.getRootLogger().getLevel());
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEquals(2,getAppender().getEvents().size());
}
// setLevel() tests.
@Test
public void levelSetting()
{
String c=getNextTestCategory();
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEquals(0,getAppender().getEvents().size());
setLevel(c,Level.WARN);
Logger.getLogger(c).info(TEST_MESSAGE);
assertEquals(0,getAppender().getEvents().size());
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEquals(1,getAppender().getEvents().size());
}
// assertEvent() tests.
@Test
public void eventCorrect()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
LoggingEvent event=getAppender().getEvents().getLast();
assertEvent(event,Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(1,getAppender().getEvents().size());
// "don't care" matches.
assertEvent(event,null,c,TEST_MESSAGE,TEST_LOCATION);
assertEvent(event,Level.ERROR,null,TEST_MESSAGE,TEST_LOCATION);
assertEvent(event,Level.ERROR,c,null,TEST_LOCATION);
assertEvent(event,Level.ERROR,c,TEST_MESSAGE,null);
}
@Test(expected=AssertionError.class)
public void eventIncorrectLevel()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertEvent(getAppender().getEvents().getLast(),
Level.WARN,c,TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void eventIncorrectName()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertEvent(getAppender().getEvents().getLast(),
Level.ERROR,"",TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void eventIncorrectMessage()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertEvent(getAppender().getEvents().getLast(),
Level.ERROR,c,"",TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void eventIncorrectLocation()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertEvent(getAppender().getEvents().getLast(),
Level.ERROR,c,TEST_MESSAGE,"");
}
// getAppender() tests.
@Test
public void appenderIsValid()
{
assertNotNull(getAppender());
}
// assertEventCount() tests.
@Test
public void twoEvents()
{
String c=getNextTestCategory();
setLevel(c,Level.INFO);
Logger.getLogger(c).debug(TEST_MESSAGE);
Logger.getLogger(c).info(TEST_MESSAGE);
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEventCount(2);
}
@Test(expected=AssertionError.class)
public void miscountedEvents()
{
assertEventCount(1);
}
// assertNoEvents() tests.
@Test
public void noEvents()
{
String c=getNextTestCategory();
assertNoEvents();
Logger.getLogger(c).info(TEST_MESSAGE);
assertNoEvents();
}
@Test(expected=AssertionError.class)
public void someEvents()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertNoEvents();
}
// assertLastEvent() tests.
@Test
public void lastEventCorrect()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertLastEvent(Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(1,getAppender().getEvents().size());
setLevel(c,Level.INFO);
Logger.getLogger(c).info(TEST_MESSAGE);
assertLastEvent(Level.INFO,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(2,getAppender().getEvents().size());
// "don't care" matches.
assertLastEvent(null,c,TEST_MESSAGE,TEST_LOCATION);
assertLastEvent(Level.INFO,null,TEST_MESSAGE,TEST_LOCATION);
assertLastEvent(Level.INFO,c,null,TEST_LOCATION);
assertLastEvent(Level.INFO,c,TEST_MESSAGE,null);
}
@Test(expected=AssertionError.class)
public void noLastMatchingIncorrectLevel()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertLastEvent(Level.WARN,c,TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noLastMatchingIncorrectName()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertLastEvent(Level.ERROR,"",TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noLastMatchingIncorrectMessage()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertLastEvent(Level.ERROR,c,"",TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noLastMatchingIncorrectLocation()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertLastEvent(Level.ERROR,c,TEST_MESSAGE,"");
}
@Test(expected=AssertionError.class)
public void noLastEvent()
{
String c=getNextTestCategory();
assertLastEvent(Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
}
// assertSomeEvent() tests.
@Test
public void someEventCorrect()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSomeEvent(Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(1,getAppender().getEvents().size());
setLevel(c,Level.INFO);
Logger.getLogger(c).info(TEST_MESSAGE);
assertSomeEvent(Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
assertSomeEvent(Level.INFO,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(2,getAppender().getEvents().size());
// "don't care" matches.
assertSomeEvent(null,c,TEST_MESSAGE,TEST_LOCATION);
assertSomeEvent(Level.INFO,null,TEST_MESSAGE,TEST_LOCATION);
assertSomeEvent(Level.INFO,c,null,TEST_LOCATION);
assertSomeEvent(Level.INFO,c,TEST_MESSAGE,null);
}
@Test(expected=AssertionError.class)
public void noSomeMatchingIncorrectLevel()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSomeEvent(Level.WARN,c,TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSomeMatchingIncorrectName()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSomeEvent(Level.ERROR,"",TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSomeMatchingIncorrectMessage()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSomeEvent(Level.ERROR,c,"",TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSomeMatchingIncorrectLocation()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSomeEvent(Level.ERROR,c,TEST_MESSAGE,"");
}
@Test(expected=AssertionError.class)
public void noSomeEvent()
{
assertSomeEvent(null,null,null,null);
}
// assertSingleEvent() tests.
@Test
public void singleEventCorrect()
{
String c=getNextTestCategory();
setLevel(c,Level.WARN);
Logger.getLogger(c).warn(TEST_MESSAGE);
assertEquals(1,getAppender().getEvents().size());
assertSingleEvent(Level.WARN,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(0,getAppender().getEvents().size());
setLevel(c,Level.INFO);
Logger.getLogger(c).info(TEST_MESSAGE);
assertEquals(1,getAppender().getEvents().size());
assertSingleEvent(Level.INFO,c,TEST_MESSAGE,TEST_LOCATION);
assertEquals(0,getAppender().getEvents().size());
// "don't care" matches.
Logger.getLogger(c).info(TEST_MESSAGE);
assertSingleEvent(null,c,TEST_MESSAGE,TEST_LOCATION);
Logger.getLogger(c).info(TEST_MESSAGE);
assertSingleEvent(Level.INFO,null,TEST_MESSAGE,TEST_LOCATION);
Logger.getLogger(c).info(TEST_MESSAGE);
assertSingleEvent(Level.INFO,c,null,TEST_LOCATION);
Logger.getLogger(c).info(TEST_MESSAGE);
assertSingleEvent(Level.INFO,c,TEST_MESSAGE,null);
}
@Test(expected=AssertionError.class)
public void noSingleMatchingIncorrectLevel()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSingleEvent(Level.WARN,c,TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSingleMatchingIncorrectName()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSingleEvent(Level.ERROR,"",TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSingleMatchingIncorrectMessage()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSingleEvent(Level.ERROR,c,"",TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void noSingleMatchingIncorrectLocation()
{
String c=getNextTestCategory();
setLevel(c,Level.ERROR);
Logger.getLogger(c).error(TEST_MESSAGE);
assertSingleEvent(Level.ERROR,c,TEST_MESSAGE,"");
}
@Test(expected=AssertionError.class)
public void noSingleEvent()
{
String c=getNextTestCategory();
assertSingleEvent(Level.ERROR,c,TEST_MESSAGE,TEST_LOCATION);
}
@Test(expected=AssertionError.class)
public void tooManyEvents()
{
String c=getNextTestCategory();
setLevel(c,Level.INFO);
Logger.getLogger(c).warn(TEST_MESSAGE);
Logger.getLogger(c).info(TEST_MESSAGE);
assertSingleEvent(Level.INFO,c,TEST_MESSAGE,TEST_LOCATION);
}
}