bodewig 2004/04/16 00:05:32
Modified: . Tag: ANT_16_BRANCH CONTRIBUTORS build.xml
src/main/org/apache/tools/ant/taskdefs/optional/junit Tag:
ANT_16_BRANCH FormatterElement.java JUnitTask.java
JUnitTestRunner.java
Log:
merge
Revision Changes Path
No revision
No revision
1.1.2.8 +2 -0 ant/CONTRIBUTORS
Index: CONTRIBUTORS
===================================================================
RCS file: /home/cvs/ant/CONTRIBUTORS,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -u -r1.1.2.7 -r1.1.2.8
--- CONTRIBUTORS 14 Apr 2004 15:37:03 -0000 1.1.2.7
+++ CONTRIBUTORS 16 Apr 2004 07:05:32 -0000 1.1.2.8
@@ -62,6 +62,7 @@
Glenn Twiggs
Greg Nelson
Harish Prabandham
+Haroon Rafique
Hiroaki Nakamura
Holger Engels
Ingenonsya France
@@ -163,6 +164,7 @@
Russell Gold
Sam Ruby
Scott Carlson
+Scott M. Stirling
Sean Egan
Sean P. Kane
Shiraz Kanga
1.392.2.24 +2 -1 ant/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/ant/build.xml,v
retrieving revision 1.392.2.23
retrieving revision 1.392.2.24
diff -u -r1.392.2.23 -r1.392.2.24
--- build.xml 26 Mar 2004 13:08:29 -0000 1.392.2.23
+++ build.xml 16 Apr 2004 07:05:32 -0000 1.392.2.24
@@ -53,6 +53,7 @@
<property name="junit.filtertrace" value="off"/>
<property name="junit.summary" value="no"/>
<property name="test.haltonfailure" value="yes" />
+ <property name="junit.forkstyle" value="once"/>
<property name="unfiltered.files"
value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf,**/*.zip"/>
<!--
@@ -1427,7 +1428,7 @@
<junit printsummary="${junit.summary}"
haltonfailure="${test.haltonfailure}"
filtertrace="${junit.filtertrace}"
- fork="${junit.fork}"
+ fork="${junit.fork}" forkstyle="${junit.forkstyle}"
failureproperty="tests.failed">
<!-- <jvmarg value="-classic"/> -->
<classpath refid="tests-classpath"/>
No revision
No revision
1.17.2.5 +17 -5
ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
Index: FormatterElement.java
===================================================================
RCS file:
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java,v
retrieving revision 1.17.2.4
retrieving revision 1.17.2.5
diff -u -r1.17.2.4 -r1.17.2.5
--- FormatterElement.java 9 Mar 2004 17:01:49 -0000 1.17.2.4
+++ FormatterElement.java 16 Apr 2004 07:05:32 -0000 1.17.2.5
@@ -56,6 +56,13 @@
private String ifProperty;
private String unlessProperty;
+ public static final String XML_FORMATTER_CLASS_NAME =
+
"org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter";
+ public static final String BRIEF_FORMATTER_CLASS_NAME =
+
"org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter";
+ public static final String PLAIN_FORMATTER_CLASS_NAME =
+
"org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter";
+
/**
* <p> Quick way to use a standard formatter.
*
@@ -71,15 +78,13 @@
*/
public void setType(TypeAttribute type) {
if ("xml".equals(type.getValue())) {
-
setClassname("org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter");
- setExtension(".xml");
+ setClassname(XML_FORMATTER_CLASS_NAME);
} else {
if ("brief".equals(type.getValue())) {
-
setClassname("org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter");
+ setClassname(BRIEF_FORMATTER_CLASS_NAME);
} else { // must be plain, ensured by TypeAttribute
-
setClassname("org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter");
+ setClassname(PLAIN_FORMATTER_CLASS_NAME);
}
- setExtension(".txt");
}
}
@@ -90,6 +95,13 @@
*/
public void setClassname(String classname) {
this.classname = classname;
+ if (XML_FORMATTER_CLASS_NAME.equals(classname)) {
+ setExtension(".xml");
+ } else if (PLAIN_FORMATTER_CLASS_NAME.equals(classname)) {
+ setExtension(".txt");
+ } else if (BRIEF_FORMATTER_CLASS_NAME.equals(classname)) {
+ setExtension(".txt");
+ }
}
/**
1.83.2.10 +295 -49
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.83.2.9
retrieving revision 1.83.2.10
diff -u -r1.83.2.9 -r1.83.2.10
--- JUnitTask.java 9 Mar 2004 17:01:50 -0000 1.83.2.9
+++ JUnitTask.java 16 Apr 2004 07:05:32 -0000 1.83.2.10
@@ -17,12 +17,21 @@
package org.apache.tools.ant.taskdefs.optional.junit;
+import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
+import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Enumeration;
+import java.util.HashMap;
import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import java.util.Properties;
import java.util.Vector;
import org.apache.tools.ant.AntClassLoader;
@@ -116,7 +125,7 @@
*/
public class JUnitTask extends Task {
- private CommandlineJava commandline = new CommandlineJava();
+ private CommandlineJava commandline;
private Vector tests = new Vector();
private Vector batchTests = new Vector();
private Vector formatters = new Vector();
@@ -138,13 +147,15 @@
private File tmpDir;
private AntClassLoader classLoader = null;
private Permissions perm = null;
+ private ForkStyle forkStyle = new ForkStyle("perTest");
private static final int STRING_BUFFER_SIZE = 128;
+
/**
- * If true, force ant to re-classload all classes for each JUnit TestCase
- *
- * @param value force class reloading for each test case
- */
+ * If true, force ant to re-classload all classes for each JUnit TestCase
+ *
+ * @param value force class reloading for each test case
+ */
public void setReloading(boolean value) {
reloading = value;
}
@@ -266,6 +277,29 @@
}
/**
+ * Set the bahvior when [EMAIL PROTECTED] #setFork fork} fork has been
enabled.
+ *
+ * <p>Possible values are "once", "perTest" and "perBatch". If
+ * set to "once", only a single Java VM will be forked for all
+ * tests, with "perTest" (the default) each test will run in a
+ * fresh Java VM and "perBatch" will run all tests from the same
+ * <batchtest> in the same Java VM.</p>
+ *
+ * <p>This attribute will be ignored if tests run in the same VM
+ * as Ant.</p>
+ *
+ * <p>Only tests with the same configuration of haltonerror,
+ * haltonfailure, errorproperty, failureproperty and filtertrace
+ * can share a forked Java VM, so even if you set the value to
+ * "once", Ant may need to fork mutliple VMs.</p>
+ *
+ * @since Ant 1.6.2
+ */
+ public void setForkStyle(ForkStyle style) {
+ this.forkStyle = style;
+ }
+
+ /**
* If true, print one-line statistics for each test, or "withOutAndErr"
* to also show standard output and error.
*
@@ -331,7 +365,7 @@
* @since Ant 1.2
*/
public void setMaxmemory(String max) {
- commandline.setMaxmemory(max);
+ getCommandline().setMaxmemory(max);
}
/**
@@ -345,7 +379,7 @@
* @since Ant 1.2
*/
public void setJvm(String value) {
- commandline.setVm(value);
+ getCommandline().setVm(value);
}
/**
@@ -358,7 +392,7 @@
* @since Ant 1.2
*/
public Commandline.Argument createJvmarg() {
- return commandline.createVmArgument();
+ return getCommandline().createVmArgument();
}
/**
@@ -383,7 +417,7 @@
*/
public void addSysproperty(Environment.Variable sysp) {
- commandline.addSysproperty(sysp);
+ getCommandline().addSysproperty(sysp);
}
/**
@@ -398,7 +432,7 @@
// see bugzilla report 21684
String testString = sysp.getContent();
getProject().log("sysproperty added : " + testString,
Project.MSG_DEBUG);
- commandline.addSysproperty(sysp);
+ getCommandline().addSysproperty(sysp);
}
/**
@@ -412,7 +446,7 @@
* @since Ant 1.6
*/
public void addSyspropertyset(PropertySet sysp) {
- commandline.addSyspropertyset(sysp);
+ getCommandline().addSyspropertyset(sysp);
}
/**
@@ -422,7 +456,7 @@
* @since Ant 1.2
*/
public Path createClasspath() {
- return commandline.createClasspath(getProject()).createPath();
+ return getCommandline().createClasspath(getProject()).createPath();
}
/**
@@ -431,7 +465,7 @@
* @since Ant 1.6
*/
public Path createBootclasspath() {
- return commandline.createBootclasspath(getProject()).createPath();
+ return
getCommandline().createBootclasspath(getProject()).createPath();
}
/**
@@ -525,10 +559,10 @@
* @param asserts assertion set
*/
public void addAssertions(Assertions asserts) {
- if (commandline.getAssertions() != null) {
+ if (getCommandline().getAssertions() != null) {
throw new BuildException("Only one assertion declaration is
allowed");
}
- commandline.setAssertions(asserts);
+ getCommandline().setAssertions(asserts);
}
/**
@@ -550,7 +584,7 @@
* @since Ant 1.2
*/
public JUnitTask() throws Exception {
- commandline
+ getCommandline()
.setClassname("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner");
}
@@ -586,12 +620,29 @@
* @since Ant 1.2
*/
public void execute() throws BuildException {
- Enumeration list = getIndividualTests();
- while (list.hasMoreElements()) {
- JUnitTest test = (JUnitTest) list.nextElement();
- if (test.shouldRun(getProject())) {
- execute(test);
+ List testLists = new ArrayList();
+
+ boolean forkPerTest =
forkStyle.getValue().equals(ForkStyle.PER_TEST);
+ if (forkPerTest || forkStyle.getValue().equals(ForkStyle.ONCE)) {
+ testLists.addAll(executeOrQueue(getIndividualTests(),
+ forkPerTest));
+ } else { /* forkStyle.getValue().equals(ForkStyle.PER_BATCH) */
+ final int count = batchTests.size();
+ for (int i = 0; i < count; i++) {
+ BatchTest batchtest = (BatchTest) batchTests.elementAt(i);
+ testLists.addAll(executeOrQueue(batchtest.elements(),
false));
}
+ testLists.addAll(executeOrQueue(tests.elements(), forkPerTest));
+ }
+
+ Iterator iter = testLists.iterator();
+ while (iter.hasNext()) {
+ List l = (List) iter.next();
+ if (l.size() == 1) {
+ execute((JUnitTest) l.get(0));
+ } else {
+ execute(l);
+ }
}
}
@@ -619,34 +670,75 @@
exitValue = executeInVM(test);
} else {
ExecuteWatchdog watchdog = createWatchdog();
- exitValue = executeAsForked(test, watchdog);
+ exitValue = executeAsForked(test, watchdog, null);
// null watchdog means no timeout, you'd better not check with
null
if (watchdog != null) {
wasKilled = watchdog.killedProcess();
}
}
+ actOnTestResult(exitValue, wasKilled, test, "Test " +
test.getName());
+ }
- // if there is an error/failure and that it should halt, stop
- // everything otherwise just log a statement
- boolean errorOccurredHere =
- exitValue == JUnitTestRunner.ERRORS || wasKilled;
- boolean failureOccurredHere =
- exitValue != JUnitTestRunner.SUCCESS || wasKilled;
- if (errorOccurredHere || failureOccurredHere) {
- if ((errorOccurredHere && test.getHaltonerror())
- || (failureOccurredHere && test.getHaltonfailure())) {
- throw new BuildException("Test " + test.getName() + " failed"
- + (wasKilled ? " (timeout)" : ""), getLocation());
- } else {
- log("TEST " + test.getName() + " FAILED"
- + (wasKilled ? " (timeout)" : ""), Project.MSG_ERR);
- if (errorOccurredHere && test.getErrorProperty() != null) {
- getProject().setNewProperty(test.getErrorProperty(),
"true");
+ /**
+ * Execute a list of tests in a single forked Java VM.
+ */
+ protected void execute(List tests) throws BuildException {
+ JUnitTest test = null;
+ // Create a temporary file to pass the test cases to run to
+ // the runner (one test case per line)
+ File casesFile =
+ FileUtils.newFileUtils().createTempFile("junittestcases",
+ ".properties",
+
getProject().getBaseDir());
+ casesFile.deleteOnExit();
+ PrintWriter writer = null;
+ try {
+ writer =
+ new PrintWriter(new BufferedWriter(new
FileWriter(casesFile)));
+ Iterator iter = tests.iterator();
+ while (iter.hasNext()) {
+ test = (JUnitTest) iter.next();
+ writer.print(test.getName());
+ if (test.getTodir() == null) {
+ writer.print("," + getProject().resolveFile("."));
+ } else {
+ writer.print("," + test.getTodir());
}
- if (failureOccurredHere && test.getFailureProperty() !=
null) {
- getProject().setNewProperty(test.getFailureProperty(),
"true");
+
+ if (test.getOutfile() == null) {
+ writer.println("," + "TEST-" + test.getName());
+ } else {
+ writer.println("," + test.getOutfile());
}
}
+ writer.flush();
+ writer.close();
+ writer = null;
+
+ // execute the test and get the return code
+ int exitValue = JUnitTestRunner.ERRORS;
+ boolean wasKilled = false;
+ ExecuteWatchdog watchdog = createWatchdog();
+ exitValue = executeAsForked(test, watchdog, casesFile);
+ // null watchdog means no timeout, you'd better not check
+ // with null
+ if (watchdog != null) {
+ wasKilled = watchdog.killedProcess();
+ }
+ actOnTestResult(exitValue, wasKilled, test, "Tests");
+ } catch(IOException e) {
+ log(e.toString(), Project.MSG_ERR);
+ throw new BuildException(e);
+ } finally {
+ if (writer != null) {
+ writer.close();
+ }
+
+ try {
+ casesFile.delete();
+ } catch (Exception e) {
+ log(e.toString(), Project.MSG_ERR);
+ }
}
}
@@ -661,17 +753,25 @@
* @throws BuildException in case of error creating a temporary property
file,
* or if the junit process can not be forked
*/
- private int executeAsForked(JUnitTest test, ExecuteWatchdog watchdog)
+ private int executeAsForked(JUnitTest test, ExecuteWatchdog watchdog,
+ File casesFile)
throws BuildException {
- if(perm != null) {
- log("Permissions ignored when running in forked mode!",
Project.MSG_WARN);
+ if (perm != null) {
+ log("Permissions ignored when running in forked mode!",
+ Project.MSG_WARN);
}
- CommandlineJava cmd = (CommandlineJava) commandline.clone();
+ CommandlineJava cmd = (CommandlineJava) getCommandline().clone();
cmd.setClassname("org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner");
- cmd.createArgument().setValue(test.getName());
+ if (casesFile == null) {
+ cmd.createArgument().setValue(test.getName());
+ } else {
+ log("Running multiple tests in the same VM",
Project.MSG_VERBOSE);
+ cmd.createArgument().setValue("testsfile=" + casesFile);
+ }
+
cmd.createArgument().setValue("filtertrace=" +
test.getFiltertrace());
cmd.createArgument().setValue("haltOnError=" +
test.getHaltonerror());
cmd.createArgument().setValue("haltOnFailure="
@@ -896,13 +996,13 @@
+ "the same VM.", Project.MSG_WARN);
}
- if (commandline.getBootclasspath() != null) {
+ if (getCommandline().getBootclasspath() != null) {
log("bootclasspath is ignored if running in the same VM.",
Project.MSG_WARN);
}
CommandlineJava.SysProperties sysProperties =
- commandline.getSystemProperties();
+ getCommandline().getSystemProperties();
if (sysProperties != null) {
sysProperties.setSystem();
}
@@ -1134,7 +1234,7 @@
* @since Ant 1.6
*/
private void createClassLoader() {
- Path userClasspath = commandline.getClasspath();
+ Path userClasspath = getCommandline().getClasspath();
if (userClasspath != null) {
if (reloading || classLoader == null) {
Path classpath = (Path) userClasspath.clone();
@@ -1156,4 +1256,150 @@
}
}
}
+
+ /**
+ * @since Ant 1.6.2
+ */
+ protected CommandlineJava getCommandline() {
+ if (commandline == null) {
+ commandline = new CommandlineJava();
+ }
+ return commandline;
+ }
+
+ /**
+ * @since Ant 1.6.2
+ */
+ private final class ForkedTestConfiguration {
+ private boolean filterTrace;
+ private boolean haltOnError;
+ private boolean haltOnFailure;
+ private String errorProperty;
+ private String failureProperty;
+ ForkedTestConfiguration(boolean filterTrace, boolean haltOnError,
+ boolean haltOnFailure, String errorProperty,
+ String failureProperty) {
+ this.filterTrace = filterTrace;
+ this.haltOnError = haltOnError;
+ this.haltOnFailure = haltOnFailure;
+ this.errorProperty = errorProperty;
+ this.failureProperty = failureProperty;
+ }
+
+ public boolean equals(Object other) {
+ if (other == null
+ || other.getClass() != ForkedTestConfiguration.class) {
+ return false;
+ }
+ ForkedTestConfiguration o = (ForkedTestConfiguration) other;
+ return filterTrace == o.filterTrace
+ && haltOnError == o.haltOnError
+ && haltOnFailure == o.haltOnFailure
+ && ((errorProperty == null && o.errorProperty == null)
+ ||
+ (errorProperty != null
+ && errorProperty.equals(o.errorProperty)))
+ && ((failureProperty == null && o.failureProperty == null)
+ ||
+ (failureProperty != null
+ && failureProperty.equals(o.failureProperty)));
+ }
+
+ public int hashCode() {
+ return (filterTrace ? 1 : 0)
+ + (haltOnError ? 2 : 0)
+ + (haltOnFailure ? 4 : 0);
+ }
+ }
+
+ /**
+ * @since 1.6.2
+ */
+ public static final class ForkStyle extends EnumeratedAttribute {
+ public static final String ONCE = "once";
+ public static final String PER_TEST = "perTest";
+ public static final String PER_BATCH = "perBatch";
+
+ public ForkStyle() {
+ super();
+ }
+
+ public ForkStyle(String value) {
+ super();
+ setValue(value);
+ }
+
+ public String[] getValues() {
+ return new String[] {ONCE, PER_TEST, PER_BATCH};
+ }
+ }
+
+ /**
+ * Executes all tests that don't need to be forked (or all tests
+ * if the runIndividual argument is true. Returns a collection of
+ * lists of tests that share the same VM configuration and haven't
+ * been executed yet.
+ *
+ * @since 1.6.2
+ */
+ protected Collection executeOrQueue(Enumeration testList,
+ boolean runIndividual) {
+ Map testConfigurations = new HashMap();
+ while (testList.hasMoreElements()) {
+ JUnitTest test = (JUnitTest) testList.nextElement();
+ if (test.shouldRun(getProject())) {
+ if (runIndividual || !test.getFork()) {
+ execute(test);
+ } else {
+ ForkedTestConfiguration c =
+ new ForkedTestConfiguration(test.getFiltertrace(),
+ test.getHaltonerror(),
+ test.getHaltonfailure(),
+ test.getErrorProperty(),
+
test.getFailureProperty());
+ List l = (List) testConfigurations.get(c);
+ if (l == null) {
+ l = new ArrayList();
+ testConfigurations.put(c, l);
+ }
+ l.add(test);
+ }
+ }
+ }
+ return testConfigurations.values();
+ }
+
+ /**
+ * Logs information about failed tests, potentially stops
+ * processing (by throwing a BuildException) if a failure/error
+ * occured or sets a property.
+ *
+ * @since Ant 1.6.2
+ */
+ protected void actOnTestResult(int exitValue, boolean wasKilled,
+ JUnitTest test, String name) {
+ // if there is an error/failure and that it should halt, stop
+ // everything otherwise just log a statement
+ boolean errorOccurredHere =
+ exitValue == JUnitTestRunner.ERRORS || wasKilled;
+ boolean failureOccurredHere =
+ exitValue != JUnitTestRunner.SUCCESS || wasKilled;
+ if (errorOccurredHere || failureOccurredHere) {
+ if ((errorOccurredHere && test.getHaltonerror())
+ || (failureOccurredHere && test.getHaltonfailure())) {
+ throw new BuildException(name + " failed"
+ + (wasKilled ? " (timeout)" : ""), getLocation());
+ } else {
+ log(name + " FAILED"
+ + (wasKilled ? " (timeout)" : ""), Project.MSG_ERR);
+ if (errorOccurredHere && test.getErrorProperty() != null) {
+ getProject().setNewProperty(test.getErrorProperty(),
"true");
+ }
+ if (failureOccurredHere && test.getFailureProperty() !=
null) {
+ getProject().setNewProperty(test.getFailureProperty(),
"true");
+ }
+ }
+ }
+ }
+
}
1.42.2.6 +82 -15
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.42.2.5
retrieving revision 1.42.2.6
diff -u -r1.42.2.5 -r1.42.2.6
--- JUnitTestRunner.java 9 Mar 2004 17:01:50 -0000 1.42.2.5
+++ JUnitTestRunner.java 16 Apr 2004 07:05:32 -0000 1.42.2.6
@@ -30,6 +30,7 @@
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
+import java.util.StringTokenizer;
import java.util.Vector;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
@@ -154,6 +155,9 @@
/** is this runner running in forked mode? */
private boolean forked = false;
+ /** Running more than one test suite? */
+ private static boolean multipleTests = false;
+
/**
* Constructor for fork=true or when the user hasn't specified a
* classpath.
@@ -478,6 +482,11 @@
System.exit(ERRORS);
}
+ if (args[0].startsWith("testsfile=")) {
+ multipleTests = true;
+ args[0] = args[0].substring(10 /* "testsfile=".length() */);
+ }
+
for (int i = 1; i < args.length; i++) {
if (args[i].startsWith("haltOnError=")) {
haltError = Project.toBoolean(args[i].substring(12));
@@ -502,30 +511,70 @@
}
}
- JUnitTest t = new JUnitTest(args[0]);
-
// Add/overlay system properties on the properties from the Ant
project
Hashtable p = System.getProperties();
for (Enumeration e = p.keys(); e.hasMoreElements();) {
Object key = e.nextElement();
props.put(key, p.get(key));
}
- t.setProperties(props);
- JUnitTestRunner runner = new JUnitTestRunner(t, haltError,
stackfilter,
- haltFail, showOut);
- runner.forked = true;
- transferFormatters(runner);
- runner.run();
- System.exit(runner.getRetCode());
+ int returnCode = SUCCESS;
+ if (multipleTests) {
+ try {
+ java.io.BufferedReader reader =
+ new java.io.BufferedReader(new
java.io.FileReader(args[0]));
+ String testCaseName;
+ int code = 0;
+ boolean errorOccured = false;
+ boolean failureOccured = false;
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ StringTokenizer st = new StringTokenizer(line, ",");
+ testCaseName = st.nextToken();
+ JUnitTest t = new JUnitTest(testCaseName);
+ t.setTodir(new File(st.nextToken()));
+ t.setOutfile(st.nextToken());
+ code = launch(t, haltError, stackfilter, haltFail,
+ showOut, props);
+ errorOccured = (code == ERRORS);
+ failureOccured = (code != SUCCESS);
+ if (errorOccured || failureOccured ) {
+ if ((errorOccured && haltError)
+ || (failureOccured && haltFail)) {
+ System.exit(code);
+ } else {
+ if (code > returnCode) {
+ returnCode = code;
+ }
+ System.out.println("TEST " + t.getName()
+ + " FAILED");
+ }
+ }
+ }
+ } catch(IOException e) {
+ e.printStackTrace();
+ }
+ } else {
+ returnCode = launch(new JUnitTest(args[0]), haltError,
+ stackfilter, haltFail, showOut, props);
+ }
+
+ System.exit(returnCode);
}
private static Vector fromCmdLine = new Vector();
- private static void transferFormatters(JUnitTestRunner runner) {
+ private static void transferFormatters(JUnitTestRunner runner,
+ JUnitTest test) {
for (int i = 0; i < fromCmdLine.size(); i++) {
- runner.addFormatter((JUnitResultFormatter) fromCmdLine
- .elementAt(i));
+ FormatterElement fe = (FormatterElement)
fromCmdLine.elementAt(i);
+ if (multipleTests && fe.getUseFile()) {
+ File destFile =
+ new File(test.getTodir(),
+ test.getOutfile() + fe.getExtension());
+ fe.setOutfile(destFile);
+ }
+ runner.addFormatter(fe.createFormatter());
}
}
@@ -538,17 +587,20 @@
int pos = line.indexOf(',');
if (pos == -1) {
fe.setClassname(line);
+ fe.setUseFile(false);
} else {
fe.setClassname(line.substring(0, pos));
- fe.setOutfile(new File(line.substring(pos + 1)));
+ fe.setUseFile(true);
+ if (!multipleTests) {
+ fe.setOutfile(new File(line.substring(pos + 1)));
+ }
}
- fromCmdLine.addElement(fe.createFormatter());
+ fromCmdLine.addElement(fe);
}
/**
* Returns a filtered stack trace.
* This is ripped out of junit.runner.BaseTestRunner.
- * Scott M. Stirling.
*/
public static String getFilteredTrace(Throwable t) {
String trace = StringUtils.getStackTrace(t);
@@ -589,4 +641,19 @@
return false;
}
+ /**
+ * @since Ant 1.6.2
+ */
+ private static int launch(JUnitTest t, boolean haltError,
+ boolean stackfilter, boolean haltFail,
+ boolean showOut, Properties props) {
+ t.setProperties(props);
+ JUnitTestRunner runner =
+ new JUnitTestRunner(t, haltError, stackfilter, haltFail,
showOut);
+ runner.forked = true;
+ transferFormatters(runner, t);
+
+ runner.run();
+ return runner.getRetCode();
+ }
} // JUnitTestRunner
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]