diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitResultFormatter.java index c4917f7f0..a7a2c3bd7 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitResultFormatter.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitResultFormatter.java @@ -78,4 +78,15 @@ public interface JUnitResultFormatter extends TestListener { * Sets the stream the formatter is supposed to write its results to. */ public void setOutput(java.io.OutputStream out); + + /** + * This is what the test has written to System.out + */ + public void setSystemOutput( String out ); + + /** + * This is what the test has written to System.err + */ + public void setSystemError( String err ); + } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java index 02009110c..ccbef4371 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java @@ -66,6 +66,7 @@ import org.apache.tools.ant.types.Commandline; import org.apache.tools.ant.types.Environment; import org.apache.tools.ant.types.CommandlineJava; import org.apache.tools.ant.types.Path; +import org.apache.tools.ant.types.EnumeratedAttribute; import java.io.File; @@ -88,6 +89,7 @@ import java.util.Vector; * @author Thomas Haas * @author Stefan Bodewig * @author Stephane Bailliez + * @author Gerrit Riessen - */ public class JUnitTask extends Task { @@ -99,6 +101,7 @@ public class JUnitTask extends Task { private Integer timeout = null; private boolean summary = false; + private String summaryValue = ""; /** * Tells this task to halt when there is an error in a test. @@ -128,6 +131,7 @@ public class JUnitTask extends Task { } } + /** * Tells whether a JVM should be forked for each testcase. It avoids interference * between testcases and possibly avoids hanging the build. @@ -147,11 +151,31 @@ public class JUnitTask extends Task { /** * Tells whether the task should print a short summary of the task. - * @param value true to print a summary, false otherwise. + * @param value true to print a summary, + * withOutAndErr to include the test's output as + * well, false otherwise. * @see SummaryJUnitResultFormatter */ - public void setPrintsummary(boolean value) { - summary = value; + public void setPrintsummary(SummaryAttribute value) { + summaryValue = value.getValue(); + summary = value.asBoolean(); + } + + /** + * Print summary enumeration values. + */ + public static class SummaryAttribute extends EnumeratedAttribute { + public String[] getValues() { + return new String[] {"true", "yes", "false", "no", + "on", "off", "withOutAndErr"}; + } + + public boolean asBoolean() { + return "true".equals(value) + || "on".equals(value) + || "yes".equals(value) + || "withOutAndErr".equals(value); + } } /** @@ -389,7 +413,9 @@ public class JUnitTask extends Task { if (summary) { log("Running " + test.getName(), Project.MSG_INFO); - SummaryJUnitResultFormatter f = new SummaryJUnitResultFormatter(); + SummaryJUnitResultFormatter f = + new SummaryJUnitResultFormatter(); + f.setWithOutAndErr( "withoutanderr".equalsIgnoreCase( summaryValue )); f.setOutput( getDefaultOutput() ); runner.addFormatter(f); } diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java index 2c960aee7..2202e5a82 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java @@ -206,10 +206,31 @@ public class JUnitTestRunner implements TestListener { junitTest.setCounts(1, 0, 1); junitTest.setRunTime(0); } else { - suite.run(res); - junitTest.setCounts(res.runCount(), res.failureCount(), - res.errorCount()); - junitTest.setRunTime(System.currentTimeMillis() - start); + + + PrintStream oldErr = System.err; + PrintStream oldOut = System.out; + + ByteArrayOutputStream errStrm = new ByteArrayOutputStream(); + System.setErr(new PrintStream(errStrm)); + + ByteArrayOutputStream outStrm = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outStrm)); + + try { + suite.run(res); + } finally { + System.err.close(); + System.out.close(); + System.setErr(oldErr); + System.setOut(oldOut); + sendOutAndErr(new String(outStrm.toByteArray()), + new String(errStrm.toByteArray())); + + junitTest.setCounts(res.runCount(), res.failureCount(), + res.errorCount()); + junitTest.setRunTime(System.currentTimeMillis() - start); + } } fireEndTestSuite(); @@ -274,6 +295,16 @@ public class JUnitTestRunner implements TestListener { } } + private void sendOutAndErr(String out, String err) { + for (int i=0; i 0) { + sb.append("------------- Standard Output ---------------" ) + .append(newLine) + .append(systemOutput) + .append("------------- ---------------- ---------------" ) + .append(newLine); + } + + if (systemError != null && systemError.length() > 0) { + sb.append("------------- Standard Error -----------------" ) + .append(newLine) + .append(systemError) + .append("------------- ---------------- ---------------" ) + .append(newLine); + } if (out != null) { try { diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/SummaryJUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/SummaryJUnitResultFormatter.java index e01f28100..96bf22a0d 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/SummaryJUnitResultFormatter.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/SummaryJUnitResultFormatter.java @@ -79,6 +79,10 @@ public class SummaryJUnitResultFormatter implements JUnitResultFormatter { */ private OutputStream out; + private boolean withOutAndErr = false; + private String systemOutput = null; + private String systemError = null; + /** * Empty */ @@ -116,10 +120,27 @@ public class SummaryJUnitResultFormatter implements JUnitResultFormatter { this.out = out; } + public void setSystemOutput( String out ) { + systemOutput = out; + } + + public void setSystemError( String err ) { + systemError = err; + } + + /** + * Should the output to System.out and System.err be written to + * the summary. + */ + public void setWithOutAndErr( boolean value ) { + withOutAndErr = value; + } + /** * The whole testsuite ended. */ public void endTestSuite(JUnitTest suite) throws BuildException { + String newLine = System.getProperty("line.separator"); StringBuffer sb = new StringBuffer("Tests run: "); sb.append(suite.runCount()); sb.append(", Failures: "); @@ -129,7 +150,20 @@ public class SummaryJUnitResultFormatter implements JUnitResultFormatter { sb.append(", Time elapsed: "); sb.append(nf.format(suite.getRunTime()/1000.0)); sb.append(" sec"); - sb.append(System.getProperty("line.separator")); + sb.append(newLine); + + if (withOutAndErr) { + if (systemOutput != null && systemOutput.length() > 0) { + sb.append( "Output:" ).append(newLine).append(systemOutput) + .append(newLine); + } + + if (systemError != null && systemError.length() > 0) { + sb.append( "Error: " ).append(newLine).append(systemError) + .append(newLine); + } + } + try { out.write(sb.toString().getBytes()); out.flush(); diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLConstants.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLConstants.java index 2c626cc0a..07f930fbc 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLConstants.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLConstants.java @@ -80,6 +80,12 @@ public interface XMLConstants { /** the failure element */ public final static String FAILURE = "failure"; + /** the system-err element */ + public final static String SYSTEM_ERR = "system-err"; + + /** the system-out element */ + public final static String SYSTEM_OUT = "system-out"; + /** package attribute for the aggregate document */ public final static String ATTR_PACKAGE = "package"; diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java index dbdfeff8a..0291246c5 100644 --- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java +++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLJUnitResultFormatter.java @@ -117,6 +117,14 @@ public class XMLJUnitResultFormatter implements JUnitResultFormatter, XMLConstan this.out = out; } + public void setSystemOutput(String out) { + formatOutput(SYSTEM_OUT, out); + } + + public void setSystemError(String out) { + formatOutput(SYSTEM_ERR, out); + } + /** * The whole testsuite started. */ @@ -230,4 +238,11 @@ public class XMLJUnitResultFormatter implements JUnitResultFormatter, XMLConstan nested.appendChild(trace); } + private void formatOutput(String type, String output) { + Element nested = doc.createElement(type); + rootElement.appendChild(nested); + Text content = doc.createTextNode(output); + nested.appendChild(content); + } + } // XMLJUnitResultFormatter