    001/**
    002 * Copyright (c) 2004-2011 QOS.ch
    003 * All rights reserved.
    004 *
    005 * Permission is hereby granted, free  of charge, to any person obtaining
    006 * a  copy  of this  software  and  associated  documentation files  (the
    007 * "Software"), to  deal in  the Software without  restriction, including
    008 * without limitation  the rights to  use, copy, modify,  merge, publish,
    009 * distribute,  sublicense, and/or sell  copies of  the Software,  and to
    010 * permit persons to whom the Software  is furnished to do so, subject to
    011 * the following conditions:
    012 *
    013 * The  above  copyright  notice  and  this permission  notice  shall  be
    014 * included in all copies or substantial portions of the Software.
    015 *
    016 * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
    017 * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
    018 * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
    019 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
    020 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
    021 * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
    022 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    023 *
    024 */
    025package org.slf4j.bridge;
    026
    027import static org.junit.Assert.assertEquals;
    028
    029import java.text.MessageFormat;
    030import java.util.ResourceBundle;
    031import java.util.logging.Level;
    032
    033import org.apache.log4j.spi.LocationInfo;
    034import org.apache.log4j.spi.LoggingEvent;
    035import org.junit.After;
    036import org.junit.Before;
    037import org.junit.Test;
    038
    039public class SLF4JBridgeHandlerTest {
    040
    041    static String LOGGER_NAME = "yay";
    042
    043    ListAppender listAppender = new ListAppender();
    044    org.apache.log4j.Logger log4jRoot;
    045    java.util.logging.Logger julLogger = java.util.logging.Logger.getLogger("yay");
    046
    047    @Before
    048    public void setUp() throws Exception {
    049        listAppender.extractLocationInfo = true;
    050        log4jRoot = org.apache.log4j.Logger.getRootLogger();
    051        log4jRoot.addAppender(listAppender);
    052        log4jRoot.setLevel(org.apache.log4j.Level.TRACE);
    053    }
    054
    055    @After
    056    public void tearDown() throws Exception {
    057        SLF4JBridgeHandler.uninstall();
    058        log4jRoot.getLoggerRepository().resetConfiguration();
    059    }
    060
    061    @Test
    062    public void testSmoke() {
    063        SLF4JBridgeHandler.install();
    064        String msg = "msg";
    065        julLogger.info(msg);
    066        assertEquals(1, listAppender.list.size());
    067        LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
    068        assertEquals(LOGGER_NAME, le.getLoggerName());
    069        assertEquals(msg, le.getMessage());
    070
    071        // get the location info in the event.
    072        // Note that this must have been computed previously
    073        // within an appender for the following assertion to
    074        // work properly
    075        LocationInfo li = le.getLocationInformation();
    076        System.out.println(li.fullInfo);
    077        assertEquals("SLF4JBridgeHandlerTest.java", li.getFileName());
    078        assertEquals("testSmoke", li.getMethodName());
    079    }
    080
    081    @Test
    082    public void testLevels() {
    083        SLF4JBridgeHandler.install();
    084        String msg = "msg";
    085        julLogger.setLevel(Level.ALL);
    086
    087        julLogger.finest(msg);
    088        julLogger.finer(msg);
    089        julLogger.fine(msg);
    090        julLogger.info(msg);
    091        julLogger.warning(msg);
    092        julLogger.severe(msg);
    093
    094        assertEquals(6, listAppender.list.size());
    095        int i = 0;
    096        assertLevel(i++, org.apache.log4j.Level.TRACE);
    097        assertLevel(i++, org.apache.log4j.Level.DEBUG);
    098        assertLevel(i++, org.apache.log4j.Level.DEBUG);
    099        assertLevel(i++, org.apache.log4j.Level.INFO);
    100        assertLevel(i++, org.apache.log4j.Level.WARN);
    101        assertLevel(i++, org.apache.log4j.Level.ERROR);
    102    }
    103
    104    @Test
    105    public void testLogWithResourceBundle() {
    106        SLF4JBridgeHandler.install();
    107
    108        String resourceBundleName = "org.slf4j.bridge.testLogStrings";
    109        ResourceBundle bundle = ResourceBundle.getBundle(resourceBundleName);
    110        String resourceKey = "resource_key";
    111        String expectedMsg = bundle.getString(resourceKey);
    112        String msg = resourceKey;
    113
    114        java.util.logging.Logger julResourceBundleLogger = java.util.logging.Logger.getLogger("yay", resourceBundleName);
    115
    116        julResourceBundleLogger.info(msg);
    117        assertEquals(1, listAppender.list.size());
    118        LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
    119        assertEquals(LOGGER_NAME, le.getLoggerName());
    120        assertEquals(expectedMsg, le.getMessage());
    121    }
    122
    123    @Test
    124    public void testLogWithResourceBundleWithParameters() {
    125        SLF4JBridgeHandler.install();
    126
    127        String resourceBundleName = "org.slf4j.bridge.testLogStrings";
    128        ResourceBundle bundle = ResourceBundle.getBundle(resourceBundleName);
    129
    130        java.util.logging.Logger julResourceBundleLogger = java.util.logging.Logger.getLogger("foo", resourceBundleName);
    131
    132        String resourceKey1 = "resource_key_1";
    133        String expectedMsg1 = bundle.getString(resourceKey1);
    134        julResourceBundleLogger.info(resourceKey1); // 1st log
    135
    136        String resourceKey2 = "resource_key_2";
    137        Object[] params2 = new Object[] { "foo", "bar" };
    138        String expectedMsg2 = MessageFormat.format(bundle.getString(resourceKey2), params2);
    139        julResourceBundleLogger.log(Level.INFO, resourceKey2, params2); // 2nd log
    140
    141        String resourceKey3 = "invalidKey {0}";
    142        Object[] params3 = new Object[] { "John" };
    143        String expectedMsg3 = MessageFormat.format(resourceKey3, params3);
    144        julResourceBundleLogger.log(Level.INFO, resourceKey3, params3); // 3rd log
    145
    146        julLogger.log(Level.INFO, resourceKey3, params3); // 4th log
    147
    148        assertEquals(4, listAppender.list.size());
    149
    150        LoggingEvent le = null;
    151
    152        le = (LoggingEvent) listAppender.list.get(0);
    153        assertEquals("foo", le.getLoggerName());
    154        assertEquals(expectedMsg1, le.getMessage());
    155
    156        le = (LoggingEvent) listAppender.list.get(1);
    157        assertEquals("foo", le.getLoggerName());
    158        assertEquals(expectedMsg2, le.getMessage());
    159
    160        le = (LoggingEvent) listAppender.list.get(2);
    161        assertEquals("foo", le.getLoggerName());
    162        assertEquals(expectedMsg3, le.getMessage());
    163
    164        le = (LoggingEvent) listAppender.list.get(3);
    165        assertEquals("yay", le.getLoggerName());
    166        assertEquals(expectedMsg3, le.getMessage());
    167    }
    168
    169    @Test
    170    public void testLogWithPlaceholderNoParameters() {
    171        SLF4JBridgeHandler.install();
    172        String msg = "msg {non-number-string}";
    173        julLogger.logp(Level.INFO, "SLF4JBridgeHandlerTest", "testLogWithPlaceholderNoParameters", msg, new Object[0]);
    174
    175        assertEquals(1, listAppender.list.size());
    176        LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
    177        assertEquals(LOGGER_NAME, le.getLoggerName());
    178        assertEquals(msg, le.getMessage());
    179    }
    180
    181    // See http://jira.qos.ch/browse/SLF4J-337
    182
    183    @Test
    184    public void illFormattedInputShouldBeReturnedAsIs() {
    185        SLF4JBridgeHandler.install();
    186        String msg = "foo {18=bad} {0}";
    187
    188        julLogger.log(Level.INFO, msg, "ignored parameter due to IllegalArgumentException");
    189        assertEquals(1, listAppender.list.size());
    190        LoggingEvent le = (LoggingEvent) listAppender.list.get(0);
    191        assertEquals(msg, le.getMessage());
    192    }
    193
    194    void assertLevel(int index, org.apache.log4j.Level expectedLevel) {
    195        LoggingEvent le = (LoggingEvent) listAppender.list.get(index);
    196        assertEquals(expectedLevel, le.getLevel());
    197    }
    198}