/**
* This file is part of the source code and related artifacts for eGym Application.
*
* Copyright © 2013 eGym GmbH
*/
package de.egym.logqueue;
import static org.mockito.Mockito.*;
import static org.testng.Assert.*;
import org.joda.time.DateTime;
import org.joda.time.DateTimeUtils;
import org.joda.time.DateTimeZone;
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Injector;
import de.egym.logqueue.config.EgymLogPipelineModule;
import de.egym.logqueue.decorator.EgymLogNoOpDecorator;
import de.egym.logqueue.formatter.EgymLogPlainTextFormatter;
import de.egym.logqueue.slf4j.EgymLogger;
import de.egym.logqueue.writer.EgymLogWriter;
@Test
public class EgymLogQueueImplTest {
private static final String LOGGER_NAME = "FooLogger";
@Mock
private EgymLogWriter logWriter;
@Mock
private EgymLogger logger;
private Injector injector;
private EgymLogQueue logQueue;
@BeforeMethod
public void init() {
DateTimeZone.setDefault(DateTimeZone.UTC);
MockitoAnnotations.initMocks(this);
injector = Guice.createInjector(new EgymLogModule(), new EgymLogPipelineModule() {
@Override
protected void configure() {
decorateWith(EgymLogNoOpDecorator.class).formatWith(EgymLogPlainTextFormatter.class).writeTo(InMemoryWriter.class);
}
});
when(logger.getName()).thenReturn(LOGGER_NAME);
logQueue = injector.getInstance(EgymLogQueue.class);
}
@AfterMethod
public void cleanup() {
DateTimeUtils.setCurrentMillisSystem();
}
/**
* Tests the standard behavior without a request context.
*/
@Test
public void testWithoutRequest() {
final DateTime timestamp = new DateTime(2013, 12, 15, 17, 23, 42);
final EgymLogRecord logRecord = new EgymLogRecord(timestamp, logger, EgymLogLevel.INFO, "Hello World", null);
logQueue.log(logRecord);
verify(logWriter).write("2013-12-15 17:23:42.000 INFO FooLogger: Hello World");
}
/**
* Tests the standard behavior in a request context.
*/
@Test
public void testWithRequest() {
DateTimeUtils.setCurrentMillisFixed(1387139060000L);
logQueue.startRequest();
final DateTime timestamp = new DateTime(2013, 12, 15, 17, 23, 42);
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.INFO, "Hello World", null));
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.INFO, "Good Bye World", null));
verify(logWriter, never()).write(anyString());
logQueue.endRequest();
final ArgumentCaptor<String> logMsgCaptor = ArgumentCaptor.forClass(String.class);
verify(logWriter).write(logMsgCaptor.capture());
final String logMsg = logMsgCaptor.getValue();
System.out.println(logMsg);
final String[] lines = logMsg.split("\n");
assertEquals(lines.length, 3);
assertEquals(lines[0], "Request 2013-12-15 20:24:20.000 Some Header");
assertEquals(lines[1], "\t2013-12-15 17:23:42.000 INFO FooLogger: Hello World");
assertEquals(lines[2], "\t2013-12-15 17:23:42.000 INFO FooLogger: Good Bye World");
}
/**
* Ensures that log messages below INFO are not logged per default.
*/
@Test
public void testWithRequestDebug() {
DateTimeUtils.setCurrentMillisFixed(1387139060000L);
logQueue.startRequest();
final DateTime timestamp = new DateTime(2013, 12, 15, 17, 23, 42);
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.INFO, "Hello World", null));
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.DEBUG, "Good Bye World", null));
verify(logWriter, never()).write(anyString());
logQueue.endRequest();
final ArgumentCaptor<String> logMsgCaptor = ArgumentCaptor.forClass(String.class);
verify(logWriter).write(logMsgCaptor.capture());
final String logMsg = logMsgCaptor.getValue();
System.out.println(logMsg);
// Make sure the DEBUG log message is not logged.
final String[] lines = logMsg.split("\n");
assertEquals(lines.length, 2);
assertEquals(lines[0], "Request 2013-12-15 20:24:20.000 Some Header");
assertEquals(lines[1], "\t2013-12-15 17:23:42.000 INFO FooLogger: Hello World");
}
/**
* Ensures that a log messages with level WARN triggers the audit mode which then also includes log messages with levels below INFO.
*/
@Test
public void testWithRequestAudit() {
DateTimeUtils.setCurrentMillisFixed(1387139060000L);
logQueue.startRequest();
final DateTime timestamp = new DateTime(2013, 12, 15, 17, 23, 42);
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.INFO, "Hello World", null));
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.DEBUG, "Good Bye World", null));
logQueue.log(new EgymLogRecord(timestamp, logger, EgymLogLevel.WARN, "In soviet russia bug hunts you!", null));
verify(logWriter, never()).write(anyString());
logQueue.endRequest();
final ArgumentCaptor<String> logMsgCaptor = ArgumentCaptor.forClass(String.class);
verify(logWriter).write(logMsgCaptor.capture());
final String logMsg = logMsgCaptor.getValue();
System.out.println(logMsg);
// Due to the audit triggered by the WARN log message, the DEBUG log message must not be included.
final String[] lines = logMsg.split("\n");
assertEquals(lines.length, 4);
assertEquals(lines[0], "Request 2013-12-15 20:24:20.000 Some Header");
assertEquals(lines[1], "\t2013-12-15 17:23:42.000 INFO FooLogger: Hello World");
assertEquals(lines[2], "\t2013-12-15 17:23:42.000 DEBUG FooLogger: Good Bye World");
assertEquals(lines[3], "\t2013-12-15 17:23:42.000 WARN FooLogger: In soviet russia bug hunts you!");
}
}