com.seleritycorp.common.base.logging.CommonsLogLog4jIntegrationTest.java Source code

Java tutorial

Introduction

Here is the source code for com.seleritycorp.common.base.logging.CommonsLogLog4jIntegrationTest.java

Source

/*
 * Copyright (C) 2016-2018 Selerity, Inc. (support@seleritycorp.com)
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.seleritycorp.common.base.logging;

import static org.assertj.core.api.Assertions.assertThat;
import static org.easymock.EasyMock.capture;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.newCapture;

import org.apache.commons.logging.impl.Log4JLogger;
import org.apache.log4j.Appender;
import org.apache.log4j.Logger;
import org.apache.log4j.spi.LoggingEvent;
import org.easymock.Capture;
import org.easymock.EasyMockSupport;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.seleritycorp.common.base.logging.CommonsLog;
import com.seleritycorp.common.base.logging.Formatter;
import com.seleritycorp.common.base.logging.Log;

public class CommonsLogLog4jIntegrationTest extends EasyMockSupport {
    /**
     * The offset into the stack trace for getLineNumberHelper to determine the line number.
     * 
     * <p>If all tests fail all of a sudden, Java's stack structure may have changed.
     * Try decreasing/increasing this number to re-adjust line number getting.
     */
    private static int STACK_TRACE_INDEX_FOR_LINE_NUMBER = 2;

    private Formatter formatter;

    @Before
    public void setUp() {
        formatter = createMock(Formatter.class);
    }

    @After
    public void tearDown() {
        // We messed with logging, so better reset it.
        org.apache.commons.logging.LogFactory.releaseAll();
    }

    @Test
    public void testLineNumberHelper() {
        // We explicitly test this class' line number helper, so we get a canary to detect if all
        // tests are failing simply because the stack structure changed.
        //
        // See {@code #STACK_TRACE_INDEX_FOR_LINE_NUMBER} above.

        assertThat(getLineNumber()).isEqualTo("67");
    }

    @Test
    public void testTrace1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Trace1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.trace("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.TRACE);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testTrace2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Trace2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.trace("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.TRACE);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testDebug1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Debug1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.debug("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.DEBUG);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testDebug2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Debug2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.debug("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.DEBUG);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testInfo1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Info1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.info("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.INFO);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testInfo2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Info2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.info("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.INFO);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testWarn1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Warn1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.warn("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.WARN);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testWarn2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Warn2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.warn("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.WARN);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testError1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Error1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.error("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.ERROR);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testError2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Error2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.error("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.ERROR);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testFatal1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Fatal1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.fatal("foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.FATAL);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testFatal2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("Fatal2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.fatal("foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.FATAL);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogFatal1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogFatal1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.FATAL, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.FATAL);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogFatal2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogFatal2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.FATAL, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.FATAL);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogWarn1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogWarn1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.WARN, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.WARN);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogWarn2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogWarn2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.WARN, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.WARN);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogError1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogError1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.ERROR, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.ERROR);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogError2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogError2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.ERROR, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.ERROR);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogInfo1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogInfo1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.INFO, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.INFO);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogInfo2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogInfo2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.INFO, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.INFO);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogDebug1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogDebug1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.DEBUG, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.DEBUG);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogDebug2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogDebug2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.DEBUG, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.DEBUG);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogTrace1Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogTrace1Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.log(Level.TRACE, "foo");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.TRACE);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testLogTrace2Param() {
        Appender appender = createMock(Appender.class);

        CommonsLog log = createCommonsLog("LogTrace2Param", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        Exception e = new Exception("catch me");
        log.log(Level.TRACE, "foo", e);
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("foo");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.TRACE);
        assertThat(event.getThrowableInformation().getThrowable()).isEqualTo(e);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testStructuredInfo() {
        Appender appender = createMock(Appender.class);
        expect(formatter.formatStructuredLine("tagFoo", 42, "bar", "baz")).andReturn("quux");

        CommonsLog log = createCommonsLog("StructuredInfo", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.structuredInfo("tagFoo", 42, "bar", "baz");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("quux");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.INFO);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    @Test
    public void testStructuredDebug() {
        Appender appender = createMock(Appender.class);
        expect(formatter.formatStructuredLine("tagFoo", 42, "bar", "baz")).andReturn("quux");

        CommonsLog log = createCommonsLog("StructuredDebug", appender);

        Capture<LoggingEvent> loggingEventCapture = newCapture();
        appender.doAppend(capture(loggingEventCapture));

        replayAll();

        log.structuredDebug("tagFoo", 42, "bar", "baz");
        String lineNumber = getLineNumber();

        verifyAll();

        LoggingEvent event = loggingEventCapture.getValue();
        assertThat(event.getMessage()).isEqualTo("quux");
        assertThat(event.getLevel()).isEqualTo(org.apache.log4j.Level.DEBUG);
        assertThat(event.getLocationInformation().getLineNumber()).isEqualTo(lineNumber);
    }

    private CommonsLog createCommonsLog(String testName, Appender appender) {
        // Reset Commons Logging. Otherwise the setting won't be effective
        org.apache.commons.logging.LogFactory.releaseAll();

        // Force using Log4J
        System.setProperty(org.apache.commons.logging.impl.LogFactoryImpl.LOG_PROPERTY,
                "org.apache.commons.logging.impl.Log4JLogger");

        // Get the commons logging wrapper 
        org.apache.commons.logging.Log wrappedLogCommons = org.apache.commons.logging.LogFactory
                .getLog(CommonsLogLog4jIntegrationTest.class.getName() + ":" + testName);

        // Install the appender
        assertThat(wrappedLogCommons).isInstanceOf(Log4JLogger.class);
        Log4JLogger log4jLogger = (Log4JLogger) wrappedLogCommons;
        Logger logger = log4jLogger.getLogger();
        logger.addAppender(appender);
        logger.setLevel(org.apache.log4j.Level.TRACE);

        // created the CommonsLog
        Log wrappedLog = LogFactory.getLog(CommonsLogLog4jIntegrationTest.class.getName() + ":" + testName);
        return new CommonsLog(wrappedLog, formatter);
    }

    /**
     * Gets the line number of the caller
     * 
     * @return Caller's line number. The number is returned as String to make testing against log
     *     events simpler.
     */
    private String getLineNumber() {
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        return new Integer(stackTrace[STACK_TRACE_INDEX_FOR_LINE_NUMBER].getLineNumber()).toString();
    }
}