package org.sef4j.log.slf4j.slf4j2event;
import java.util.List;
import java.util.Map;
import org.junit.Assert;
import org.junit.Test;
import org.sef4j.callstack.CallStackElt.StackPopper;
import org.sef4j.callstack.LocalCallStack;
import org.sef4j.core.helpers.senders.InMemoryEventSender;
import org.sef4j.log.slf4j.BasicConfigureTstHelper;
import org.sef4j.log.slf4j.LogLevel;
import org.slf4j.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.IThrowableProxy;
public class EventSenderSlf4jAppenderTest {
InMemoryEventSender<LoggingEventExt> targetEventSender = new InMemoryEventSender<LoggingEventExt>();
EventSenderSlf4jAppender sut = new EventSenderSlf4jAppender(targetEventSender);
private LoggerContext slf4jLoggerContext = BasicConfigureTstHelper.newLoggerContextWithAppender(
null, "appender1", sut);
private Logger logger = slf4jLoggerContext.getLogger(EventSenderSlf4jAppenderTest.class);
@Test
public void testInfo() {
// Prepare
String msg1 = "test message1";
String msg2 = "test message2";
// Perform
logger.info(msg1);
logger.info(msg2);
// Post-check
List<LoggingEventExt> events = targetEventSender.clearAndGet();
Assert.assertEquals(2, events.size());
LoggingEventExt e1 = events.get(0);
Assert.assertEquals(msg1, e1.getMessage());
LoggingEventExt e2 = events.get(1);
Assert.assertEquals(msg2, e2.getMessage());
}
@Test
public void testError() {
// Prepare
String msg1 = "test error message1";
String msg2 = "test error message2";
// Perform
logger.error(msg1);
logger.error(msg2, new Exception());
// Post-check
List<LoggingEventExt> events = targetEventSender.clearAndGet();
Assert.assertEquals(2, events.size());
LoggingEventExt e1 = events.get(0);
Assert.assertEquals(msg1, e1.getMessage());
IThrowableProxy e1Ex = e1.getThrowable();
Assert.assertNull(e1Ex);
LoggingEventExt e2 = events.get(1);
Assert.assertEquals(msg2, e2.getMessage());
IThrowableProxy e2Ex = e2.getThrowable();
Assert.assertNotNull(e2Ex);
}
@Test
public void testInfo_withPropsParams() {
// Prepare
String msg1 = "test message1 (with stack params...)";
String msg2 = "test nested message";
// Perform
StackPopper toPop = LocalCallStack.meth("C", "test")
.withInheritableProp("prop1", "propValue1")
.p("param1", "paramValue1")
.push();
try {
logger.info(msg1);
logWithinNestedMeth(msg2);
} finally {
toPop.close();
}
// Post-check
List<LoggingEventExt> events = targetEventSender.clearAndGet();
Assert.assertEquals(2, events.size());
LoggingEventExt e1 = events.get(0);
Assert.assertEquals(msg1, e1.getMessage());
assertEqualsMap(new Object[] { "param1", "paramValue1" }, e1.getParams());
assertEqualsMap(new Object[] { "prop1", "propValue1" }, e1.getProps());
LoggingEventExt e2 = events.get(1);
Assert.assertEquals(msg2, e2.getMessage());
assertEqualsMap(new Object[] { "param2", "paramValue2" }, e2.getParams());
assertEqualsMap(new Object[] { "prop1", "propValue1", "prop2", "propValue2" }, e2.getProps());
}
protected void logWithinNestedMeth(String msg) {
StackPopper toPop = LocalCallStack.meth("C", "nestedMeth")
.withInheritableProp("prop2", "propValue2")
.p("param2", "paramValue2")
.push();
try {
logger.info(msg);
} finally {
toPop.close();
}
}
@Test
public void testInfo_maskReplace() {
// Prepare
String msg1 = "test message1";
// Perform
Slf4jAppenderEventMask tmpMmask = new Slf4jAppenderEventMask(true, null, null);
Slf4jAppenderThreadLocalMask.maskLogLevelText(tmpMmask, logger, LogLevel.INFO, msg1);
// => mask .. logger.info(msg1) ..unmask;
// Post-check
List<LoggingEventExt> events = targetEventSender.clearAndGet();
Assert.assertEquals(0, events.size());
// Prepare
String replacedMsg2 = "replaced test message2";
LoggingEventExt replacedEvent2 = new LoggingEventExt.Builder()
.withMessage(replacedMsg2)
.build();
// Perform
Slf4jAppenderEventMask tmpMmask2 = new Slf4jAppenderEventMask(true, replacedEvent2, null);
Slf4jAppenderThreadLocalMask.maskLogLevelText(tmpMmask2, logger, LogLevel.INFO, msg1);
// Post-check
events = targetEventSender.clearAndGet();
Assert.assertEquals(1, events.size());
LoggingEventExt e2 = events.get(0);
Assert.assertEquals(replacedMsg2, e2.getMessage());
}
protected static void assertEqualsMap(Object[] expectedNV, Map<String,Object> actual) {
int len = expectedNV.length / 2;
Assert.assertEquals(len, actual.size());
for (int index = 0, i = 0; i < len; i++,index+=2) {
String expectedKey = (String) expectedNV[index];
Object expectedValue = expectedNV[index + 1];
Assert.assertEquals(expectedValue, actual.get(expectedKey));
}
}
}