package com.google.code.joto.eventrecorder.ext.log; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.List; import java.util.TimeZone; import junit.framework.TestCase; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; 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.EventStoreWriterLogbackAppender; import com.google.code.joto.eventrecorder.spy.log.LogbackEventData; import com.google.code.joto.eventrecorder.writer.RecordEventWriter; /** * JUnit test for Logback extension for RecordEventStore mechanism */ public class LogbackEventRecorderTest extends TestCase { public LogbackEventRecorderTest(String name) { super(name); } public void test1() { String eventType = "log4j"; String loggerName = "a.b.Test"; RecordEventStore eventStore = new DefaultMemoryRecordEventStore(); RecordEventWriter eventWriter = eventStore.getEventWriter(); LoggerContext loggerContext = new LoggerContext(); loggerContext.reset(); Logger logger = loggerContext.getLogger(loggerName); // plug RecordEventStore into Log4j EventStoreWriterLogbackAppender eventAppender = new EventStoreWriterLogbackAppender(eventWriter, eventType); eventAppender.start(); logger.addAppender(eventAppender); // now test logging events from log4j logger.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()); String msg = "test message 1"; assertEqualsLogEvent("INFO", loggerName, msg, msg, null, null, eventData); logger.info("test info message"); logger.warn("test warn message"); logger.warn("test warn message with ex", new Exception()); logger.error("test error message"); { // log + assertion for message with Exception String msg5 = "test error message with ex"; Exception ex5 = new Exception(); logger.error(msg5, ex5); assertEquals(6, eventStore.getEventsCount()); // assertion check for message 5 with ex events = eventStore.getEvents(0, -1); assertEquals(6, events.size()); RecordEventData eventData5 = eventStore.getEventData(events.get(5)); assertEqualsLogEvent("ERROR", loggerName, msg5, msg5, null, ex5, eventData5); } { // log + assertion check for message with formatted argument Calendar cal = GregorianCalendar.getInstance(TimeZone.getTimeZone("GMT")); cal.set(1999, 12, 31, 23, 59, 59); Object[] argArray = new Object[] { "test", 123, cal.getTime() }; String msg6 = "test info message with arguments: str={} int={} date={}"; logger.info(msg6, argArray); assertEquals(7, eventStore.getEventsCount()); events = eventStore.getEvents(0, -1); assertEquals(7, events.size()); RecordEventData eventData6 = eventStore.getEventData(events.get(6)); String formattedMsg6 = "test info message with arguments: str=test int=123 date=Tue Feb 01 00:59:59 GMT+01:00 2000"; assertEqualsLogEvent("INFO", loggerName, formattedMsg6, msg6, argArray, null, eventData6); } } private void assertEqualsLogEvent( String expectedLevel, String expectedLoggerName, String expectedFormattedMessage, String expectedMessage, Object[] arguments, Throwable expectedEx, RecordEventData actualEventData) { RecordEventSummary event = actualEventData.getEventSummary(); LogbackEventData logEventData = (LogbackEventData) actualEventData.getObjectData(); assertNotNull(logEventData); assertEquals(expectedLevel, event.getEventSubType()); assertEquals(expectedLoggerName, event.getEventMethodName()); assertEquals(expectedMessage, event.getEventMethodDetail()); assertEquals(expectedFormattedMessage, logEventData.getFormattedMessage()); Object[] actualArguments = logEventData.getArgumentArray(); if (arguments != null && arguments.length != 0) { assertEquals(arguments.length, actualArguments.length); // todo add assertion on args.. } else { assertTrue(actualArguments == null || actualArguments.length == 0); } if (expectedEx != null) { assertNotNull(logEventData.getStackTraceElements()); // TODO add more assertions... } else { assertNull(logEventData.getStackTraceElements()); } } }