/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed 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 libcore.java.lang;
import junit.framework.TestCase;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
public class ThrowableTest extends TestCase {
private static class NoStackTraceException extends Exception {
@Override
public synchronized Throwable fillInStackTrace() {
return null;
}
}
public void testNullStackTrace() {
try {
throw new NoStackTraceException();
} catch (NoStackTraceException ex) {
// We used to throw NullPointerException when printing an exception with no stack trace.
ex.printStackTrace(new PrintWriter(new StringWriter()));
}
}
private static class SuppressionsThrowable extends Throwable {
private static final long serialVersionUID = 202649043897209143L;
public SuppressionsThrowable(String detailMessage, Throwable throwable,
boolean enableSuppression, boolean writableStackTrace) {
super(detailMessage, throwable, enableSuppression, writableStackTrace);
}
}
public void testAddSuppressed() {
Throwable throwable = new Throwable();
assertSuppressed(throwable);
Throwable suppressedA = new Throwable();
throwable.addSuppressed(suppressedA);
assertSuppressed(throwable, suppressedA);
Throwable suppressedB = new Throwable();
throwable.addSuppressed(suppressedB);
assertSuppressed(throwable, suppressedA, suppressedB);
}
public void testAddDuplicateSuppressed() {
Throwable throwable = new Throwable();
Throwable suppressedA = new Throwable();
throwable.addSuppressed(suppressedA);
throwable.addSuppressed(suppressedA);
throwable.addSuppressed(suppressedA);
assertSuppressed(throwable, suppressedA, suppressedA, suppressedA);
}
public void testGetSuppressedReturnsCopy() {
Throwable throwable = new Throwable();
Throwable suppressedA = new Throwable();
Throwable suppressedB = new Throwable();
throwable.addSuppressed(suppressedA);
throwable.addSuppressed(suppressedB);
Throwable[] mutable = throwable.getSuppressed();
mutable[0] = null;
mutable[1] = null;
assertSuppressed(throwable, suppressedA, suppressedB);
}
public void testAddSuppressedSelf() {
Throwable throwable = new Throwable();
try {
throwable.addSuppressed(throwable);
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testAddSuppressedNull() {
Throwable throwable = new Throwable();
try {
throwable.addSuppressed(null);
fail();
} catch (NullPointerException expected) {
}
}
public void testSetStackTraceWithNullElement() {
Throwable throwable = new Throwable();
try {
throwable.setStackTrace(new StackTraceElement[]{ null });
fail();
} catch (NullPointerException expected) {
}
}
private Throwable newThrowable(String message, String... stackTraceElements) {
StackTraceElement[] array = new StackTraceElement[stackTraceElements.length];
for (int i = 0; i < stackTraceElements.length; i++) {
String s = stackTraceElements[i];
array[stackTraceElements.length - 1 - i]
= new StackTraceElement("Class" + s, "do" + s, "Class" + s + ".java", i);
}
Throwable result = new Throwable(message);
result.setStackTrace(array);
return result;
}
private String printStackTraceToString(Throwable throwable) {
StringWriter writer = new StringWriter();
throwable.printStackTrace(new PrintWriter(writer));
return writer.toString();
}
private void assertSuppressed(Throwable throwable, Throwable... expectedSuppressed) {
assertEquals(Arrays.asList(throwable.getSuppressed()), Arrays.asList(expectedSuppressed));
}
}