From e462bae3aff29900e98d46c161170773e742a20f Mon Sep 17 00:00:00 2001 From: "Craig R. McClanahan" Date: Sun, 30 Mar 2003 05:22:50 +0000 Subject: [PATCH] Add basic tests for Log4J. Still need to add the multi-classloader scenarios. git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/logging/trunk@138960 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 65 +++- .../logging/jdk14/CustomConfigTestCase.java | 15 +- .../logging/log4j/CustomConfig.properties | 8 + .../logging/log4j/CustomConfigTestCase.java | 318 ++++++++++++++++++ .../logging/log4j/DefaultConfigTestCase.java | 205 +++++++++++ .../commons/logging/log4j/TestAppender.java | 120 +++++++ 6 files changed, 723 insertions(+), 8 deletions(-) create mode 100644 src/test/org/apache/commons/logging/log4j/CustomConfig.properties create mode 100644 src/test/org/apache/commons/logging/log4j/CustomConfigTestCase.java create mode 100644 src/test/org/apache/commons/logging/log4j/DefaultConfigTestCase.java create mode 100644 src/test/org/apache/commons/logging/log4j/TestAppender.java diff --git a/build.xml b/build.xml index 4739f35..fb2a6cf 100644 --- a/build.xml +++ b/build.xml @@ -3,7 +3,7 @@ @@ -103,6 +103,14 @@ + + + + + + + + @@ -226,6 +234,8 @@ basedir="${build.home}/tests" manifest="${conf.home}/MANIFEST.MF"> + - @@ -417,4 +428,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java b/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java index 4e95a24..8e78962 100644 --- a/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java +++ b/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java,v 1.2 2003/03/30 02:30:37 craigmcc Exp $ - * $Revision: 1.2 $ - * $Date: 2003/03/30 02:30:37 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/jdk14/CustomConfigTestCase.java,v 1.3 2003/03/30 05:22:50 craigmcc Exp $ + * $Revision: 1.3 $ + * $Date: 2003/03/30 05:22:50 $ * * ==================================================================== * @@ -84,7 +84,7 @@ import org.apache.commons.logging.LogFactory; * logger configured per the configuration properties.

