svn commit: r2365 - in logback/trunk/logback-classic/src: main/java/ch/qos/logback/classic/spi test/java/ch/qos/logback/classic/spi

Author: ceki Date: Wed Jul 22 19:53:23 2009 New Revision: 2365 Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BogusClassLoader.java Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.java Log: - Fix LBCLASSIC-125 It was surprisingly difficult to write a test case where a NoClassDefFoundError was thrown See also http://jira.qos.ch/browse/LBCLASSIC-125 Modified: logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java ============================================================================== --- logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java (original) +++ logback/trunk/logback-classic/src/main/java/ch/qos/logback/classic/spi/PackagingDataCalculator.java Wed Jul 22 19:53:23 2009 @@ -50,10 +50,10 @@ } public void calculate(IThrowableProxy tp) { - while(tp != null) { + while (tp != null) { populateFrames(tp.getStackTraceElementProxyArray()); tp = tp.getCause(); - } + } } void populateFrames(StackTraceElementProxy[] stepArray) { @@ -134,7 +134,7 @@ } String getImplementationVersion(Class type) { - if(type == null) { + if (type == null) { return "na"; } Package aPackage = type.getPackage(); @@ -194,6 +194,8 @@ return cl.loadClass(className); } catch (ClassNotFoundException e1) { return null; + } catch (NoClassDefFoundError e1) { + return null; } catch (Exception e) { e.printStackTrace(); // this is unexpected return null; @@ -203,8 +205,9 @@ /** * - * @param lastGuaranteedClassLoader may be null - * + * @param lastGuaranteedClassLoader + * may be null + * * @param className * @return */ @@ -226,6 +229,8 @@ return Class.forName(className); } catch (ClassNotFoundException e1) { return null; + } catch (NoClassDefFoundError e1) { + return null; } catch (Exception e) { e.printStackTrace(); // this is unexpected return null; Added: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BogusClassLoader.java ============================================================================== --- (empty file) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/BogusClassLoader.java Wed Jul 22 19:53:23 2009 @@ -0,0 +1,48 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ +package ch.qos.logback.classic.spi; + +import java.net.URL; +import java.net.URLClassLoader; + +/** + * A trivial class loader which throws a NoClassDefFoundError if the requested + * class name contains the string "Bogus". + * + * @author Ceki G�lc� + */ +public class BogusClassLoader extends URLClassLoader { + + public BogusClassLoader(URL[] urls) { + super(urls); + } + + public BogusClassLoader(URL[] urls, ClassLoader parent) { + super(urls, parent); + } + + public Class<?> loadClass(String name) throws ClassNotFoundException { + return loadClass(name, false); + } + + /** + * Throw NoClassDefFoundError if the requested class contains the string + * "Bogus". Otherwise, delegate to super-class. + */ + protected Class<?> loadClass(String name, boolean resolve) + throws ClassNotFoundException { + + if (name.contains("Bogus")) { + throw new NoClassDefFoundError(); + } + + return super.loadClass(name, resolve); + } +} Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/LocalFirstClassLoader.java Wed Jul 22 19:53:23 2009 @@ -1,3 +1,12 @@ +/** + * Logback: the generic, reliable, fast and flexible logging framework. + * + * Copyright (C) 2000-2009, QOS.ch + * + * This library is free software, you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation. + */ package ch.qos.logback.classic.spi; import java.net.URL; Modified: logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.java ============================================================================== --- logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.java (original) +++ logback/trunk/logback-classic/src/test/java/ch/qos/logback/classic/spi/PackagingDataCalculatorTest.java Wed Jul 22 19:53:23 2009 @@ -13,6 +13,10 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLClassLoader; + import org.junit.Test; import ch.qos.logback.classic.util.TeztHelper; @@ -92,26 +96,29 @@ } + private ClassLoader makeBogusClassLoader() throws MalformedURLException { + ClassLoader currentClassLoader = this.getClass().getClassLoader(); + BogusClassLoader bcl = new BogusClassLoader(new URL[] {}, + currentClassLoader); + return bcl; + } + @Test // Test http://jira.qos.ch/browse/LBCLASSIC-125 - public void noClassDefFoundError() { + public void noClassDefFoundError_LBCLASSIC_125Test() + throws MalformedURLException { + ClassLoader cl = (URLClassLoader) makeBogusClassLoader(); + Thread.currentThread().setContextClassLoader(cl); Throwable t = new Throwable("x"); ThrowableProxy tp = new ThrowableProxy(t); StackTraceElementProxy[] stepArray = tp.getStackTraceElementProxyArray(); - StackTraceElement bogusSTE = new StackTraceElement(MyBogus.class.getName(), - "myMethod", "myFile", 12); - StackTraceElementProxy bogusSTEP;// = new StackTraceElementProxy(bogusSTE); - System.out.println(stepArray.length); - for (int i = 0; i < stepArray.length; i++) { - System.out.println(i); - - stepArray[i] = new StackTraceElementProxy(bogusSTE); - } + StackTraceElement bogusSTE = new StackTraceElement("com.Bogus", "myMethod", + "myFile", 12); + stepArray[0] = new StackTraceElementProxy(bogusSTE); PackagingDataCalculator pdc = tp.getPackagingDataCalculator(); + // NoClassDefFoundError should be caught pdc.calculate(tp); - System.out.println(ThrowableProxyUtil.asString(tp)); - - System.out.println(new MyBogus()); - + } + }
participants (1)
-
noreply.ceki@qos.ch