/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.cxf.common.logging; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.LogRecord; import java.util.logging.Logger; import org.apache.cxf.common.i18n.BundleUtils; import org.easymock.EasyMock; import org.easymock.IArgumentMatcher; import org.junit.Assert; import org.junit.Test; public class LogUtilsTest extends Assert { @Test public void testGetL7dLog() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testGetL7dLog"); assertNotNull("expected non-null logger", log); assertEquals("unexpected resource bundle name", BundleUtils.getBundleName(LogUtilsTest.class), log.getResourceBundleName()); Logger otherLogger = LogUtils.getL7dLogger(LogUtilsTest.class, "Messages", "testGetL7dLog"); assertEquals("unexpected resource bundle name", BundleUtils.getBundleName(LogUtilsTest.class, "Messages"), otherLogger.getResourceBundleName()); } @Test public void testHandleL7dMessage() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testHandleL7dMessage"); Handler handler = EasyMock.createNiceMock(Handler.class); log.addHandler(handler); // handler called *before* localization of message LogRecord record = new LogRecord(Level.WARNING, "FOOBAR_MSG"); record.setResourceBundle(log.getResourceBundle()); EasyMock.reportMatcher(new LogRecordMatcher(record)); handler.publish(record); EasyMock.replay(handler); log.log(Level.WARNING, "FOOBAR_MSG"); EasyMock.verify(handler); log.removeHandler(handler); } @Test public void testLogNoParamsOrThrowable() { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testLogNoParamsOrThrowable"); Handler handler = EasyMock.createNiceMock(Handler.class); log.addHandler(handler); // handler called *after* localization of message LogRecord record = new LogRecord(Level.SEVERE, "subbed in {0} only"); EasyMock.reportMatcher(new LogRecordMatcher(record)); handler.publish(record); EasyMock.replay(handler); LogUtils.log(log, Level.SEVERE, "SUB1_MSG"); EasyMock.verify(handler); log.removeHandler(handler); } @Test public void testLogNoParamsWithThrowable() { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testLogNoParamsWithThrowable"); Handler handler = EasyMock.createNiceMock(Handler.class); Exception ex = new Exception("x"); LogRecord record = new LogRecord(Level.SEVERE, "subbed in {0} only"); record.setThrown(ex); EasyMock.reportMatcher(new LogRecordMatcher(record)); handler.publish(record); EasyMock.replay(handler); synchronized (log) { log.addHandler(handler); // handler called *after* localization of message LogUtils.log(log, Level.SEVERE, "SUB1_MSG", ex); EasyMock.verify(handler); log.removeHandler(handler); } } @Test public void testLogParamSubstitutionWithThrowable() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testLogParamSubstitutionWithThrowable"); Handler handler = EasyMock.createNiceMock(Handler.class); Exception ex = new Exception(); LogRecord record = new LogRecord(Level.SEVERE, "subbed in 1 only"); record.setThrown(ex); EasyMock.reportMatcher(new LogRecordMatcher(record)); handler.publish(record); EasyMock.replay(handler); synchronized (log) { log.addHandler(handler); LogUtils.log(log, Level.SEVERE, "SUB1_MSG", ex, 1); EasyMock.verify(handler); log.removeHandler(handler); } } @Test public void testLogParamsSubstitutionWithThrowable() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testLogParamsSubstitutionWithThrowable"); Handler handler = EasyMock.createNiceMock(Handler.class); Exception ex = new Exception(); LogRecord record = new LogRecord(Level.SEVERE, "subbed in 4 & 3"); record.setThrown(ex); EasyMock.reportMatcher(new LogRecordMatcher(record)); handler.publish(record); EasyMock.replay(handler); synchronized (log) { log.addHandler(handler); LogUtils.log(log, Level.SEVERE, "SUB2_MSG", ex, new Object[] {3, 4}); EasyMock.verify(handler); log.removeHandler(handler); } } @Test public void testCXF1420() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testCXF1420"); LogUtils.log(log, Level.SEVERE, "SQLException for SQL [{call FOO.ping(?, ?)}]"); } @Test public void testClassMethodNames() throws Exception { Logger log = LogUtils.getL7dLogger(LogUtilsTest.class, null, "testClassMethodNames"); TestLogHandler handler = new TestLogHandler(); log.addHandler(handler); // logger called directly log.warning("hello"); String cname = handler.cname; String mname = handler.mname; // logger called through LogUtils LogUtils.log(log, Level.WARNING, "FOOBAR_MSG"); assertEquals(cname, handler.cname); assertEquals(mname, handler.mname); } private static final class TestLogHandler extends Handler { String cname; String mname; public void close() throws SecurityException { } public void flush() { } public void publish(LogRecord record) { cname = record.getSourceClassName(); mname = record.getSourceMethodName(); } } private static final class LogRecordMatcher implements IArgumentMatcher { private final LogRecord record; private LogRecordMatcher(LogRecord r) { this.record = r; } public boolean matches(Object obj) { if (obj instanceof LogRecord) { LogRecord other = (LogRecord)obj; String l7dString = "NOT-L7D"; if (record.getResourceBundle() != null) { l7dString = record.getResourceBundle().getString(record.getMessage()); } return (record.getMessage().equals(other.getMessage()) || l7dString.equals(other.getMessage())) && record.getLevel().equals(other.getLevel()) && record.getThrown() == other.getThrown(); } return false; } public void appendTo(StringBuffer buffer) { buffer.append("log records did not match"); } } }