blob: 120346947480f254d8378a4389d990346571626e [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.commons.lang.exception;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Modifier;
import java.sql.SQLException;
import java.util.List;
import junit.framework.Assert;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.apache.commons.lang.SystemUtils;
/**
* Tests {@link org.apache.commons.lang.exception.ExceptionUtils}.
*
* <h3>Notes</h3>
* <p>
* Make sure this exception code does not depend on Java 1.4 nested exceptions. SVN revision 38990 does not compile with
* Java 1.3.1.
* </p>
* <ul>
* <li>Compiled with Sun Java 1.3.1_15</li>
* <li>Tested with Sun Java 1.3.1_15</li>
* <li>Tested with Sun Java 1.4.2_12</li>
* <li>Tested with Sun Java 1.5.0_08</li>
* <li>All of the above on Windows XP SP2 + patches.</li>
* </ul>
* <p>
* Gary Gregory; August 16, 2006.
* </p>
*
* @author Daniel L. Rall
* @author <a href="mailto:steven@caswell.name">Steven Caswell</a>
* @author Stephen Colebourne
* @author <a href="mailto:ggregory@seagullsw.com">Gary Gregory</a>
* @since 1.0
*/
public class ExceptionUtilsTestCase extends junit.framework.TestCase {
private NestableException nested;
private Throwable withCause;
private Throwable withoutCause;
private Throwable jdkNoCause;
private ExceptionWithCause selfCause;
private ExceptionWithCause cyclicCause;
public ExceptionUtilsTestCase(String name) {
super(name);
}
public static Test suite() {
return new TestSuite(ExceptionUtilsTestCase.class);
}
public void setUp() {
withoutCause = createExceptionWithoutCause();
nested = new NestableException(withoutCause);
withCause = new ExceptionWithCause(nested);
jdkNoCause = new NullPointerException();
selfCause = new ExceptionWithCause(null);
selfCause.setCause(selfCause);
ExceptionWithCause a = new ExceptionWithCause(null);
ExceptionWithCause b = new ExceptionWithCause(a);
a.setCause(b);
cyclicCause = new ExceptionWithCause(a);
}
protected void tearDown() throws Exception {
withoutCause = null;
nested = null;
withCause = null;
jdkNoCause = null;
selfCause = null;
cyclicCause = null;
}
//-----------------------------------------------------------------------
private Throwable createExceptionWithoutCause() {
try {
throw new ExceptionWithoutCause();
} catch (Throwable t) {
return t;
}
}
private Throwable createExceptionWithCause() {
try {
try {
throw new ExceptionWithCause(createExceptionWithoutCause());
} catch (Throwable t) {
throw new ExceptionWithCause(t);
}
} catch (Throwable t) {
return t;
}
}
//-----------------------------------------------------------------------
public void testConstructor() {
assertNotNull(new ExceptionUtils());
Constructor[] cons = ExceptionUtils.class.getDeclaredConstructors();
assertEquals(1, cons.length);
assertEquals(true, Modifier.isPublic(cons[0].getModifiers()));
assertEquals(true, Modifier.isPublic(ExceptionUtils.class.getModifiers()));
assertEquals(false, Modifier.isFinal(ExceptionUtils.class.getModifiers()));
}
//-----------------------------------------------------------------------
public void testCauseMethodNameOps() {
this.testCauseMethodNameOps(null);
this.testCauseMethodNameOps("");
this.testCauseMethodNameOps(" ");
this.testCauseMethodNameOps("\t\r\n\t");
this.testCauseMethodNameOps("testMethodName");
}
void testCauseMethodNameOps(String name) {
String methodName = "testMethodName";
try {
Assert.assertFalse(ExceptionUtils.isCauseMethodName(methodName));
ExceptionUtils.addCauseMethodName(methodName);
ExceptionUtils.addCauseMethodName(methodName);
Assert.assertTrue(ExceptionUtils.isCauseMethodName(methodName));
} finally {
ExceptionUtils.removeCauseMethodName(methodName);
Assert.assertFalse(
"The method name " + methodName + " should not be in the array",
ExceptionUtils.isCauseMethodName(methodName));
}
}
public void testGetCause_Throwable() {
assertSame(null, ExceptionUtils.getCause(null));
assertSame(null, ExceptionUtils.getCause(withoutCause));
assertSame(withoutCause, ExceptionUtils.getCause(nested));
assertSame(nested, ExceptionUtils.getCause(withCause));
assertSame(null, ExceptionUtils.getCause(jdkNoCause));
assertSame(selfCause, ExceptionUtils.getCause(selfCause));
assertSame(cyclicCause.getCause(), ExceptionUtils.getCause(cyclicCause));
assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), ExceptionUtils.getCause(cyclicCause.getCause()));
assertSame(cyclicCause.getCause(), ExceptionUtils.getCause(((ExceptionWithCause) cyclicCause.getCause()).getCause()));
}
public void testGetCause_ThrowableArray() {
assertSame(null, ExceptionUtils.getCause(null, null));
assertSame(null, ExceptionUtils.getCause(null, new String[0]));
// match because known type
assertSame(withoutCause, ExceptionUtils.getCause(nested, null));
assertSame(withoutCause, ExceptionUtils.getCause(nested, new String[0]));
assertSame(withoutCause, ExceptionUtils.getCause(nested, new String[] {"getCause"}));
// not known type, so match on supplied method names
assertSame(nested, ExceptionUtils.getCause(withCause, null)); // default names
assertSame(null, ExceptionUtils.getCause(withCause, new String[0]));
assertSame(null, ExceptionUtils.getCause(withCause, new String[] {null}));
assertSame(nested, ExceptionUtils.getCause(withCause, new String[] {"getCause"}));
// not known type, so match on supplied method names
assertSame(null, ExceptionUtils.getCause(withoutCause, null));
assertSame(null, ExceptionUtils.getCause(withoutCause, new String[0]));
assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {null}));
assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {"getCause"}));
assertSame(null, ExceptionUtils.getCause(withoutCause, new String[] {"getTargetException"}));
}
public void testGetRootCause_Throwable() {
assertSame(null, ExceptionUtils.getRootCause(null));
assertSame(null, ExceptionUtils.getRootCause(withoutCause));
assertSame(withoutCause, ExceptionUtils.getRootCause(nested));
assertSame(withoutCause, ExceptionUtils.getRootCause(withCause));
assertSame(null, ExceptionUtils.getRootCause(jdkNoCause));
assertSame(null, ExceptionUtils.getRootCause(selfCause));
assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), ExceptionUtils.getRootCause(cyclicCause));
}
public void testSetCause() {
Exception cause = new ExceptionWithoutCause();
assertEquals(true, ExceptionUtils.setCause(new ExceptionWithCause(null), cause));
if (SystemUtils.isJavaVersionAtLeast(140)) {
assertEquals(true, ExceptionUtils.setCause(new ExceptionWithoutCause(), cause));
}
}
/**
* Tests overriding a cause to <code>null</code>.
*/
public void testSetCauseToNull() {
Exception ex = new ExceptionWithCause(new IOException());
assertEquals(true, ExceptionUtils.setCause(ex, new IllegalStateException()));
assertNotNull(ExceptionUtils.getCause(ex));
assertEquals(true, ExceptionUtils.setCause(ex, null));
assertNull(ExceptionUtils.getCause(ex));
}
//-----------------------------------------------------------------------
public void testIsThrowableNested() {
if (SystemUtils.isJavaVersionAtLeast(140)) {
assertEquals(true, ExceptionUtils.isThrowableNested());
} else {
assertEquals(false, ExceptionUtils.isThrowableNested());
}
}
public void testIsNestedThrowable_Throwable() {
assertEquals(true, ExceptionUtils.isNestedThrowable(new SQLException()));
assertEquals(true, ExceptionUtils.isNestedThrowable(new InvocationTargetException(new Exception())));
assertEquals(true, ExceptionUtils.isNestedThrowable(new NestableRuntimeException()));
assertEquals(true, ExceptionUtils.isNestedThrowable(withCause));
assertEquals(true, ExceptionUtils.isNestedThrowable(nested));
if (SystemUtils.isJavaVersionAtLeast(140)) {
assertEquals(true, ExceptionUtils.isNestedThrowable(withoutCause));
assertEquals(true, ExceptionUtils.isNestedThrowable(new Throwable()));
} else {
assertEquals(false, ExceptionUtils.isNestedThrowable(withoutCause));
assertEquals(false, ExceptionUtils.isNestedThrowable(new Throwable()));
}
}
//-----------------------------------------------------------------------
public void testGetThrowableCount_Throwable() {
assertEquals(0, ExceptionUtils.getThrowableCount(null));
assertEquals(1, ExceptionUtils.getThrowableCount(withoutCause));
assertEquals(2, ExceptionUtils.getThrowableCount(nested));
assertEquals(3, ExceptionUtils.getThrowableCount(withCause));
assertEquals(1, ExceptionUtils.getThrowableCount(jdkNoCause));
assertEquals(1, ExceptionUtils.getThrowableCount(selfCause));
assertEquals(3, ExceptionUtils.getThrowableCount(cyclicCause));
}
//-----------------------------------------------------------------------
public void testGetThrowables_Throwable_null() {
assertEquals(0, ExceptionUtils.getThrowables(null).length);
}
public void testGetThrowables_Throwable_withoutCause() {
Throwable[] throwables = ExceptionUtils.getThrowables(withoutCause);
assertEquals(1, throwables.length);
assertSame(withoutCause, throwables[0]);
}
public void testGetThrowables_Throwable_nested() {
Throwable[] throwables = ExceptionUtils.getThrowables(nested);
assertEquals(2, throwables.length);
assertSame(nested, throwables[0]);
assertSame(withoutCause, throwables[1]);
}
public void testGetThrowables_Throwable_withCause() {
Throwable[] throwables = ExceptionUtils.getThrowables(withCause);
assertEquals(3, throwables.length);
assertSame(withCause, throwables[0]);
assertSame(nested, throwables[1]);
assertSame(withoutCause, throwables[2]);
}
public void testGetThrowables_Throwable_jdkNoCause() {
Throwable[] throwables = ExceptionUtils.getThrowables(jdkNoCause);
assertEquals(1, throwables.length);
assertSame(jdkNoCause, throwables[0]);
}
public void testGetThrowables_Throwable_selfCause() {
Throwable[] throwables = ExceptionUtils.getThrowables(selfCause);
assertEquals(1, throwables.length);
assertSame(selfCause, throwables[0]);
}
public void testGetThrowables_Throwable_recursiveCause() {
Throwable[] throwables = ExceptionUtils.getThrowables(cyclicCause);
assertEquals(3, throwables.length);
assertSame(cyclicCause, throwables[0]);
assertSame(cyclicCause.getCause(), throwables[1]);
assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), throwables[2]);
}
//-----------------------------------------------------------------------
public void testGetThrowableList_Throwable_null() {
List throwables = ExceptionUtils.getThrowableList(null);
assertEquals(0, throwables.size());
}
public void testGetThrowableList_Throwable_withoutCause() {
List throwables = ExceptionUtils.getThrowableList(withoutCause);
assertEquals(1, throwables.size());
assertSame(withoutCause, throwables.get(0));
}
public void testGetThrowableList_Throwable_nested() {
List throwables = ExceptionUtils.getThrowableList(nested);
assertEquals(2, throwables.size());
assertSame(nested, throwables.get(0));
assertSame(withoutCause, throwables.get(1));
}
public void testGetThrowableList_Throwable_withCause() {
List throwables = ExceptionUtils.getThrowableList(withCause);
assertEquals(3, throwables.size());
assertSame(withCause, throwables.get(0));
assertSame(nested, throwables.get(1));
assertSame(withoutCause, throwables.get(2));
}
public void testGetThrowableList_Throwable_jdkNoCause() {
List throwables = ExceptionUtils.getThrowableList(jdkNoCause);
assertEquals(1, throwables.size());
assertSame(jdkNoCause, throwables.get(0));
}
public void testGetThrowableList_Throwable_selfCause() {
List throwables = ExceptionUtils.getThrowableList(selfCause);
assertEquals(1, throwables.size());
assertSame(selfCause, throwables.get(0));
}
public void testGetThrowableList_Throwable_recursiveCause() {
List throwables = ExceptionUtils.getThrowableList(cyclicCause);
assertEquals(3, throwables.size());
assertSame(cyclicCause, throwables.get(0));
assertSame(cyclicCause.getCause(), throwables.get(1));
assertSame(((ExceptionWithCause) cyclicCause.getCause()).getCause(), throwables.get(2));
}
//-----------------------------------------------------------------------
public void testIndexOf_ThrowableClass() {
assertEquals(-1, ExceptionUtils.indexOfThrowable(null, null));
assertEquals(-1, ExceptionUtils.indexOfThrowable(null, NestableException.class));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, null));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithCause.class));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, NestableException.class));
assertEquals(0, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithoutCause.class));
assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, null));
assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithCause.class));
assertEquals(0, ExceptionUtils.indexOfThrowable(nested, NestableException.class));
assertEquals(1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithoutCause.class));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, null));
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class));
assertEquals(1, ExceptionUtils.indexOfThrowable(withCause, NestableException.class));
assertEquals(2, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithoutCause.class));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class));
}
public void testIndexOf_ThrowableClassInt() {
assertEquals(-1, ExceptionUtils.indexOfThrowable(null, null, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(null, NestableException.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, null));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withoutCause, NestableException.class, 0));
assertEquals(0, ExceptionUtils.indexOfThrowable(withoutCause, ExceptionWithoutCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, null, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithCause.class, 0));
assertEquals(0, ExceptionUtils.indexOfThrowable(nested, NestableException.class, 0));
assertEquals(1, ExceptionUtils.indexOfThrowable(nested, ExceptionWithoutCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, null));
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 0));
assertEquals(1, ExceptionUtils.indexOfThrowable(withCause, NestableException.class, 0));
assertEquals(2, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithoutCause.class, 0));
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, -1));
assertEquals(0, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 1));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, ExceptionWithCause.class, 9));
assertEquals(-1, ExceptionUtils.indexOfThrowable(withCause, Exception.class, 0));
}
//-----------------------------------------------------------------------
public void testIndexOfType_ThrowableClass() {
assertEquals(-1, ExceptionUtils.indexOfType(null, null));
assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class));
assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class));
assertEquals(-1, ExceptionUtils.indexOfType(nested, null));
assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class));
assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class));
assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class));
assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class));
assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class));
assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class));
assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class));
}
public void testIndexOfType_ThrowableClassInt() {
assertEquals(-1, ExceptionUtils.indexOfType(null, null, 0));
assertEquals(-1, ExceptionUtils.indexOfType(null, NestableException.class, 0));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, null));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, ExceptionWithCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfType(withoutCause, NestableException.class, 0));
assertEquals(0, ExceptionUtils.indexOfType(withoutCause, ExceptionWithoutCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfType(nested, null, 0));
assertEquals(-1, ExceptionUtils.indexOfType(nested, ExceptionWithCause.class, 0));
assertEquals(0, ExceptionUtils.indexOfType(nested, NestableException.class, 0));
assertEquals(1, ExceptionUtils.indexOfType(nested, ExceptionWithoutCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfType(withCause, null));
assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
assertEquals(1, ExceptionUtils.indexOfType(withCause, NestableException.class, 0));
assertEquals(2, ExceptionUtils.indexOfType(withCause, ExceptionWithoutCause.class, 0));
assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, -1));
assertEquals(0, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 0));
assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 1));
assertEquals(-1, ExceptionUtils.indexOfType(withCause, ExceptionWithCause.class, 9));
assertEquals(0, ExceptionUtils.indexOfType(withCause, Exception.class, 0));
}
//-----------------------------------------------------------------------
public void testPrintRootCauseStackTrace_Throwable() throws Exception {
ExceptionUtils.printRootCauseStackTrace(null);
// could pipe system.err to a known stream, but not much point as
// internally this method calls stram method anyway
}
public void testPrintRootCauseStackTrace_ThrowableStream() throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
ExceptionUtils.printRootCauseStackTrace(null, (PrintStream) null);
ExceptionUtils.printRootCauseStackTrace(null, new PrintStream(out));
assertEquals(0, out.toString().length());
out = new ByteArrayOutputStream(1024);
try {
ExceptionUtils.printRootCauseStackTrace(withCause, (PrintStream) null);
fail();
} catch (IllegalArgumentException ex) {
}
out = new ByteArrayOutputStream(1024);
Throwable withCause = createExceptionWithCause();
ExceptionUtils.printRootCauseStackTrace(withCause, new PrintStream(out));
String stackTrace = out.toString();
assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) != -1);
out = new ByteArrayOutputStream(1024);
ExceptionUtils.printRootCauseStackTrace(withoutCause, new PrintStream(out));
stackTrace = out.toString();
assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) == -1);
}
public void testPrintRootCauseStackTrace_ThrowableWriter() throws Exception {
StringWriter writer = new StringWriter(1024);
ExceptionUtils.printRootCauseStackTrace(null, (PrintWriter) null);
ExceptionUtils.printRootCauseStackTrace(null, new PrintWriter(writer));
assertEquals(0, writer.getBuffer().length());
writer = new StringWriter(1024);
try {
ExceptionUtils.printRootCauseStackTrace(withCause, (PrintWriter) null);
fail();
} catch (IllegalArgumentException ex) {
}
writer = new StringWriter(1024);
Throwable withCause = createExceptionWithCause();
ExceptionUtils.printRootCauseStackTrace(withCause, new PrintWriter(writer));
String stackTrace = writer.toString();
assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) != -1);
writer = new StringWriter(1024);
ExceptionUtils.printRootCauseStackTrace(withoutCause, new PrintWriter(writer));
stackTrace = writer.toString();
assertTrue(stackTrace.indexOf(ExceptionUtils.WRAPPED_MARKER) == -1);
}
//-----------------------------------------------------------------------
public void testGetRootCauseStackTrace_Throwable() throws Exception {
assertEquals(0, ExceptionUtils.getRootCauseStackTrace(null).length);
Throwable withCause = createExceptionWithCause();
String[] stackTrace = ExceptionUtils.getRootCauseStackTrace(withCause);
boolean match = false;
for (int i = 0; i < stackTrace.length; i++) {
if (stackTrace[i].startsWith(ExceptionUtils.WRAPPED_MARKER)) {
match = true;
break;
}
}
assertEquals(true, match);
stackTrace = ExceptionUtils.getRootCauseStackTrace(withoutCause);
match = false;
for (int i = 0; i < stackTrace.length; i++) {
if (stackTrace[i].startsWith(ExceptionUtils.WRAPPED_MARKER)) {
match = true;
break;
}
}
assertEquals(false, match);
}
public void testRemoveCommonFrames_ListList() throws Exception {
try {
ExceptionUtils.removeCommonFrames(null, null);
fail();
} catch (IllegalArgumentException ex) {
}
}
public void test_getMessage_Throwable() {
Throwable th = null;
assertEquals("", ExceptionUtils.getMessage(th));
th = new IllegalArgumentException("Base");
assertEquals("IllegalArgumentException: Base", ExceptionUtils.getMessage(th));
th = new ExceptionWithCause("Wrapper", th);
assertEquals("ExceptionUtilsTestCase.ExceptionWithCause: Wrapper", ExceptionUtils.getMessage(th));
}
public void test_getRootCauseMessage_Throwable() {
Throwable th = null;
assertEquals("", ExceptionUtils.getRootCauseMessage(th));
th = new IllegalArgumentException("Base");
assertEquals("IllegalArgumentException: Base", ExceptionUtils.getRootCauseMessage(th));
th = new ExceptionWithCause("Wrapper", th);
assertEquals("IllegalArgumentException: Base", ExceptionUtils.getRootCauseMessage(th));
}
//-----------------------------------------------------------------------
/**
* Provides a method with a well known chained/nested exception
* name which matches the full signature (e.g. has a return value
* of <code>Throwable</code>.
*/
private static class ExceptionWithCause extends Exception {
private Throwable cause;
public ExceptionWithCause(String str, Throwable cause) {
super(str);
setCause(cause);
}
public ExceptionWithCause(Throwable cause) {
super();
setCause(cause);
}
public Throwable getCause() {
return cause;
}
public void setCause(Throwable cause) {
this.cause = cause;
}
}
/**
* Provides a method with a well known chained/nested exception
* name which does not match the full signature (e.g. lacks a
* return value of <code>Throwable</code>.
*/
private static class ExceptionWithoutCause extends Exception {
public void getTargetException() {
}
}
}