/**
* Logback: the reliable, generic, fast and flexible logging framework.
* Copyright (C) 1999-2013, QOS.ch. All rights reserved.
*
* This program and the accompanying materials are dual-licensed under
* either the terms of the Eclipse Public License v1.0 as published by
* the Eclipse Foundation
*
* or (per the licensee's choosing)
*
* under the terms of the GNU Lesser General Public License version 2.1
* as published by the Free Software Foundation.
*/
package ch.qos.logback.classic.spi;
import static junit.framework.Assert.assertEquals;
import static org.junit.Assume.assumeTrue;
import static ch.qos.logback.classic.util.TeztHelper.addSuppressed;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import ch.qos.logback.classic.util.TeztHelper;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class ThrowableProxyTest {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
public void verify(Throwable t) {
t.printStackTrace(pw);
IThrowableProxy tp = new ThrowableProxy(t);
String result = ThrowableProxyUtil.asString(tp);
result = result.replace("common frames omitted", "more");
String expected = sw.toString();
System.out.println("========expected");
System.out.println(expected);
System.out.println("========result");
System.out.println(result);
assertEquals(expected, result);
}
@Test
public void smoke() {
Exception e = new Exception("smoke");
verify(e);
}
@Test
public void nested() {
Exception w = null;
try {
someMethod();
} catch (Exception e) {
w = new Exception("wrapping", e);
}
verify(w);
}
@Test
public void suppressed() throws InvocationTargetException, IllegalAccessException
{
assumeTrue(TeztHelper.suppressedSupported()); // only execute on Java 7, would work anyway but doesn't make sense.
Exception ex = null;
try {
someMethod();
} catch (Exception e) {
Exception fooException = new Exception("Foo");
Exception barException = new Exception("Bar");
addSuppressed(e, fooException);
addSuppressed(e, barException);
ex = e;
}
verify(ex);
}
@Test
public void suppressedWithCause() throws InvocationTargetException, IllegalAccessException
{
assumeTrue(TeztHelper.suppressedSupported()); // only execute on Java 7, would work anyway but doesn't make sense.
Exception ex = null;
try {
someMethod();
} catch (Exception e) {
ex=new Exception("Wrapper", e);
Exception fooException = new Exception("Foo");
Exception barException = new Exception("Bar");
addSuppressed(ex, fooException);
addSuppressed(e, barException);
}
verify(ex);
}
@Test
public void suppressedWithSuppressed() throws Exception
{
assumeTrue(TeztHelper.suppressedSupported()); // only execute on Java 7, would work anyway but doesn't make sense.
Exception ex = null;
try {
someMethod();
} catch (Exception e) {
ex=new Exception("Wrapper", e);
Exception fooException = new Exception("Foo");
Exception barException = new Exception("Bar");
addSuppressed(barException, fooException);
addSuppressed(e, barException);
}
verify(ex);
}
// see also http://jira.qos.ch/browse/LBCLASSIC-216
@Test
public void nullSTE() {
Throwable t = new Exception("someMethodWithNullException") {
@Override
public StackTraceElement[] getStackTrace() {
return null;
}
};
// we can't test output as Throwable.printStackTrace method uses
// the private getOurStackTrace method instead of getStackTrace
// tests ThrowableProxyUtil.steArrayToStepArray
new ThrowableProxy(t);
// tests ThrowableProxyUtil.findNumberOfCommonFrames
Exception top = new Exception("top", t);
new ThrowableProxy(top);
}
@Test
public void multiNested() {
Exception w = null;
try {
someOtherMethod();
} catch (Exception e) {
w = new Exception("wrapping", e);
}
verify(w);
}
void someMethod() throws Exception {
throw new Exception("someMethod");
}
void someMethodWithNullException() throws Exception {
throw new Exception("someMethodWithNullException") {
@Override
public StackTraceElement[] getStackTrace() {
return null;
}
};
}
void someOtherMethod() throws Exception {
try {
someMethod();
} catch (Exception e) {
throw new Exception("someOtherMethod", e);
}
}
}