/*
* $Id$
*
* Copyright 2006, The jCoderZ.org Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of the jCoderZ.org Project nor the names of
* its contributors may be used to endorse or promote products
* derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS 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 REGENTS AND 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.
*/
package org.jcoderz.commons.util;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.UnavailableException;
import javax.xml.bind.JAXBException;
import junit.framework.TestCase;
import org.jaxen.JaxenException;
import org.jcoderz.commons.ArgumentMalformedException;
import org.jcoderz.commons.Loggable;
import org.xml.sax.SAXException;
/**
* Tests the ThrowableUtil class.
* @author Andreas Mandel
*/
public class ThrowableUtilTest
extends TestCase
{
/** Test the fixChaining method. */
public void testFixChaining ()
{
final RuntimeException in = new RuntimeException("in");
final SAXException sax
= new org.xml.sax.SAXParseException("SAX", null, in);
final JAXBException jaxb = new JAXBException(sax);
final RuntimeException out = new RuntimeException("Outer", jaxb);
assertEquals("1st nesting level unexpected", jaxb, out.getCause());
assertEquals("2nd nesting level unexpected (pre chain)",
null, jaxb.getCause());
assertEquals("3rd nesting level unexpected (pre chain)",
null, sax.getCause());
ThrowableUtil.fixChaining(out);
assertEquals("2nd nesting level unexpected", sax, jaxb.getCause());
assertEquals("3rd nesting level unexpected", in, sax.getCause());
}
/** Test the magic get cause detection code for certain Throwables. */
public void testGetCauseDetection ()
{
getCauseDetectionTestHelper(SAXException.class, "getException");
getCauseDetectionTestHelper(ServletException.class, "getRootCause");
getCauseDetectionTestHelper(UnavailableException.class, "getRootCause");
getCauseDetectionTestHelper(
javax.resource.spi.UnavailableException.class,
"getLinkedException");
getCauseDetectionTestHelper(JaxenException.class, "getCause");
}
/** Test {@link ThrowableUtil#collectNestedData(Loggable)}. */
public void testCollectNestedData ()
{
final SAXException sax
= new org.xml.sax.SAXParseException(
"SAX", "public id", "system id", 5, 4);
final ArgumentMalformedException ex
= new ArgumentMalformedException("TEST", "VALUE", "Hint",
sax);
assertEquals("Parameter from nested Exception not found in list. "
+ ex.getParameterNames(), "public id",
ex.getParameter(
"CAUSE_1_org.xml.sax.SAXParseException#PublicId").get(0));
}
private void getCauseDetectionTestHelper (Class ex, String methodName)
{
final Method m
= ThrowableUtil.findGetCauseMethod(ex.getMethods());
assertNotNull("Could not get getCause method for " + ex.getName(), m);
assertEquals("Differen method expected for getCause in " + ex.getName(),
methodName, m.getName());
}
}