ICU-10620 Some improvements in ICU4J test framework - printing out stack trace information through the print writer when an exception is thrown from a test code, other than errln. Also, errln no longer prints out useless stack trace information.

X-SVN-Rev: 35218
This commit is contained in:
Yoshito Umaoka 2014-02-24 21:17:24 +00:00
parent fd8591d83c
commit d9085c6d2b

View File

@ -1,12 +1,13 @@
/*
*******************************************************************************
* Copyright (C) 1996-2013, International Business Machines Corporation and *
* Copyright (C) 1996-2014, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
@ -64,18 +65,45 @@ public class TestFmwk extends AbstractTestLog {
super(msg);
}
}
static final class ICUTestError extends RuntimeException {
/**
* For serialization
*/
private static final long serialVersionUID = 6170003850185143046L;
ICUTestError(String msg) {
super(msg);
}
}
// Handling exception thrown during text execution (not including
// RuntimeException thrown by errln).
protected void handleException(Throwable e){
Throwable ex = e.getCause();
if(ex==null){
if(ex == null){
ex = e;
}
if(ex instanceof ExceptionInInitializerError){
if (ex instanceof ICUTestError) {
// ICUTestError is one produced by errln.
// We don't need to include useless stack trace information for
// such case.
if (!params.nothrow) {
throw new RuntimeException(ex);
}
return;
}
if (ex instanceof ExceptionInInitializerError){
ex = ((ExceptionInInitializerError)ex).getException();
}
String msg = ex.getMessage();
if(msg==null){
msg = "";
}
//Stack trace
CharArrayWriter caw = new CharArrayWriter();
PrintWriter pw = new PrintWriter(caw);
ex.printStackTrace(pw);
pw.close();
String msg = caw.toString();
//System.err.println("TF handleException msg: " + msg);
if (ex instanceof MissingResourceException || ex instanceof NoClassDefFoundError ||
msg.indexOf("java.util.MissingResourceException") >= 0) {
@ -83,19 +111,16 @@ public class TestFmwk extends AbstractTestLog {
warnln(msg);
} else if (params.nothrow) {
errln(msg);
ex.printStackTrace();
} else {
ex.printStackTrace();
throw new RuntimeException(msg);
throw new RuntimeException(ex);
}
} else {
if (params.nothrow) {
errln(msg);
ex.printStackTrace();
} else {
errln(msg);
ex.printStackTrace();
throw new RuntimeException(msg);
throw new RuntimeException(ex);
}
}
}
@ -377,21 +402,10 @@ public class TestFmwk extends AbstractTestLog {
testMethod.invoke(TestFmwk.this, NO_ARGS);
} catch (IllegalAccessException e) {
errln("Can't access test method " + testMethod.getName());
}catch (ExceptionInInitializerError e){
handleException(e);
} catch (InvocationTargetException e) {
//e.printStackTrace();
handleException(e);
}catch (MissingResourceException e) {
handleException(e);
}catch (NoClassDefFoundError e) {
handleException(e);
}catch (Exception e){
/*errln("Encountered: "+ e.toString());
e.printStackTrace(System.err);
*/
} catch (Exception e) {
handleException(e);
}
}
// If non-exhaustive, check if the method target
// takes excessive time.
@ -626,9 +640,7 @@ public class TestFmwk extends AbstractTestLog {
}
} catch (Exception e) {
ec++;
e.printStackTrace(_params.log);
_params.log.println(e.getMessage());
_params.log.println("encountered exception, exiting");
_params.log.println("encountered a test failure, exiting");
}
return ec;
@ -1564,7 +1576,7 @@ public class TestFmwk extends AbstractTestLog {
if (level == ERR) {
if (!nothrow) {
throw new RuntimeException(message);
throw new ICUTestError(message);
}
if (!suppressIndent && errorSummary != null && stack !=null
&& (errorCount == stack.ec + 1)) {