| /* |
| * 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.log4j; |
| |
| import junit.framework.TestCase; |
| import org.apache.log4j.spi.LoggingEvent; |
| import org.apache.log4j.spi.RootLogger; |
| import org.apache.log4j.spi.LoggerRepository; |
| import org.apache.log4j.spi.HierarchyEventListener; |
| |
| import java.util.Enumeration; |
| import java.util.Locale; |
| import java.util.ResourceBundle; |
| import java.util.Vector; |
| |
| /** |
| Used for internal unit testing the Logger class. |
| |
| @author Ceki Gülcü |
| |
| */ |
| public class LoggerTestCase extends TestCase { |
| |
| Logger logger; |
| Appender a1; |
| Appender a2; |
| |
| ResourceBundle rbUS; |
| ResourceBundle rbFR; |
| ResourceBundle rbCH; |
| |
| // A short message. |
| static String MSG = "M"; |
| |
| |
| public LoggerTestCase(String name) { |
| super(name); |
| } |
| |
| public |
| void setUp() { |
| rbUS = ResourceBundle.getBundle("L7D", new Locale("en", "US")); |
| assertNotNull(rbUS); |
| |
| rbFR = ResourceBundle.getBundle("L7D", new Locale("fr", "FR")); |
| assertNotNull("Got a null resource bundle.", rbFR); |
| |
| rbCH = ResourceBundle.getBundle("L7D", new Locale("fr", "CH")); |
| assertNotNull("Got a null resource bundle.", rbCH); |
| |
| } |
| |
| public |
| void tearDown() { |
| // Regular users should not use the clear method lightly! |
| //Logger.getDefaultHierarchy().clear(); |
| BasicConfigurator.resetConfiguration(); |
| a1 = null; |
| a2 = null; |
| } |
| |
| /** |
| Add an appender and see if it can be retrieved. |
| */ |
| public |
| void testAppender1() { |
| logger = Logger.getLogger("test"); |
| a1 = new FileAppender(); |
| a1.setName("testAppender1"); |
| logger.addAppender(a1); |
| |
| Enumeration enumeration = logger.getAllAppenders(); |
| Appender aHat = (Appender) enumeration.nextElement(); |
| assertEquals(a1, aHat); |
| } |
| |
| /** |
| Add an appender X, Y, remove X and check if Y is the only |
| remaining appender. |
| */ |
| public |
| void testAppender2() { |
| a1 = new FileAppender(); |
| a1.setName("testAppender2.1"); |
| a2 = new FileAppender(); |
| a2.setName("testAppender2.2"); |
| |
| logger = Logger.getLogger("test"); |
| logger.addAppender(a1); |
| logger.addAppender(a2); |
| logger.removeAppender("testAppender2.1"); |
| Enumeration enumeration = logger.getAllAppenders(); |
| Appender aHat = (Appender) enumeration.nextElement(); |
| assertEquals(a2, aHat); |
| assertTrue(!enumeration.hasMoreElements()); |
| } |
| |
| /** |
| Test if logger a.b inherits its appender from a. |
| */ |
| public |
| void testAdditivity1() { |
| Logger a = Logger.getLogger("a"); |
| Logger ab = Logger.getLogger("a.b"); |
| CountingAppender ca = new CountingAppender(); |
| a.addAppender(ca); |
| |
| assertEquals(ca.counter, 0); |
| ab.debug(MSG); assertEquals(ca.counter, 1); |
| ab.info(MSG); assertEquals(ca.counter, 2); |
| ab.warn(MSG); assertEquals(ca.counter, 3); |
| ab.error(MSG); assertEquals(ca.counter, 4); |
| |
| |
| } |
| |
| /** |
| Test multiple additivity. |
| |
| */ |
| public |
| void testAdditivity2() { |
| |
| Logger a = Logger.getLogger("a"); |
| Logger ab = Logger.getLogger("a.b"); |
| Logger abc = Logger.getLogger("a.b.c"); |
| Logger x = Logger.getLogger("x"); |
| |
| CountingAppender ca1 = new CountingAppender(); |
| CountingAppender ca2 = new CountingAppender(); |
| |
| a.addAppender(ca1); |
| abc.addAppender(ca2); |
| |
| assertEquals(ca1.counter, 0); |
| assertEquals(ca2.counter, 0); |
| |
| ab.debug(MSG); |
| assertEquals(ca1.counter, 1); |
| assertEquals(ca2.counter, 0); |
| |
| abc.debug(MSG); |
| assertEquals(ca1.counter, 2); |
| assertEquals(ca2.counter, 1); |
| |
| x.debug(MSG); |
| assertEquals(ca1.counter, 2); |
| assertEquals(ca2.counter, 1); |
| } |
| |
| /** |
| Test additivity flag. |
| |
| */ |
| public |
| void testAdditivity3() { |
| |
| Logger root = Logger.getRootLogger(); |
| Logger a = Logger.getLogger("a"); |
| Logger ab = Logger.getLogger("a.b"); |
| Logger abc = Logger.getLogger("a.b.c"); |
| |
| CountingAppender caRoot = new CountingAppender(); |
| CountingAppender caA = new CountingAppender(); |
| CountingAppender caABC = new CountingAppender(); |
| |
| root.addAppender(caRoot); |
| a.addAppender(caA); |
| abc.addAppender(caABC); |
| |
| assertEquals(caRoot.counter, 0); |
| assertEquals(caA.counter, 0); |
| assertEquals(caABC.counter, 0); |
| |
| ab.setAdditivity(false); |
| |
| |
| a.debug(MSG); |
| assertEquals(caRoot.counter, 1); |
| assertEquals(caA.counter, 1); |
| assertEquals(caABC.counter, 0); |
| |
| ab.debug(MSG); |
| assertEquals(caRoot.counter, 1); |
| assertEquals(caA.counter, 1); |
| assertEquals(caABC.counter, 0); |
| |
| abc.debug(MSG); |
| assertEquals(caRoot.counter, 1); |
| assertEquals(caA.counter, 1); |
| assertEquals(caABC.counter, 1); |
| |
| } |
| |
| |
| public |
| void testDisable1() { |
| CountingAppender caRoot = new CountingAppender(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(caRoot); |
| |
| LoggerRepository h = LogManager.getLoggerRepository(); |
| //h.disableDebug(); |
| h.setThreshold((Level) Level.INFO); |
| assertEquals(caRoot.counter, 0); |
| |
| root.debug(MSG); assertEquals(caRoot.counter, 0); |
| root.info(MSG); assertEquals(caRoot.counter, 1); |
| root.log(Level.WARN, MSG); assertEquals(caRoot.counter, 2); |
| root.warn(MSG); assertEquals(caRoot.counter, 3); |
| |
| //h.disableInfo(); |
| h.setThreshold((Level) Level.WARN); |
| root.debug(MSG); assertEquals(caRoot.counter, 3); |
| root.info(MSG); assertEquals(caRoot.counter, 3); |
| root.log(Level.WARN, MSG); assertEquals(caRoot.counter, 4); |
| root.error(MSG); assertEquals(caRoot.counter, 5); |
| root.log(Level.ERROR, MSG); assertEquals(caRoot.counter, 6); |
| |
| //h.disableAll(); |
| h.setThreshold(Level.OFF); |
| root.debug(MSG); assertEquals(caRoot.counter, 6); |
| root.info(MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.WARN, MSG); assertEquals(caRoot.counter, 6); |
| root.error(MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.FATAL, MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.FATAL, MSG); assertEquals(caRoot.counter, 6); |
| |
| //h.disable(Level.FATAL); |
| h.setThreshold(Level.OFF); |
| root.debug(MSG); assertEquals(caRoot.counter, 6); |
| root.info(MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.WARN, MSG); assertEquals(caRoot.counter, 6); |
| root.error(MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.ERROR, MSG); assertEquals(caRoot.counter, 6); |
| root.log(Level.FATAL, MSG); assertEquals(caRoot.counter, 6); |
| } |
| |
| |
| public |
| void testRB1() { |
| Logger root = Logger.getRootLogger(); |
| root.setResourceBundle(rbUS); |
| ResourceBundle t = root.getResourceBundle(); |
| assertSame(t, rbUS); |
| |
| Logger x = Logger.getLogger("x"); |
| Logger x_y = Logger.getLogger("x.y"); |
| Logger x_y_z = Logger.getLogger("x.y.z"); |
| |
| t = x.getResourceBundle(); assertSame(t, rbUS); |
| t = x_y.getResourceBundle(); assertSame(t, rbUS); |
| t = x_y_z.getResourceBundle(); assertSame(t, rbUS); |
| } |
| |
| public |
| void testRB2() { |
| Logger root = Logger.getRootLogger(); |
| root.setResourceBundle(rbUS); |
| ResourceBundle t = root.getResourceBundle(); |
| assertSame(t, rbUS); |
| |
| Logger x = Logger.getLogger("x"); |
| Logger x_y = Logger.getLogger("x.y"); |
| Logger x_y_z = Logger.getLogger("x.y.z"); |
| |
| x_y.setResourceBundle(rbFR); |
| t = x.getResourceBundle(); assertSame(t, rbUS); |
| t = x_y.getResourceBundle(); assertSame(t, rbFR); |
| t = x_y_z.getResourceBundle(); assertSame(t, rbFR); |
| } |
| |
| |
| public |
| void testRB3() { |
| Logger root = Logger.getRootLogger(); |
| root.setResourceBundle(rbUS); |
| ResourceBundle t = root.getResourceBundle(); |
| assertSame(t, rbUS); |
| |
| Logger x = Logger.getLogger("x"); |
| Logger x_y = Logger.getLogger("x.y"); |
| Logger x_y_z = Logger.getLogger("x.y.z"); |
| |
| x_y.setResourceBundle(rbFR); |
| x_y_z.setResourceBundle(rbCH); |
| t = x.getResourceBundle(); assertSame(t, rbUS); |
| t = x_y.getResourceBundle(); assertSame(t, rbFR); |
| t = x_y_z.getResourceBundle(); assertSame(t, rbCH); |
| } |
| |
| public |
| void testExists() { |
| Logger a = Logger.getLogger("a"); |
| Logger a_b = Logger.getLogger("a.b"); |
| Logger a_b_c = Logger.getLogger("a.b.c"); |
| |
| Logger t; |
| t = LogManager.exists("xx"); assertNull(t); |
| t = LogManager.exists("a"); assertSame(a, t); |
| t = LogManager.exists("a.b"); assertSame(a_b, t); |
| t = LogManager.exists("a.b.c"); assertSame(a_b_c, t); |
| } |
| |
| public |
| void testHierarchy1() { |
| Hierarchy h = new Hierarchy(new RootLogger((Level) Level.ERROR)); |
| Logger a0 = h.getLogger("a"); |
| assertEquals("a", a0.getName()); |
| assertNull(a0.getLevel()); |
| assertSame(Level.ERROR, a0.getEffectiveLevel()); |
| |
| Logger a1 = h.getLogger("a"); |
| assertSame(a0, a1); |
| } |
| |
| /** |
| * Tests logger.trace(Object). |
| * @since 1.2.12 |
| */ |
| public void testTrace() { |
| VectorAppender appender = new VectorAppender(); |
| appender.activateOptions(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| root.setLevel(Level.INFO); |
| |
| Logger tracer = Logger.getLogger("com.example.Tracer"); |
| tracer.setLevel(Level.TRACE); |
| |
| tracer.trace("Message 1"); |
| root.trace("Discarded Message"); |
| root.trace("Discarded Message"); |
| |
| Vector msgs = appender.getVector(); |
| assertEquals(1, msgs.size()); |
| LoggingEvent event = (LoggingEvent) msgs.elementAt(0); |
| assertEquals(Level.TRACE, event.getLevel()); |
| assertEquals("Message 1", event.getMessage()); |
| } |
| |
| /** |
| * Tests logger.trace(Object, Exception). |
| * @since 1.2.12 |
| */ |
| public void testTraceWithException() { |
| VectorAppender appender = new VectorAppender(); |
| appender.activateOptions(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| root.setLevel(Level.INFO); |
| |
| Logger tracer = Logger.getLogger("com.example.Tracer"); |
| tracer.setLevel(Level.TRACE); |
| NullPointerException ex = new NullPointerException(); |
| |
| tracer.trace("Message 1", ex); |
| root.trace("Discarded Message", ex); |
| root.trace("Discarded Message", ex); |
| |
| Vector msgs = appender.getVector(); |
| assertEquals(1, msgs.size()); |
| LoggingEvent event = (LoggingEvent) msgs.elementAt(0); |
| assertEquals(Level.TRACE, event.getLevel()); |
| assertEquals("Message 1", event.getMessage()); |
| } |
| |
| /** |
| * Tests isTraceEnabled. |
| * @since 1.2.12 |
| */ |
| public void testIsTraceEnabled() { |
| VectorAppender appender = new VectorAppender(); |
| appender.activateOptions(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| root.setLevel(Level.INFO); |
| |
| Logger tracer = Logger.getLogger("com.example.Tracer"); |
| tracer.setLevel(Level.TRACE); |
| |
| assertTrue(tracer.isTraceEnabled()); |
| assertFalse(root.isTraceEnabled()); |
| } |
| |
| private static final class CountingHierarchyEventListener implements HierarchyEventListener { |
| private int addEventCount; |
| private int removeEventCount; |
| |
| public CountingHierarchyEventListener() { |
| addEventCount = removeEventCount = 0; |
| } |
| public void addAppenderEvent(Category cat, Appender appender) { |
| addEventCount++; |
| } |
| |
| public void removeAppenderEvent(Category cat, Appender appender) { |
| removeEventCount++; |
| } |
| |
| public int getAddEventCount() { |
| return addEventCount; |
| } |
| public int getRemoveEventCount() { |
| return removeEventCount; |
| } |
| } |
| |
| |
| public void testAppenderEvent1() { |
| CountingHierarchyEventListener listener = new CountingHierarchyEventListener(); |
| LogManager.getLoggerRepository().addHierarchyEventListener(listener); |
| CountingAppender appender = new CountingAppender(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(0, listener.getRemoveEventCount()); |
| root.removeAppender(appender); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(1, listener.getRemoveEventCount()); |
| } |
| |
| public void testAppenderEvent2() { |
| CountingHierarchyEventListener listener = new CountingHierarchyEventListener(); |
| LogManager.getLoggerRepository().addHierarchyEventListener(listener); |
| CountingAppender appender = new CountingAppender(); |
| appender.setName("A1"); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(0, listener.getRemoveEventCount()); |
| root.removeAppender(appender.getName()); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(1, listener.getRemoveEventCount()); |
| } |
| |
| public void testAppenderEvent3() { |
| CountingHierarchyEventListener listener = new CountingHierarchyEventListener(); |
| LogManager.getLoggerRepository().addHierarchyEventListener(listener); |
| CountingAppender appender = new CountingAppender(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(0, listener.getRemoveEventCount()); |
| root.removeAllAppenders(); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(1, listener.getRemoveEventCount()); |
| } |
| |
| |
| public void testAppenderEvent4() { |
| CountingHierarchyEventListener listener = new CountingHierarchyEventListener(); |
| LogManager.getLoggerRepository().addHierarchyEventListener(listener); |
| CountingAppender appender = new CountingAppender(); |
| Logger root = Logger.getRootLogger(); |
| root.addAppender(appender); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(0, listener.getRemoveEventCount()); |
| LogManager.resetConfiguration(); |
| assertEquals(1, listener.getAddEventCount()); |
| assertEquals(1, listener.getRemoveEventCount()); |
| } |
| |
| static private class CountingAppender extends AppenderSkeleton { |
| |
| int counter; |
| |
| CountingAppender() { |
| counter = 0; |
| } |
| public void close() { |
| } |
| |
| public |
| void append(LoggingEvent event) { |
| counter++; |
| } |
| |
| public |
| boolean requiresLayout() { |
| return true; |
| } |
| } |
| } |