jglick 2005/03/29 11:19:04
Modified: src/main/org/apache/tools/ant/taskdefs/optional/junit
JUnitTask.java JUnitTestRunner.java
Added: src/testcases/org/apache/tools/ant/taskdefs/optional/junit
JUnitTestListenerTest.java
Log:
#31885: <junit> logs more detailed events for individual tests it is running.
Revision Changes Path
1.116 +47 -9
ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
Index: JUnitTask.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java,v
retrieving revision 1.115
retrieving revision 1.116
diff -u -r1.115 -r1.116
--- JUnitTask.java 24 Mar 2005 08:35:49 -0000 1.115
+++ JUnitTask.java 29 Mar 2005 19:19:04 -0000 1.116
@@ -34,6 +34,9 @@
import java.util.Map;
import java.util.Properties;
import java.util.Vector;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestResult;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
@@ -41,7 +44,6 @@
import org.apache.tools.ant.taskdefs.Execute;
import org.apache.tools.ant.taskdefs.ExecuteWatchdog;
import org.apache.tools.ant.taskdefs.LogOutputStream;
-import org.apache.tools.ant.taskdefs.LogStreamHandler;
import org.apache.tools.ant.types.Assertions;
import org.apache.tools.ant.types.Commandline;
import org.apache.tools.ant.types.CommandlineJava;
@@ -52,9 +54,7 @@
import org.apache.tools.ant.types.PropertySet;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.util.LoaderUtils;
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
-import junit.framework.TestResult;
+import org.apache.tools.ant.taskdefs.PumpStreamHandler;
/**
* Runs JUnit tests.
@@ -149,6 +149,11 @@
private ForkMode forkMode = new ForkMode("perTest");
private static final int STRING_BUFFER_SIZE = 128;
+ /**
+ * @since Ant 1.7
+ */
+ public static final String TESTLISTENER_PREFIX =
+ "junit.framework.TestListener: ";
private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
@@ -829,6 +834,7 @@
cmd.createArgument().setValue("showoutput="
+ String.valueOf(showOutput));
+ cmd.createArgument().setValue("logtestlistenerevents=true"); //
#31885
StringBuffer formatterArg = new StringBuffer(STRING_BUFFER_SIZE);
final FormatterElement[] feArray = mergeFormatters(test);
@@ -871,9 +877,9 @@
+ "file.", e, getLocation());
}
- Execute execute = new Execute(new LogStreamHandler(this,
- Project.MSG_INFO,
- Project.MSG_WARN),
+ Execute execute = new Execute(new JUnitLogStreamHandler(this,
+
Project.MSG_INFO,
+
Project.MSG_WARN),
watchdog);
execute.setCommandline(cmd.getCommandline());
execute.setAntRun(getProject());
@@ -941,7 +947,9 @@
* @since Ant 1.5
*/
protected void handleOutput(String output) {
- if (runner != null) {
+ if (output.startsWith(TESTLISTENER_PREFIX))
+ log(output, Project.MSG_VERBOSE);
+ else if (runner != null) {
runner.handleOutput(output);
if (showOutput) {
super.handleOutput(output);
@@ -1063,7 +1071,8 @@
}
runner = new JUnitTestRunner(test, test.getHaltonerror(),
test.getFiltertrace(),
- test.getHaltonfailure(),
classLoader);
+ test.getHaltonfailure(), false,
+ true, classLoader);
if (summary) {
log("Running " + test.getName(), Project.MSG_INFO);
@@ -1549,4 +1558,33 @@
public boolean timedOut = false;
public boolean crashed = false;
}
+
+ /**
+ * @since Ant 1.7
+ */
+ protected static class JUnitLogOutputStream extends LogOutputStream {
+ private Task task; // local copy since LogOutputStream.task is
private
+
+ public JUnitLogOutputStream(Task task, int level) {
+ super(task, level);
+ this.task = task;
+ }
+
+ protected void processLine(String line, int level) {
+ if (line.startsWith(TESTLISTENER_PREFIX))
+ task.log(line, Project.MSG_VERBOSE);
+ else
+ super.processLine(line, level);
+ }
+ }
+
+ /**
+ * @since Ant 1.7
+ */
+ protected static class JUnitLogStreamHandler extends PumpStreamHandler {
+ public JUnitLogStreamHandler(Task task, int outlevel, int errlevel) {
+ super(new JUnitLogOutputStream(task, outlevel),
+ new LogOutputStream(task, errlevel));
+ }
+ }
}
1.57 +65 -7
ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
Index: JUnitTestRunner.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -r1.56 -r1.57
--- JUnitTestRunner.java 24 Mar 2005 08:35:49 -0000 1.56
+++ JUnitTestRunner.java 29 Mar 2005 19:19:04 -0000 1.57
@@ -161,6 +161,9 @@
/** ClassLoader passed in in non-forked mode. */
private ClassLoader loader;
+
+ /** Do we print TestListener events? */
+ private boolean logTestListenerEvents = false;
/**
* Constructor for fork=true or when the user hasn't specified a
@@ -178,7 +181,19 @@
public JUnitTestRunner(JUnitTest test, boolean haltOnError,
boolean filtertrace, boolean haltOnFailure,
boolean showOutput) {
- this(test, haltOnError, filtertrace, haltOnFailure, showOutput,
null);
+ this(test, haltOnError, filtertrace, haltOnFailure, showOutput,
false);
+ }
+
+ /**
+ * Constructor for fork=true or when the user hasn't specified a
+ * classpath.
+ * @since Ant 1.7
+ */
+ public JUnitTestRunner(JUnitTest test, boolean haltOnError,
+ boolean filtertrace, boolean haltOnFailure,
+ boolean showOutput, boolean
logTestListenerEvents) {
+ this(test, haltOnError, filtertrace, haltOnFailure, showOutput,
+ logTestListenerEvents, null);
}
/**
@@ -196,14 +211,29 @@
public JUnitTestRunner(JUnitTest test, boolean haltOnError,
boolean filtertrace, boolean haltOnFailure,
boolean showOutput, ClassLoader loader) {
+ this(test, haltOnError, filtertrace, haltOnFailure, showOutput,
+ false, loader);
+ }
+
+ /**
+ * Constructor to use when the user has specified a classpath.
+ * @since Ant 1.7
+ */
+ public JUnitTestRunner(JUnitTest test, boolean haltOnError,
+ boolean filtertrace, boolean haltOnFailure,
+ boolean showOutput, boolean logTestListenerEvents,
+ ClassLoader loader) {
JUnitTestRunner.filtertrace = filtertrace;
this.junitTest = test;
this.haltOnError = haltOnError;
this.haltOnFailure = haltOnFailure;
this.showOutput = showOutput;
+ this.logTestListenerEvents = logTestListenerEvents;
this.loader = loader;
}
+ private PrintStream savedOut = null;
+
public void run() {
res = new TestResult();
res.addListener(this);
@@ -217,7 +247,6 @@
ByteArrayOutputStream outStrm = new ByteArrayOutputStream();
systemOut = new PrintStream(outStrm);
- PrintStream savedOut = null;
PrintStream savedErr = null;
if (forked) {
@@ -295,6 +324,7 @@
junitTest.setRunTime(0);
} else {
try {
+ logTestListenerEvent("tests to run: " +
suite.countTestCases());
suite.run(res);
} finally {
junitTest.setCounts(res.runCount(), res.failureCount(),
@@ -344,6 +374,8 @@
* <p>A new Test is started.
*/
public void startTest(Test t) {
+ String testName = JUnitVersionHelper.getTestCaseName(t);
+ logTestListenerEvent("startTest(" + testName + ")");
}
/**
@@ -352,6 +384,17 @@
* <p>A Test is finished.
*/
public void endTest(Test test) {
+ String testName = JUnitVersionHelper.getTestCaseName(test);
+ logTestListenerEvent("endTest(" + testName + ")");
+ }
+
+ private void logTestListenerEvent(String msg) {
+ PrintStream out = forked ? savedOut : System.out;
+ if (logTestListenerEvents) {
+ out.flush();
+ out.println(JUnitTask.TESTLISTENER_PREFIX + msg);
+ out.flush();
+ }
}
/**
@@ -360,6 +403,8 @@
* <p>A Test failed.
*/
public void addFailure(Test test, Throwable t) {
+ String testName = JUnitVersionHelper.getTestCaseName(test);
+ logTestListenerEvent("addFailure(" + testName + ", " +
t.getMessage() + ")");
if (haltOnFailure) {
res.stop();
}
@@ -380,6 +425,8 @@
* <p>An error occurred while running the test.
*/
public void addError(Test test, Throwable t) {
+ String testName = JUnitVersionHelper.getTestCaseName(test);
+ logTestListenerEvent("addError(" + testName + ", " + t.getMessage()
+ ")");
if (haltOnError) {
res.stop();
}
@@ -395,7 +442,9 @@
}
protected void handleOutput(String output) {
- if (systemOut != null) {
+ if (!logTestListenerEvents &&
output.startsWith(JUnitTask.TESTLISTENER_PREFIX))
+ ; // ignore
+ else if (systemOut != null) {
systemOut.print(output);
}
}
@@ -478,6 +527,9 @@
* <tr><td>showoutput</td><td>send output to System.err/.out as
* well as to the formatters?</td><td>false</td></tr>
*
+ * <tr><td>logtestlistenerevents</td><td>log TestListener events to
+ * System.out.</td><td>false</td></tr>
+ *
* </table>
*/
public static void main(String[] args) throws IOException {
@@ -486,6 +538,7 @@
boolean stackfilter = true;
Properties props = new Properties();
boolean showOut = false;
+ boolean logTestListenerEvents = false;
String noCrashFile = null;
if (args.length == 0) {
@@ -521,6 +574,8 @@
in.close();
} else if (args[i].startsWith("showoutput=")) {
showOut = Project.toBoolean(args[i].substring(11));
+ } else if (args[i].startsWith("logtestlistenerevents=")) {
+ logTestListenerEvents =
Project.toBoolean(args[i].substring(22));
}
}
@@ -548,7 +603,7 @@
t.setTodir(new File(st.nextToken()));
t.setOutfile(st.nextToken());
code = launch(t, haltError, stackfilter, haltFail,
- showOut, props);
+ showOut, logTestListenerEvents, props);
errorOccured = (code == ERRORS);
failureOccured = (code != SUCCESS);
if (errorOccured || failureOccured) {
@@ -570,7 +625,8 @@
}
} else {
returnCode = launch(new JUnitTest(args[0]), haltError,
- stackfilter, haltFail, showOut, props);
+ stackfilter, haltFail, showOut,
+ logTestListenerEvents, props);
}
registerNonCrash(noCrashFile);
@@ -668,10 +724,12 @@
*/
private static int launch(JUnitTest t, boolean haltError,
boolean stackfilter, boolean haltFail,
- boolean showOut, Properties props) {
+ boolean showOut, boolean logTestListenerEvents,
+ Properties props) {
t.setProperties(props);
JUnitTestRunner runner =
- new JUnitTestRunner(t, haltError, stackfilter, haltFail,
showOut);
+ new JUnitTestRunner(t, haltError, stackfilter, haltFail, showOut,
+ logTestListenerEvents);
runner.forked = true;
transferFormatters(runner, t);
1.1
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestListenerTest.java
Index: JUnitTestListenerTest.java
===================================================================
/*
* Copyright 2005 The Apache Software Foundation
*
* 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 org.apache.tools.ant.taskdefs.optional.junit;
import org.apache.tools.ant.BuildFileTest;
public class JUnitTestListenerTest extends BuildFileTest {
// The captureToSummary test writes to stdout and stderr, good for
// verifying that the TestListener support doesn't break anything.
private static final String PASS_TEST_TARGET = "captureToSummary";
// testNoCrash is the test invoked by the captureToSummary's junit task
private static final String PASS_TEST = "testNoCrash";
public JUnitTestListenerTest(String name) {
super(name);
}
public void setUp() {
configureProject("src/etc/testcases/taskdefs/optional/junit.xml");
}
public void testFullLogOutput() {
executeTarget(PASS_TEST_TARGET);
assertTrue("expecting full log to have BuildListener events",
hasBuildListenerEvents(getFullLog()));
}
public void testNoLogOutput() {
executeTarget(PASS_TEST_TARGET);
assertFalse("expecting log to not have BuildListener events",
hasBuildListenerEvents(getLog()));
}
public void testTestCountFired() {
executeTarget(PASS_TEST_TARGET);
assertTrue("expecting test count message",
hasEventMessage(JUnitTask.TESTLISTENER_PREFIX +
"tests to run: "));
}
public void testStartTestFired() {
executeTarget(PASS_TEST_TARGET);
assertTrue("expecting test started message",
hasEventMessage(JUnitTask.TESTLISTENER_PREFIX +
"startTest(" + PASS_TEST + ")"));
}
public void testEndTestFired() {
executeTarget(PASS_TEST_TARGET);
assertTrue("expecting test ended message",
hasEventMessage(JUnitTask.TESTLISTENER_PREFIX +
"endTest(" + PASS_TEST + ")"));
}
private boolean hasBuildListenerEvents(String log) {
return log.indexOf(JUnitTask.TESTLISTENER_PREFIX) >= 0;
}
private boolean hasEventMessage(String eventPrefix) {
return getFullLog().indexOf(eventPrefix) >= 0;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]