/** * 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.testng.Assert.*; import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.formatter.EgymLogPlainTextFormatter; /** * Tests the pipeline configuration and execution mechanism. */ @Test public class PipelineTest { /** * The test configuration. */ private static class EgymTestLogPipelineModule extends EgymLogPipelineModule { @Override protected void configure() { skipDecoration().formatWith(EgymLogPlainTextFormatter.class).writeTo(InMemoryWriter.class); } } private static final Logger log = LoggerFactory.getLogger(EgymLogQueueImpl.class); private EgymLogQueueImpl logQueue; private InMemoryWriter writer; /** * Tests a pipeline configuration. */ @Test public void testWithRequest1() { givenPipelineConfiguration(); whenLoggingRequest("Foo", "Bar"); thenEnsureProperRequestOutput("Foo", "Bar"); } /** * Tests a pipeline configuration. */ @Test public void testWithRequest2() { givenPipelineConfiguration(); whenLoggingRequest("Moerp"); thenEnsureProperRequestOutput("Moerp"); } /** * Tests a pipeline configuration. */ @Test public void testWithRequest3() { givenPipelineConfiguration(); whenLoggingRequest(); thenEnsureProperRequestOutput(); } @Test public void testWithoutRequest1() { givenPipelineConfiguration(); whenLoggingOutsideOfRequest("Foo", "Bar"); thenEnsureProperNonRequestOutput("Foo", "Bar"); } @Test public void testWithoutRequest2() { givenPipelineConfiguration(); whenLoggingOutsideOfRequest("a", "b", "c"); thenEnsureProperNonRequestOutput("a", "b", "c"); } @Test public void testWithoutRequest3() { givenPipelineConfiguration(); whenLoggingOutsideOfRequest(); thenEnsureProperNonRequestOutput(); } private void givenPipelineConfiguration() { final Injector injector = Guice.createInjector(new EgymLogModule(), new EgymTestLogPipelineModule()); logQueue = (EgymLogQueueImpl) injector.getInstance(EgymLogQueue.class); writer = injector.getInstance(InMemoryWriter.class); } private void whenLoggingRequest(String... logMessages) { logQueue.startRequest(); whenLoggingOutsideOfRequest(logMessages); logQueue.endRequest(); } private void whenLoggingOutsideOfRequest(String... logMessages) { for (String logMessage : logMessages) { log.info(logMessage); } } private void thenEnsureProperRequestOutput(String... expectedLogMessages) { final List<String> logMessages = writer.getLogMessages(); assertNotNull(logMessages); assertEquals(logMessages.size(), 1); final String logMessage = logMessages.get(0); final String[] lines = logMessage.split("\n"); // There's always at least one line. final int expectedNumLines = Math.max(1, expectedLogMessages.length); assertEquals(lines.length, expectedNumLines); for (int i = 0; i < expectedLogMessages.length; i++) { final String expectedLogMessage = expectedLogMessages[i]; final String line = lines[i]; assertEquals(getLogMessageAndAssertProperFormat(line), expectedLogMessage); } } private void thenEnsureProperNonRequestOutput(String... expectedLogMessages) { final List<String> logMessages = writer.getLogMessages(); assertNotNull(logMessages); assertEquals(logMessages.size(), expectedLogMessages.length); for (int i = 0; i < expectedLogMessages.length; i++) { final String expectedLogMessage = expectedLogMessages[i]; final String logMessage = logMessages.get(i); assertEquals(getLogMessageAndAssertProperFormat(logMessage), expectedLogMessage); } } private String getLogMessageAndAssertProperFormat(String line) { final String[] tokens0 = line.split("\\s+"); assertEquals(tokens0[0], ""); assertTrue(tokens0[1].matches("^[0-9]{4}-[0-9]{2}-[0-9]{2}$")); assertTrue(tokens0[2].matches("^[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}$")); assertEquals(tokens0[3], "INFO"); assertEquals(tokens0[4], "de.egym.egymapp.logqueue.EgymLogQueueImpl:"); return tokens0[5]; } }