Hi Michael,
Is it possible to get the run time output to the log also? It's good to
know what impact our fixes have on test run performance.
-- Michelle
Michael Watzek wrote:
Hi,
JIRA JDO-33 suggests to print the TCK output to a log file in addition
to standard out. The attached patch solves this issue.
The log file is created in directory "target/logs". If this directory
does not exist at the time the TCK is started, then it is created. The
file name pattern for the log file is "TCKLog-<currentDate>.txt". The
format of <currentDate> is "yyyyMMdd-HHmmss".
You can switch off printing to a log file if you set the system
property "noLogFile" to "true". In this case you'll only have console
output. Otherwise, System.out and System.err are redirected to a log
file and to the console.
Because the patch redirects the console output, you'll see also
logging output in the log file. For this reason, we decided not to log
exceptions in case of failures and/or errors using fatal/error log
level. Instead, those exceptions are logged using level info. Thus, if
you want to see exceptions at once with the test result, then please
set the log level of the TCK to info. By default, it is set to error
and you see exceptions only at the end of the TCK output after the
output of all tests.
Regards,
Michael
------------------------------------------------------------------------
Index: test/java/org/apache/jdo/tck/JDO_Test.java
===================================================================
--- test/java/org/apache/jdo/tck/JDO_Test.java (revision 189748)
+++ test/java/org/apache/jdo/tck/JDO_Test.java (working copy)
@@ -182,11 +182,13 @@
testSucceeded = true;
}
catch (AssertionFailedError e) {
- logger.error("Exception during setUp or runtest: ", e);
+ if (logger.isInfoEnabled())
+ logger.info("Exception during setUp or runtest: ", e);
throw e;
}
catch (Throwable t) {
- logger.fatal("Exception during setUp or runtest: ", t);
+ if (logger.isInfoEnabled())
+ logger.info("Exception during setUp or runtest: ", t);
throw t;
}
finally {
@@ -204,7 +206,8 @@
*/
private void setTearDownThrowable(String context, Throwable throwable)
{
- logger.fatal("Exception during "+context+": ", throwable);
+ if (logger.isInfoEnabled())
+ logger.info("Exception during "+context+": ", throwable);
if (this.tearDownThrowable == null) {
this.tearDownThrowable = throwable;
}
Index: test/java/org/apache/jdo/tck/util/BatchTestRunner.java
===================================================================
--- test/java/org/apache/jdo/tck/util/BatchTestRunner.java (revision
189748)
+++ test/java/org/apache/jdo/tck/util/BatchTestRunner.java (working copy)
@@ -16,10 +16,17 @@
package org.apache.jdo.tck.util;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
-import java.io.PrintStream;
+import java.text.SimpleDateFormat;
import java.util.Arrays;
+import java.util.Date;
import junit.framework.Test;
import junit.framework.TestResult;
@@ -47,7 +54,16 @@
/** Default of the system property ResultPrinterClass. */
public static final String RESULTPRINTER_DEFAULT =
BatchResultPrinter.class.getName();
-
+
+ /** Redirect System.out and System.err to an ConsoleFileOutput instance. */
+ static {
+ if (!Boolean.getBoolean("noLogFile")) {
+ PrintStream printStream = new PrintStream(new ConsoleFileOutput());
+ System.setErr(printStream);
+ System.setOut(printStream);
+ }
+ }
+
/**
* Constructor.
* It creates a result printer instance based on the system property
@@ -172,4 +188,53 @@
protected ResultPrinter getDefaultResultPrinter() {
return new BatchResultPrinter(System.out);
}
+
+ private static class ConsoleFileOutput extends OutputStream {
+
+ private static String outDir = "logs";
+ private static String fileNamePrefix = "TCKLog-";
+ private static String fileNameSuffix = ".txt";
+ private static SimpleDateFormat simpleDateFormat = new
SimpleDateFormat("yyyyMMdd-HHmmss");
+
+ private PrintStream systemOut = System.out;
+ private FileOutputStream fileOut;
+
+ private ConsoleFileOutput() {
+ String fileName = fileNamePrefix+simpleDateFormat.format(new
Date())+fileNameSuffix;
+ File dir = new File(outDir);
+ if (!dir.exists()) {
+ dir.mkdir();
+ }
+
+ try {
+ fileOut = new FileOutputStream(new File(dir, fileName));
+ } catch (FileNotFoundException e) {
+ System.err.println("Cannot create log file "+fileName+". "+e);
+ }
+ }
+
+ /*
+ * @see java.io.OutputStream#write(int)
+ */
+ public void write(int b) throws IOException {
+ this.systemOut.write(b);
+ this.fileOut.write(b);
+ }
+
+ /**
+ * @see java.io.OutputStream#close()
+ */
+ public void close() throws IOException {
+ this.fileOut.close();
+ this.systemOut.close();
+ }
+
+ /**
+ * @see java.io.OutputStream#flush()
+ */
+ public void flush() throws IOException {
+ this.systemOut.flush();
+ this.fileOut.flush();
+ }
+ }
}