antoine 2003/06/20 09:29:54
Modified: src/main/org/apache/tools/ant/taskdefs/optional/junit
JUnitTask.java
docs/manual/OptionalTasks junit.html
. WHATSNEW
Log:
Allow JUnit to reuse the same classloader when fork is set to false
Submitted by: michael_beauregard at transcanada dot com
Revision Changes Path
1.68 +40 -32
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.67
retrieving revision 1.68
diff -u -r1.67 -r1.68
--- JUnitTask.java 28 May 2003 13:12:03 -0000 1.67
+++ JUnitTask.java 20 Jun 2003 16:29:52 -0000 1.68
@@ -166,6 +166,7 @@
private Integer timeout = null;
private boolean summary = false;
+ private boolean reloading = true;
private String summaryValue = "";
private JUnitTestRunner runner = null;
@@ -177,6 +178,15 @@
private boolean showOutput = false;
private File tmpDir;
+ private AntClassLoader classLoader = null;
+ /**
+ * 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;
+ }
/**
* If true, smartly filter the stack frames of
@@ -846,17 +856,17 @@
if (sysProperties != null) {
sysProperties.setSystem();
}
- AntClassLoader cl = null;
+
try {
log("Using System properties " + System.getProperties(),
Project.MSG_VERBOSE);
- cl = createClassLoader();
- if (cl != null) {
- cl.setThreadContextLoader();
+ createClassLoader();
+ if (classLoader != null) {
+ classLoader.setThreadContextLoader();
}
runner = new JUnitTestRunner(test, test.getHaltonerror(),
test.getFiltertrace(),
- test.getHaltonfailure(), cl);
+ test.getHaltonfailure(),
classLoader);
if (summary) {
log("Running " + test.getName(), Project.MSG_INFO);
@@ -878,7 +888,7 @@
} else {
fe.setOutput(getDefaultOutput());
}
- runner.addFormatter(fe.createFormatter(cl));
+ runner.addFormatter(fe.createFormatter(classLoader));
}
}
@@ -888,8 +898,8 @@
if (sysProperties != null) {
sysProperties.restoreSystem();
}
- if (cl != null) {
- cl.resetThreadContextLoader();
+ if (classLoader != null) {
+ classLoader.resetThreadContextLoader();
}
}
}
@@ -1012,11 +1022,11 @@
*/
private void logTimeout(FormatterElement[] feArray, JUnitTest test) {
- AntClassLoader cl = createClassLoader();
+ createClassLoader();
for (int i = 0; i < feArray.length; i++) {
FormatterElement fe = feArray[i];
File outFile = getOutput(fe, test);
- JUnitResultFormatter formatter = fe.createFormatter(cl);
+ JUnitResultFormatter formatter = fe.createFormatter(classLoader);
if (outFile != null && formatter != null) {
try {
OutputStream out = new FileOutputStream(outFile);
@@ -1044,31 +1054,29 @@
* Creates and configures an AntClassLoader instance from the
* nested classpath element.
*
- * @return null if there is no user-specified classpath.
- *
* @since Ant 1.6
*/
- private AntClassLoader createClassLoader() {
- AntClassLoader cl = null;
+ private void createClassLoader() {
Path userClasspath = commandline.getClasspath();
if (userClasspath != null) {
- Path classpath = (Path) userClasspath.clone();
- if (includeAntRuntime) {
- log("Implicitly adding " + antRuntimeClasses
- + " to CLASSPATH", Project.MSG_VERBOSE);
- classpath.append(antRuntimeClasses);
- }
-
- cl = getProject().createClassLoader(classpath);
- cl.setParentFirst(false);
- cl.addJavaLibraries();
- log("Using CLASSPATH " + cl.getClasspath(), Project.MSG_VERBOSE);
-
- // make sure the test will be accepted as a TestCase
- cl.addSystemPackageRoot("junit");
- // will cause trouble in JDK 1.1 if omitted
- cl.addSystemPackageRoot("org.apache.tools.ant");
+ if (reloading || classLoader == null) {
+ Path classpath = (Path) userClasspath.clone();
+ if (includeAntRuntime) {
+ log("Implicitly adding " + antRuntimeClasses
+ + " to CLASSPATH", Project.MSG_VERBOSE);
+ classpath.append(antRuntimeClasses);
+ }
+ classLoader = getProject().createClassLoader(classpath);
+ log("Using CLASSPATH " + classLoader.getClasspath(),
+ Project.MSG_VERBOSE);
+ classLoader.setParentFirst(false);
+ classLoader.addJavaLibraries();
+ log("Using CLASSPATH " + classLoader.getClasspath(),
Project.MSG_VERBOSE);
+ // make sure the test will be accepted as a TestCase
+ classLoader.addSystemPackageRoot("junit");
+ // will cause trouble in JDK 1.1 if omitted
+ classLoader.addSystemPackageRoot("org.apache.tools.ant");
+ }
}
- return cl;
}
}
1.28 +7 -0 ant/docs/manual/OptionalTasks/junit.html
Index: junit.html
===================================================================
RCS file: /home/cvs/ant/docs/manual/OptionalTasks/junit.html,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -r1.27 -r1.28
--- junit.html 28 May 2003 13:12:03 -0000 1.27
+++ junit.html 20 Jun 2003 16:29:53 -0000 1.28
@@ -149,6 +149,13 @@
<td align="center" valign="top">No; default is the project's base
directory.</td>
</tr>
+ <tr>
+ <td valign="top">reloading</td>
+ <td valign="top">Whether or not a new classloader should be instantiated
for each test case.<br/>
+ Ignore if <code>fork</code> is set to true.
+ <em>Since Ant 1.6</em>.</td>
+ <td align="center" valign="top">No; default is <code>true</code>.</td>
+ </tr>
</table>
<p>By using the <code>errorproperty</code> and <code>failureproperty</code>
1.440 +3 -0 ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/ant/WHATSNEW,v
retrieving revision 1.439
retrieving revision 1.440
diff -u -r1.439 -r1.440
--- WHATSNEW 20 Jun 2003 11:09:35 -0000 1.439
+++ WHATSNEW 20 Jun 2003 16:29:53 -0000 1.440
@@ -297,6 +297,9 @@
* The xml formatter for JUnit will now honor test case names set with
setName. Bugzilla Report 17040.
+* JUnit now has an attribute reloading, which, when set to false,
+ makes the task reuse the same class loader for a series of tests.
+
* <concat> now supports filtering and can check timestamps before
overriding a file. Bugzilla Report 18166.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]