/** * This file is part of the source code and related artifacts for eGym Application. * * Copyright © 2013 eGym GmbH */ package de.egym.logqueue.slf4j; import static org.mockito.Mockito.*; import static org.testng.Assert.*; import org.joda.time.DateTime; import org.joda.time.Seconds; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import de.egym.logqueue.EgymLogLevel; import de.egym.logqueue.EgymLogQueue; import de.egym.logqueue.EgymLogRecord; @Test public class EgymLoggerTest { @Mock private EgymLogQueue logQueue; private EgymLogger logger; @BeforeMethod public void init() { MockitoAnnotations.initMocks(this); } @Test public void testNoQueue() { logger = new EgymLogger("foo"); logger.info("Hello World"); } @Test public void testWithQueue() { final DateTime now = DateTime.now(); final String message = "Hello World"; logger = new EgymLogger("foo"); EgymLogger.logQueue = logQueue; logger.info(message); final ArgumentCaptor<EgymLogRecord> logRecordCaptor = ArgumentCaptor.forClass(EgymLogRecord.class); verify(logQueue).log(logRecordCaptor.capture()); final EgymLogRecord logRecord = logRecordCaptor.getValue(); assertEquals(logRecord.getLogLevel(), EgymLogLevel.INFO); assertEquals(logRecord.getMessage(), message); assertEquals(logRecord.getSource(), logger); final int timeDiff = Seconds.secondsBetween(now, logRecord.getTimestamp()).getSeconds(); if (timeDiff < 0 || timeDiff > 5) { throw new AssertionError("Timestamp out of range: timeDiff=" + timeDiff); } } @Test public void testIsSufficientLogLevel() { assertEquals(new EgymLogger("foo").isSufficientLogLevel(EgymLogLevel.TRACE), false); assertEquals(new EgymLogger("foo").isSufficientLogLevel(EgymLogLevel.DEBUG), true); assertEquals(new EgymLogger("foo").isSufficientLogLevel(EgymLogLevel.INFO), true); assertEquals(new EgymLogger("foo").isSufficientLogLevel(EgymLogLevel.WARN), true); assertEquals(new EgymLogger("foo").isSufficientLogLevel(EgymLogLevel.ERROR), true); } @Test public void testIsSufficientLogLevelForHibernate() { assertEquals(new EgymLogger("org.hibernate.foo").isSufficientLogLevel(EgymLogLevel.TRACE), false); assertEquals(new EgymLogger("org.hibernate.foo").isSufficientLogLevel(EgymLogLevel.DEBUG), false); assertEquals(new EgymLogger("org.hibernate.bar").isSufficientLogLevel(EgymLogLevel.INFO), true); assertEquals(new EgymLogger("org.hibernate.bar").isSufficientLogLevel(EgymLogLevel.WARN), true); assertEquals(new EgymLogger("org.hibernate.bar").isSufficientLogLevel(EgymLogLevel.ERROR), true); } @Test public void testMessageFormattingWithOneArgument() { logger = new EgymLogger("foo"); EgymLogger.logQueue = logQueue; logger.debug("format string with arg1={}", "value1"); ArgumentCaptor<EgymLogRecord> argument = ArgumentCaptor.forClass(EgymLogRecord.class); verify(logQueue).log(argument.capture()); EgymLogRecord logRecord = argument.getValue(); assertEquals(logRecord.getMessage(), "format string with arg1=value1"); } @Test public void testMessageFormattingWithTwoArguments() { logger = new EgymLogger("foo"); EgymLogger.logQueue = logQueue; logger.debug("format string with arg1={} and arg2={}", "value1", "value2"); ArgumentCaptor<EgymLogRecord> logRecordCaptor = ArgumentCaptor.forClass(EgymLogRecord.class); verify(logQueue).log(logRecordCaptor.capture()); EgymLogRecord logRecord = logRecordCaptor.getValue(); assertEquals(logRecord.getMessage(), "format string with arg1=value1 and arg2=value2"); } @Test public void testMessageFormattingWithThreeArguments() { logger = new EgymLogger("foo"); EgymLogger.logQueue = logQueue; logger.debug("format string with arg1={} and arg2={} and arg3={}", "value1", "value2", "value3"); ArgumentCaptor<EgymLogRecord> logRecordCaptor = ArgumentCaptor.forClass(EgymLogRecord.class); verify(logQueue).log(logRecordCaptor.capture()); EgymLogRecord logRecord = logRecordCaptor.getValue(); assertEquals(logRecord.getMessage(), "format string with arg1=value1 and arg2=value2 and arg3=value3"); } }