blob: ece83e2cb4cd4667dc2ff31bf6cc2c75e7ec0d79 [file] [log] [blame]
/*
* 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;
}
}
}