package com.google.code.joto.eventrecorder.ext.log; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.List; import junit.framework.TestCase; import org.apache.log4j.Logger; import com.google.code.joto.eventrecorder.RecordEventData; import com.google.code.joto.eventrecorder.RecordEventStore; import com.google.code.joto.eventrecorder.RecordEventSummary; import com.google.code.joto.eventrecorder.impl.DefaultMemoryRecordEventStore; import com.google.code.joto.eventrecorder.spy.log.EventStoreWriterLog4jAppender; import com.google.code.joto.eventrecorder.spy.log.Log4jEventData; import com.google.code.joto.eventrecorder.writer.RecordEventWriter; /** * JUnit test for Log4j extension for RecordEventStore mechanism */ public class Log4jEventRecorderTest extends TestCase { public Log4jEventRecorderTest(String name) { super(name); } public void test1() { String eventType = "log4j"; String loggerName = "a.b.Test"; RecordEventStore eventStore = new DefaultMemoryRecordEventStore(); RecordEventWriter eventWriter = eventStore.getEventWriter(); // Hierarchy log4jHierarchy = new Hierarchy(null); // ?? Logger eventLogger = Logger.getLogger(loggerName); // plug RecordEventStore into Log4j EventStoreWriterLog4jAppender eventAppender = new EventStoreWriterLog4jAppender(eventWriter, eventType); eventLogger.addAppender(eventAppender); // now test logging events from log4j eventLogger.info("test message 1"); assertEquals(1, eventStore.getEventsCount()); List<RecordEventSummary> events = eventStore.getEvents(0, -1); assertEquals(1, events.size()); RecordEventSummary event = events.get(0); RecordEventData eventData = eventStore.getEventData(event); assertEquals(1, event.getEventId()); assertEquals(eventType, event.getEventType()); assertEqualsLogEvent("INFO", loggerName, "test message 1", null, eventData); eventLogger.info("test info message"); eventLogger.warn("test warn message"); eventLogger.warn("test warn message with ex", new Exception()); eventLogger.error("test error message"); Exception ex5 = new Exception(); eventLogger.error("test error message with ex", ex5); assertEquals(6, eventStore.getEventsCount()); events = eventStore.getEvents(0, -1); assertEquals(6, events.size()); // assertion check for message with ex RecordEventData eventData5 = eventStore.getEventData(events.get(5)); assertEqualsLogEvent("ERROR", loggerName, "test error message with ex", ex5, eventData5); } private void assertEqualsLogEvent( String expectedLevel, String expectedLoggerName, String expectedMessage, Throwable expectedEx, RecordEventData actualEventData) { RecordEventSummary event = actualEventData.getEventSummary(); Log4jEventData log4jEventData = (Log4jEventData) actualEventData.getObjectData(); assertNotNull(log4jEventData); assertEquals(expectedLevel, event.getEventSubType()); assertEquals(expectedLoggerName, event.getEventMethodName()); assertEquals(expectedMessage, event.getEventMethodDetail()); if (expectedEx != null) { Throwable actualExCopy = log4jEventData.getThrowable(); String[] actualExStrRep = log4jEventData.getThrowableStrRep(); assertTrue(actualExCopy != null || actualExStrRep != null); String expectedExStr = exToString(expectedEx); // if not serializable... assertNotNull(logEventData.getThrowableStrRep()); if (actualExCopy != null) { // compare Exception (copy!) String actualExStr = exToString(actualExCopy); assertEquals(expectedExStr, actualExStr); } else { // TODO compare (non serializable?) Ex with string representation StringBuilder sb = new StringBuilder(); for(String line : actualExStrRep) { sb.append(line); sb.append("\n"); } assertEquals(expectedExStr, sb.toString()); } } else { assertNull(log4jEventData.getThrowable()); assertNull(log4jEventData.getThrowableStrRep()); } } private static String exToString(Throwable ex) { ByteArrayOutputStream buffer = new ByteArrayOutputStream(); PrintStream out = new PrintStream(buffer); ex.printStackTrace(out); out.flush(); return buffer.toString(); } }