Submitted by: Erik Hatcher <erik@hatcher.net> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269314 13f79535-47bb-0310-9956-ffa450edef68master
@@ -68,12 +68,15 @@ 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; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.io.OutputStream; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.Properties; | |||
import java.util.Random; | |||
import java.util.Vector; | |||
/** | |||
@@ -90,6 +93,7 @@ import java.util.Vector; | |||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
* @author <a href="mailto:sbailliez@imediation.com">Stephane Bailliez</a> | |||
* @author <a href="mailto:Gerrit.Riessen@web.de">Gerrit Riessen</a> - | |||
* @author <a href="mailto:erik@hatcher.net">Erik Hatcher</a> | |||
*/ | |||
public class JUnitTask extends Task { | |||
@@ -363,6 +367,23 @@ public class JUnitTask extends Task { | |||
formatterArg.setLength(0); | |||
} | |||
// Create a temporary file to pass the Ant properties to the forked test | |||
File propsFile = new File("junit" + (new Random(System.currentTimeMillis())).nextLong() + ".properties"); | |||
cmd.createArgument().setValue("propsfile=" + propsFile.getAbsolutePath()); | |||
Hashtable p = project.getProperties(); | |||
Properties props = new Properties(); | |||
for (Enumeration enum = p.keys(); enum.hasMoreElements(); ) { | |||
Object key = enum.nextElement(); | |||
props.put(key, p.get(key)); | |||
} | |||
try { | |||
FileOutputStream outstream = new FileOutputStream(propsFile); | |||
props.save(outstream,"Ant JUnitTask generated properties file"); | |||
outstream.close(); | |||
} catch (java.io.IOException e) { | |||
throw new BuildException("Error creating temporary properties file.", e, location); | |||
} | |||
Execute execute = new Execute(new LogStreamHandler(this, Project.MSG_INFO, Project.MSG_WARN), watchdog); | |||
execute.setCommandline(cmd.getCommandline()); | |||
if (dir != null) { | |||
@@ -371,11 +392,16 @@ public class JUnitTask extends Task { | |||
} | |||
log("Executing: "+cmd.toString(), Project.MSG_VERBOSE); | |||
int retVal; | |||
try { | |||
return execute.execute(); | |||
retVal = execute.execute(); | |||
} catch (IOException e) { | |||
throw new BuildException("Process fork failed.", e, location); | |||
} finally { | |||
if (! propsFile.delete()) throw new BuildException("Could not delete temporary properties file."); | |||
} | |||
return retVal; | |||
} | |||
// in VM is not very nice since it could probably hang the | |||
@@ -386,6 +412,7 @@ public class JUnitTask extends Task { | |||
* Execute inside VM. | |||
*/ | |||
private int executeInVM(JUnitTest test) throws BuildException { | |||
test.setProperties(project.getProperties()); | |||
if (dir != null) { | |||
log("dir attribute ignored if running in the same VM", Project.MSG_WARN); | |||
} | |||
@@ -58,6 +58,9 @@ import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.types.Commandline; | |||
import java.io.File; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.Properties; | |||
import java.util.Vector; | |||
/** | |||
@@ -80,6 +83,9 @@ public class JUnitTest extends BaseTest { | |||
private long runs, failures, errors; | |||
private long runTime; | |||
// Snapshot of the system properties | |||
private Properties props = null; | |||
public JUnitTest() { | |||
} | |||
@@ -127,6 +133,15 @@ public class JUnitTest extends BaseTest { | |||
public long errorCount() {return errors;} | |||
public long getRunTime() {return runTime;} | |||
public Properties getProperties() { return props;} | |||
public void setProperties(Hashtable p) { | |||
props = new Properties(); | |||
for (Enumeration enum = p.keys(); enum.hasMoreElements(); ) { | |||
Object key = enum.nextElement(); | |||
props.put(key, p.get(key)); | |||
} | |||
} | |||
public boolean shouldRun(Project p) { | |||
if (ifProperty != null && p.getProperty(ifProperty) == null) { | |||
return false; | |||
@@ -134,6 +149,7 @@ public class JUnitTest extends BaseTest { | |||
p.getProperty(unlessProperty) != null) { | |||
return false; | |||
} | |||
return true; | |||
} | |||
@@ -59,6 +59,9 @@ import org.apache.tools.ant.*; | |||
import junit.framework.*; | |||
import java.lang.reflect.*; | |||
import java.io.*; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.Properties; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
@@ -75,6 +78,7 @@ import java.util.Vector; | |||
* <p>Summary output is generated at the end. | |||
* | |||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
* @author <a href="mailto:erik@hatcher.net">Erik Hatcher</a> | |||
*/ | |||
public class JUnitTestRunner implements TestListener { | |||
@@ -346,6 +350,7 @@ public class JUnitTestRunner implements TestListener { | |||
boolean exitAtEnd = true; | |||
boolean haltError = false; | |||
boolean haltFail = false; | |||
Properties props = new Properties(); | |||
if (args.length == 0) { | |||
System.err.println("required argument TestClassName missing"); | |||
@@ -364,10 +369,23 @@ public class JUnitTestRunner implements TestListener { | |||
System.err.println(be.getMessage()); | |||
System.exit(ERRORS); | |||
} | |||
} else if (args[i].startsWith("propsfile=")) { | |||
FileInputStream in = new FileInputStream(args[i].substring(10)); | |||
props.load(in); | |||
in.close(); | |||
} | |||
} | |||
JUnitTest t = new JUnitTest(args[0]); | |||
// Add/overlay system properties on the properties from the Ant project | |||
Hashtable p = System.getProperties(); | |||
for (Enumeration enum = p.keys(); enum.hasMoreElements(); ) { | |||
Object key = enum.nextElement(); | |||
props.put(key, p.get(key)); | |||
} | |||
t.setProperties(props); | |||
JUnitTestRunner runner = new JUnitTestRunner(t, haltError, haltFail); | |||
transferFormatters(runner); | |||
runner.run(); | |||
@@ -89,7 +89,7 @@ public interface XMLConstants { | |||
/** package attribute for the aggregate document */ | |||
public final static String ATTR_PACKAGE = "package"; | |||
/** name attribute for testcase and testsuite elements */ | |||
/** name attribute for property, testcase and testsuite elements */ | |||
public final static String ATTR_NAME = "name"; | |||
/** time attribute for testcase and testsuite elements */ | |||
@@ -109,4 +109,14 @@ public interface XMLConstants { | |||
/** message attribute for failure elements */ | |||
public final static String ATTR_MESSAGE = "message"; | |||
/** the properties element */ | |||
public final static String PROPERTIES = "properties"; | |||
/** the property element */ | |||
public final static String PROPERTY = "property"; | |||
/** value attribute for property elements */ | |||
public final static String ATTR_VALUE = "value"; | |||
} |
@@ -72,6 +72,7 @@ import junit.framework.TestCase; | |||
* Prints XML output of the test to a specified Writer. | |||
* | |||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
* @author <a href="mailto:erik@hatcher.net">Erik Hatcher</a> | |||
*/ | |||
public class XMLJUnitResultFormatter implements JUnitResultFormatter, XMLConstants { | |||
@@ -132,6 +133,21 @@ public class XMLJUnitResultFormatter implements JUnitResultFormatter, XMLConstan | |||
doc = getDocumentBuilder().newDocument(); | |||
rootElement = doc.createElement(TESTSUITE); | |||
rootElement.setAttribute(ATTR_NAME, suite.getName()); | |||
// Output properties | |||
Element propsElement = doc.createElement(PROPERTIES); | |||
rootElement.appendChild(propsElement); | |||
Properties props = suite.getProperties(); | |||
if (props != null) { | |||
Enumeration e = props.propertyNames(); | |||
while (e.hasMoreElements()) { | |||
String name = (String) e.nextElement(); | |||
Element propElement = doc.createElement(PROPERTY); | |||
propElement.setAttribute(ATTR_NAME, name); | |||
propElement.setAttribute(ATTR_VALUE, props.getProperty(name)); | |||
propsElement.appendChild(propElement); | |||
} | |||
} | |||
} | |||
/** | |||