* * @author Craig R. McClanahan - * @version $Revision: 1.2 $ $Date: 2003/03/30 02:30:37 $ + * @version $Revision: 1.3 $ $Date: 2003/03/30 05:22:50 $ */ public class CustomConfigTestCase extends DefaultConfigTestCase { @@ -142,14 +142,14 @@ public class CustomConfigTestCase extends DefaultConfigTestCase { *

The message levels that should have been logged.

*/ protected Level testLevels[] = - { Level.FINE, Level.INFO, Level.WARNING, Level.SEVERE }; + { Level.FINE, Level.INFO, Level.WARNING, Level.SEVERE, Level.SEVERE }; /** *

The message strings that should have been logged.

*/ protected String testMessages[] = - { "debug", "info", "warn", "error" }; + { "debug", "info", "warn", "error", "fatal" }; // ------------------------------------------- JUnit Infrastructure Methods @@ -224,6 +224,7 @@ public class CustomConfigTestCase extends DefaultConfigTestCase { super.testPristineLog(); // Assert which logging levels have been enabled + assertTrue(log.isFatalEnabled()); assertTrue(log.isErrorEnabled()); assertTrue(log.isWarnEnabled()); assertTrue(log.isInfoEnabled()); @@ -298,6 +299,7 @@ public class CustomConfigTestCase extends DefaultConfigTestCase { log.info("info", t); log.warn("warn", t); log.error("error", t); + log.fatal("fatal", t); } @@ -308,6 +310,7 @@ public class CustomConfigTestCase extends DefaultConfigTestCase { log.info("info"); log.warn("warn"); log.error("error"); + log.fatal("fatal"); } diff --git a/src/test/org/apache/commons/logging/log4j/CustomConfig.properties b/src/test/org/apache/commons/logging/log4j/CustomConfig.properties new file mode 100644 index 0000000..4a19514 --- /dev/null +++ b/src/test/org/apache/commons/logging/log4j/CustomConfig.properties @@ -0,0 +1,8 @@ +# This is the custom configuration properties for the Log4J logger tests +# in CustomConfigTestCase. + +# Configure the root logger's level and appender +log4j.rootLogger = INFO, A1 + +# Configure the default appender +log4j.appender.A1 = org.apache.commons.logging.log4j.TestAppender diff --git a/src/test/org/apache/commons/logging/log4j/CustomConfigTestCase.java b/src/test/org/apache/commons/logging/log4j/CustomConfigTestCase.java new file mode 100644 index 0000000..e607fbf --- /dev/null +++ b/src/test/org/apache/commons/logging/log4j/CustomConfigTestCase.java @@ -0,0 +1,318 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/log4j/CustomConfigTestCase.java,v 1.1 2003/03/30 05:22:50 craigmcc Exp $ + * $Revision: 1.1 $ + * $Date: 2003/03/30 05:22:50 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.logging.log4j; + + +import java.io.InputStream; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.Properties; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.log4j.Level; +import org.apache.log4j.Logger; +import org.apache.log4j.PropertyConfigurator; +import org.apache.log4j.spi.LoggingEvent; + + +/** + *

TestCase for Log4J logging when running on a system with Log4J present, + * so that Log4J should be selected and an appropriate + * logger configured per the configuration properties.

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2003/03/30 05:22:50 $ + */ + +public class CustomConfigTestCase extends DefaultConfigTestCase { + + + // ----------------------------------------------------------- Constructors + + + /** + *

Construct a new instance of this test case.

+ */ + public CustomConfigTestCase() { + super(); + } + + + /** + *

Construct a new instance of this test case.

+ * + * @param name Name of the test case + */ + public CustomConfigTestCase(String name) { + super(name); + } + + + // ----------------------------------------------------- Instance Variables + + + /** + *

The Appender we are utilizing.

+ */ + protected TestAppender appender = null; + + + /** + *

The Logger we are utilizing.

+ */ + protected Logger logger = null; + + + /** + *

The message levels that should have been logged.

+ */ + protected Level testLevels[] = + { Level.INFO, Level.WARN, Level.ERROR, Level.FATAL }; + + + /** + *

The message strings that should have been logged.

+ */ + protected String testMessages[] = + { "info", "warn", "error", "fatal" }; + + + // ------------------------------------------- JUnit Infrastructure Methods + + + /** + * Set up instance variables required by this test case. + */ + public void setUp() throws Exception { + setUpAppender + ("org/apache/commons/logging/log4j/CustomConfig.properties"); + setUpLogger("TestLogger"); + setUpFactory(); + setUpLog("TestLogger"); + } + + + /** + * Return the tests included in this test suite. + */ + public static Test suite() { + return (new TestSuite(CustomConfigTestCase.class)); + } + + /** + * Tear down instance variables required by this test case. + */ + public void tearDown() { + super.tearDown(); + Logger.getRootLogger().removeAppender(appender); + appender = null; + logger = null; + } + + + // ----------------------------------------------------------- Test Methods + + + // Test logging message strings with exceptions + public void testExceptionMessages() throws Exception { + + logExceptionMessages(); + checkLoggingEvents(true); + + } + + + // Test logging plain message strings + public void testPlainMessages() throws Exception { + + logPlainMessages(); + checkLoggingEvents(false); + + } + + + // Test pristine Appender instance + public void testPristineAppender() { + + assertNotNull("Appender exists", appender); + + } + + + // Test pristine Log instance + public void testPristineLog() { + + super.testPristineLog(); + + // Assert which logging levels have been enabled + assertTrue(log.isErrorEnabled()); + assertTrue(log.isWarnEnabled()); + assertTrue(log.isInfoEnabled()); + assertTrue(!log.isDebugEnabled()); + assertTrue(!log.isTraceEnabled()); + + } + + + // Test pristine Logger instance + public void testPristineLogger() { + + assertNotNull("Logger exists", logger); + assertEquals("Logger level", Level.INFO, logger.getEffectiveLevel()); + assertEquals("Logger name", "TestLogger", logger.getName()); + + } + + + // -------------------------------------------------------- Support Methods + + + // Check the recorded messages + protected void checkLoggingEvents(boolean thrown) { + Iterator events = appender.events(); + for (int i = 0; i < testMessages.length; i++) { + assertTrue(events.hasNext()); + LoggingEvent event = (LoggingEvent) events.next(); + assertEquals("LoggingEvent level", + testLevels[i], event.getLevel()); + assertEquals("LoggingEvent message", + testMessages[i], event.getMessage()); + /* Does not appear to be logged correctly? + assertEquals("LoggingEvent class", + this.getClass().getName(), + event.getLocationInformation().getClassName()); + */ + /* Does not appear to be logged correctly? + if (thrown) { + assertEquals("LoggingEvent method", + "logExceptionMessages", + event.getLocationInformation().getMethodName()); + } else { + assertEquals("LoggingEvent method", + "logPlainMessages", + event.getLocationInformation().getMethodName()); + } + */ + if (thrown) { + assertNotNull("LoggingEvent thrown", + event.getThrowableInformation().getThrowable()); + assertTrue("LoggingEvent thrown type", + event.getThrowableInformation().getThrowable() + instanceof IndexOutOfBoundsException); + } else { + assertNull("LoggingEvent thrown", + event.getThrowableInformation()); + } + } + assertTrue(!events.hasNext()); + appender.flush(); + } + + + // Log the messages with exceptions + protected void logExceptionMessages() { + Throwable t = new IndexOutOfBoundsException(); + log.trace("trace", t); // Should not actually get logged + log.debug("debug", t); // Should not actually get logged + log.info("info", t); + log.warn("warn", t); + log.error("error", t); + log.fatal("fatal", t); + } + + + // Log the plain messages + protected void logPlainMessages() { + log.trace("trace"); // Should not actually get logged + log.debug("debug"); // Should not actually get logged + log.info("info"); + log.warn("warn"); + log.error("error"); + log.fatal("fatal"); + } + + + // Set up our custom Appender + protected void setUpAppender(String config) throws Exception { + Properties props = new Properties(); + InputStream is = + this.getClass().getClassLoader().getResourceAsStream(config); + props.load(is); + is.close(); + PropertyConfigurator.configure(props); + Enumeration appenders = Logger.getRootLogger().getAllAppenders(); + appender = (TestAppender) appenders.nextElement(); + } + + + // Set up our custom Logger + protected void setUpLogger(String name) throws Exception { + logger = Logger.getLogger(name); + } + + +} diff --git a/src/test/org/apache/commons/logging/log4j/DefaultConfigTestCase.java b/src/test/org/apache/commons/logging/log4j/DefaultConfigTestCase.java new file mode 100644 index 0000000..c22249f --- /dev/null +++ b/src/test/org/apache/commons/logging/log4j/DefaultConfigTestCase.java @@ -0,0 +1,205 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/log4j/DefaultConfigTestCase.java,v 1.1 2003/03/30 05:22:50 craigmcc Exp $ + * $Revision: 1.1 $ + * $Date: 2003/03/30 05:22:50 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.logging.log4j; + + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + + +/** + *

TestCase for Log4J logging when running on a system with + * zero configuration, and with Log4J present (so Log4J logging + * should be automatically configured).

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2003/03/30 05:22:50 $ + */ + +public class DefaultConfigTestCase extends TestCase { + + + // ----------------------------------------------------------- Constructors + + + /** + *

Construct a new instance of this test case.

+ */ + public DefaultConfigTestCase() { + super(); + } + + + /** + *

Construct a new instance of this test case.

+ * + * @param name Name of the test case + */ + public DefaultConfigTestCase(String name) { + super(name); + } + + + // ----------------------------------------------------- Instance Variables + + + /** + *

The {@link LogFactory} implementation we have selected.

+ */ + protected LogFactory factory = null; + + + /** + *

The {@link Log} implementation we have selected.

+ */ + protected Log log = null; + + + // ------------------------------------------- JUnit Infrastructure Methods + + + /** + * Set up instance variables required by this test case. + */ + public void setUp() throws Exception { + setUpFactory(); + setUpLog("TestLogger"); + } + + + /** + * Return the tests included in this test suite. + */ + public static Test suite() { + return (new TestSuite(DefaultConfigTestCase.class)); + } + + /** + * Tear down instance variables required by this test case. + */ + public void tearDown() { + log = null; + if (factory != null) { + factory.releaseAll(); + factory = null; + } + } + + + // ----------------------------------------------------------- Test Methods + + + // Test pristine Log instance + public void testPristineLog() { + + assertNotNull("Log exists", log); + assertEquals("Log class", + "org.apache.commons.logging.impl.Log4JLogger", + log.getClass().getName()); + + // Can we call level checkers with no exceptions? + log.isDebugEnabled(); + log.isErrorEnabled(); + log.isFatalEnabled(); + log.isInfoEnabled(); + log.isTraceEnabled(); + log.isWarnEnabled(); + + } + + + // Test pristine LogFactory instance + public void testPristineFactory() { + + assertNotNull("LogFactory exists", factory); + assertEquals("LogFactory class", + "org.apache.commons.logging.impl.LogFactoryImpl", + factory.getClass().getName()); + + String names[] = factory.getAttributeNames(); + assertNotNull("Names exists", names); + assertEquals("Names empty", 0, names.length); + + } + + + // -------------------------------------------------------- Support Methods + + + + // Set up factory instance + protected void setUpFactory() throws Exception { + factory = LogFactory.getFactory(); + } + + + // Set up log instance + protected void setUpLog(String name) throws Exception { + log = factory.getLog(name); + } + + +} diff --git a/src/test/org/apache/commons/logging/log4j/TestAppender.java b/src/test/org/apache/commons/logging/log4j/TestAppender.java new file mode 100644 index 0000000..578efc6 --- /dev/null +++ b/src/test/org/apache/commons/logging/log4j/TestAppender.java @@ -0,0 +1,120 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/log4j/TestAppender.java,v 1.1 2003/03/30 05:22:50 craigmcc Exp $ + * $Revision: 1.1 $ + * $Date: 2003/03/30 05:22:50 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2003 The Apache Software Foundation. All rights + * reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. The end-user documentation included with the redistribution, if + * any, must include the following acknowlegement: + * "This product includes software developed by the + * Apache Software Foundation (http://www.apache.org/)." + * Alternately, this acknowlegement may appear in the software itself, + * if and wherever such third-party acknowlegements normally appear. + * + * 4. The names "The Jakarta Project", "Commons", and "Apache Software + * Foundation" must not be used to endorse or promote products derived + * from this software without prior written permission. For written + * permission, please contact apache@apache.org. + * + * 5. Products derived from this software may not be called "Apache" + * nor may "Apache" appear in their names without prior written + * permission of the Apache Group. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * ==================================================================== + * + * This software consists of voluntary contributions made by many + * individuals on behalf of the Apache Software Foundation. For more + * information on the Apache Software Foundation, please see + * . + * + */ + +package org.apache.commons.logging.log4j; + + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.spi.LoggingEvent; + + +/** + *

Test implementation of org.apache.log4j.Appender.

+ * + * @author Craig R. McClanahan + * @version $Revision: 1.1 $ $Date: 2003/03/30 05:22:50 $ + */ + +public class TestAppender extends AppenderSkeleton { + + + + // ----------------------------------------------------- Instance Variables + + + // The set of logged events for this appender + private List events = new ArrayList(); + + + // --------------------------------------------------------- Public Methods + + + public Iterator events() { + return (events.iterator()); + } + + + public void flush() { + events.clear(); + } + + + // ------------------------------------------------------- Appender Methods + + + protected void append(LoggingEvent event) { + events.add(event); + } + + + public void close() { + } + + + public boolean requiresLayout() { + return (false); + } + + +}