From 21932779c854de8aa6b7e1b0c1b2a327f06efa61 Mon Sep 17 00:00:00 2001 From: baliuka Date: Sat, 1 Mar 2003 09:55:07 +0000 Subject: [PATCH] Added tests for class loading, no problems detected in "common" use cases git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/logging/trunk@138954 13f79535-47bb-0310-9956-ffa450edef68 --- STATUS.html | 3 +- .../apache/commons/logging/LogFactory.java | 17 +- .../commons/logging/impl/LogFactoryImpl.java | 10 +- .../org/apache/commons/logging/LoadTest.java | 234 ++++++++++++++++++ .../org/apache/commons/logging/UserClass.java | 12 + 5 files changed, 265 insertions(+), 11 deletions(-) create mode 100644 src/test/org/apache/commons/logging/LoadTest.java create mode 100644 src/test/org/apache/commons/logging/UserClass.java diff --git a/STATUS.html b/STATUS.html index d240cd7..e594fe1 100644 --- a/STATUS.html +++ b/STATUS.html @@ -7,7 +7,7 @@

The Jakarta Commons Logging Component

-$Id: STATUS.html,v 1.9 2002/09/27 18:39:12 rdonkin Exp $
+$Id: STATUS.html,v 1.10 2003/03/01 09:55:06 baliuka Exp $
[Introduction] [Dependencies] [Release Info] @@ -120,6 +120,7 @@ component to ensure that it continues to meet a variety of needs.

  • Peter Donald
  • Costin Manolache
  • Richard A. Sitze
  • +
  • Juozas Baliuka
  • diff --git a/src/java/org/apache/commons/logging/LogFactory.java b/src/java/org/apache/commons/logging/LogFactory.java index 30d2767..7c4f928 100644 --- a/src/java/org/apache/commons/logging/LogFactory.java +++ b/src/java/org/apache/commons/logging/LogFactory.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/java/org/apache/commons/logging/LogFactory.java,v 1.19 2002/12/18 07:20:50 craigmcc Exp $ - * $Revision: 1.19 $ - * $Date: 2002/12/18 07:20:50 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/java/org/apache/commons/logging/LogFactory.java,v 1.20 2003/03/01 09:55:06 baliuka Exp $ + * $Revision: 1.20 $ + * $Date: 2003/03/01 09:55:06 $ * * ==================================================================== * @@ -87,7 +87,7 @@ import java.util.Properties; * @author Craig R. McClanahan * @author Costin Manolache * @author Richard A. Sitze - * @version $Revision: 1.19 $ $Date: 2002/12/18 07:20:50 $ + * @version $Revision: 1.20 $ $Date: 2003/03/01 09:55:06 $ */ public abstract class LogFactory { @@ -580,8 +580,15 @@ public abstract class LogFactory { // Nothing more to try, onwards. throw e; } - // ignore exception, continue + + }catch(ClassCastException e){ + + if (classLoader == LogFactory.class.getClassLoader()) { + // Nothing more to try, onwards (bug in loader implementation). + throw e; + } } + // ignore exception, continue } /* At this point, either classLoader == null, OR diff --git a/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java b/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java index 6b3448b..957eb1d 100644 --- a/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java +++ b/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java @@ -1,7 +1,7 @@ /* - * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java,v 1.21 2003/02/01 04:11:03 craigmcc Exp $ - * $Revision: 1.21 $ - * $Date: 2003/02/01 04:11:03 $ + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/java/org/apache/commons/logging/impl/LogFactoryImpl.java,v 1.22 2003/03/01 09:55:07 baliuka Exp $ + * $Revision: 1.22 $ + * $Date: 2003/03/01 09:55:07 $ * * ==================================================================== * @@ -107,7 +107,7 @@ import org.apache.commons.logging.LogFactory; * @author Rod Waldhoff * @author Craig R. McClanahan * @author Richard A. Sitze - * @version $Revision: 1.21 $ $Date: 2003/02/01 04:11:03 $ + * @version $Revision: 1.22 $ $Date: 2003/03/01 09:55:07 $ */ public class LogFactoryImpl extends LogFactory { @@ -519,7 +519,7 @@ public class LogFactoryImpl extends LogFactory { protected boolean isJdk14Available() { try { - loadClass("java.sql.Savepoint"); + loadClass("java.util.logging.Logger"); loadClass("org.apache.commons.logging.impl.Jdk14Logger"); return (true); } catch (Throwable t) { diff --git a/src/test/org/apache/commons/logging/LoadTest.java b/src/test/org/apache/commons/logging/LoadTest.java new file mode 100644 index 0000000..24b1121 --- /dev/null +++ b/src/test/org/apache/commons/logging/LoadTest.java @@ -0,0 +1,234 @@ +/* + * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//logging/src/test/org/apache/commons/logging/LoadTest.java,v 1.1 2003/03/01 09:55:07 baliuka Exp $ + * $Revision: 1.1 $ + * $Date: 2003/03/01 09:55:07 $ + * + * ==================================================================== + * + * The Apache Software License, Version 1.1 + * + * Copyright (c) 1999-2002 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; + +import junit.framework.*; + +import org.apache.commons.logging.impl.*; + +/** + * testcase to emulate container and application isolated from container + * @author baliuka + * @version $Id: LoadTest.java,v 1.1 2003/03/01 09:55:07 baliuka Exp $ + */ +public class LoadTest extends TestCase{ + //TODO: need some way to add service provider packages + static private String LOG_PCKG[] = {"org.apache.commons.logging", + "org.apache.commons.logging.impl"}; + + static class AppClassLoader extends ClassLoader{ + + java.util.Map classes = new java.util.HashMap(); + + AppClassLoader(ClassLoader parent){ + super(parent); + } + + private Class def(String name)throws ClassNotFoundException{ + + Class result = (Class)classes.get(name); + if(result != null){ + return result; + } + + try{ + + java.io.InputStream is = this.getClass().getClassLoader(). + getResourceAsStream( name.replace('.','\\') + ".class" ); + java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream(); + + while(is.available() > 0){ + out.write(is.read()); + } + + byte data [] = out.toByteArray(); + + result = super.defineClass(name, data, 0, data.length ); + classes.put(name,result); + + return result; + + }catch(java.io.IOException ioe){ + + throw new ClassNotFoundException( name + " caused by " + + ioe.getMessage() ); + } + + + } + + // not very trivial to emulate we must implement "findClass", + // but it will delegete to junit class loder first + public Class loadClass(String name)throws ClassNotFoundException{ + + //isolates all logging classes, application in the same classloader too. + //filters exeptions to simlify handling in test + for(int i = 0; i < LOG_PCKG.length; i++ ){ + if( name.startsWith( LOG_PCKG[i] ) && + name.indexOf("Exception") == -1 ){ + return def(name); + } + } + return super.loadClass(name); + } + + } + + + + public void testInContainer()throws Exception{ + + //problem can be in this step (broken app container or missconfiguration) + //1. Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); + //2. Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + // we expect this : + // 1. Thread.currentThread().setContextClassLoader(appLoader); + // 2. Thread.currentThread().setContextClassLoader(null); + + Class cls = reload(); + Thread.currentThread().setContextClassLoader(cls.getClassLoader()); + execute(cls); + + cls = reload(); + Thread.currentThread().setContextClassLoader(null); + execute(cls); + + + cls = reload(); + Thread.currentThread().setContextClassLoader(ClassLoader.getSystemClassLoader()); + try{ + execute(cls); + fail("SystemClassLoader"); + }catch( LogConfigurationException ok ){ + + } + + + cls = reload(); + Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader()); + try{ + execute(cls); + fail("ContainerClassLoader"); + }catch( LogConfigurationException ok ){ + + } + + } + + private Class reload()throws Exception{ + + Class testObjCls = null; + + AppClassLoader appLoader = new AppClassLoader( this.getClass(). + getClassLoader() + + ); + try{ + + testObjCls = appLoader.loadClass(UserClass.class.getName()); + + }catch(ClassNotFoundException cnfe){ + throw cnfe; + }catch(Throwable t){ + t.printStackTrace(); + fail("AppClassLoader failed "); + } + + assertTrue( "app isolated" ,testObjCls.getClassLoader() == appLoader ); + + + return testObjCls; + + + } + + + private void execute(Class cls)throws Exception{ + + cls.newInstance(); + + } + + + + /** Creates a new instance of LoadTest */ + public LoadTest(String testName) { + super(testName); + } + + + + + public static void main(String[] args){ + String[] testCaseName = { LoadTest.class.getName() }; + junit.textui.TestRunner.main(testCaseName); + } + + public static Test suite() { + TestSuite suite = new TestSuite(); + + suite.addTestSuite(LoadTest.class); + + return suite; + } + +} diff --git a/src/test/org/apache/commons/logging/UserClass.java b/src/test/org/apache/commons/logging/UserClass.java new file mode 100644 index 0000000..827407e --- /dev/null +++ b/src/test/org/apache/commons/logging/UserClass.java @@ -0,0 +1,12 @@ + +package org.apache.commons.logging; + +public class UserClass { + + + + public UserClass() { + Log log = LogFactory.getLog(LoadTest.class); + } + +}