in the accessors. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271125 13f79535-47bb-0310-9956-ffa450edef68master
@@ -54,9 +54,9 @@ | |||||
package org.apache.tools.ant.taskdefs.optional.rjunit; | package org.apache.tools.ant.taskdefs.optional.rjunit; | ||||
import java.io.File; | import java.io.File; | ||||
import java.util.ArrayList; | |||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
import java.util.Hashtable; | import java.util.Hashtable; | ||||
import java.util.Vector; | |||||
import junit.runner.TestCollector; | import junit.runner.TestCollector; | ||||
@@ -90,7 +90,7 @@ public final class ClasspathTestCollector extends ProjectComponent | |||||
String[] paths = path.list(); | String[] paths = path.list(); | ||||
for (int i = paths.length - 1; i >= 0; i--) { | for (int i = paths.length - 1; i >= 0; i--) { | ||||
File f = new File(paths[i]); | File f = new File(paths[i]); | ||||
Vector included = null; | |||||
ArrayList included = null; | |||||
if (f.isDirectory()) { | if (f.isDirectory()) { | ||||
included = gatherFromDirectory(f); | included = gatherFromDirectory(f); | ||||
} else if (f.getName().endsWith(".zip") | } else if (f.getName().endsWith(".zip") | ||||
@@ -103,16 +103,22 @@ public final class ClasspathTestCollector extends ProjectComponent | |||||
final int includedCount = included.size(); | final int includedCount = included.size(); | ||||
log("Adding " + includedCount + " testcases from " + f, Project.MSG_VERBOSE); | log("Adding " + includedCount + " testcases from " + f, Project.MSG_VERBOSE); | ||||
for (int j = 0; j < includedCount; j++) { | for (int j = 0; j < includedCount; j++) { | ||||
String testname = (String) included.elementAt(j); | |||||
String testname = (String) included.get(j); | |||||
collected.put(testname, ""); | collected.put(testname, ""); | ||||
} | } | ||||
} | } | ||||
log("Collected " + collected.size() + " testcases from " + paths.length + " paths."); | |||||
log("Collected " + collected.size() + " testcases from " + paths.length + " path(s).", Project.MSG_VERBOSE); | |||||
return collected.keys(); | return collected.keys(); | ||||
} | } | ||||
protected Vector gatherFromDirectory(File dir) { | |||||
/** | |||||
* Return the list of classnames from a directory that match | |||||
* the specified patterns. | |||||
* @param dir the base directory (must also be the base package) | |||||
* @return the list of classnames matching the pattern. | |||||
*/ | |||||
protected ArrayList gatherFromDirectory(File dir) { | |||||
Project project = getProject(); | Project project = getProject(); | ||||
DirectoryScanner ds = new DirectoryScanner(); | DirectoryScanner ds = new DirectoryScanner(); | ||||
ds.setBasedir(dir); | ds.setBasedir(dir); | ||||
@@ -123,7 +129,13 @@ public final class ClasspathTestCollector extends ProjectComponent | |||||
return testClassNameFromFile(included); | return testClassNameFromFile(included); | ||||
} | } | ||||
protected Vector gatherFromArchive(File zip) { | |||||
/** | |||||
* Return the list of classnames from a zipfile that match | |||||
* the specified patterns. | |||||
* @param zip the zipfile (must also be the base package) | |||||
* @return the list of classnames matching the pattern. | |||||
*/ | |||||
protected ArrayList gatherFromArchive(File zip) { | |||||
ZipScanner zs = new ZipScanner(); | ZipScanner zs = new ZipScanner(); | ||||
zs.setBasedir(zip); | zs.setBasedir(zip); | ||||
zs.setIncludes(patterns.getIncludePatterns(project)); | zs.setIncludes(patterns.getIncludePatterns(project)); | ||||
@@ -133,13 +145,17 @@ public final class ClasspathTestCollector extends ProjectComponent | |||||
return testClassNameFromFile(included); | return testClassNameFromFile(included); | ||||
} | } | ||||
protected Vector testClassNameFromFile(String[] classFileNames) { | |||||
Vector tests = new Vector(classFileNames.length); | |||||
/** | |||||
* transform a set of file into their matching classname | |||||
* @todo what about using a mapper for this ? | |||||
*/ | |||||
protected ArrayList testClassNameFromFile(String[] classFileNames) { | |||||
ArrayList tests = new ArrayList(classFileNames.length); | |||||
for (int i = 0; i < classFileNames.length; i++) { | for (int i = 0; i < classFileNames.length; i++) { | ||||
String file = classFileNames[i]; | String file = classFileNames[i]; | ||||
if (isTestClass(file)) { | if (isTestClass(file)) { | ||||
String classname = classNameFromFile(file); | String classname = classNameFromFile(file); | ||||
tests.addElement(classname); | |||||
tests.add(classname); | |||||
} | } | ||||
} | } | ||||
return tests; | return tests; | ||||
@@ -165,7 +181,7 @@ public final class ClasspathTestCollector extends ProjectComponent | |||||
this.path = path; | this.path = path; | ||||
} | } | ||||
public Path getPath(){ | |||||
public Path getPath() { | |||||
return this.path; | return this.path; | ||||
} | } | ||||
@@ -54,14 +54,14 @@ | |||||
package org.apache.tools.ant.taskdefs.optional.rjunit; | package org.apache.tools.ant.taskdefs.optional.rjunit; | ||||
import java.io.BufferedOutputStream; | import java.io.BufferedOutputStream; | ||||
import java.io.ByteArrayOutputStream; | |||||
import java.io.File; | import java.io.File; | ||||
import java.io.FileOutputStream; | import java.io.FileOutputStream; | ||||
import java.io.IOException; | import java.io.IOException; | ||||
import java.io.OutputStream; | import java.io.OutputStream; | ||||
import java.io.ByteArrayOutputStream; | |||||
import java.util.ArrayList; | |||||
import java.util.Enumeration; | import java.util.Enumeration; | ||||
import java.util.Properties; | import java.util.Properties; | ||||
import java.util.Vector; | |||||
import junit.runner.TestCollector; | import junit.runner.TestCollector; | ||||
@@ -100,7 +100,7 @@ public final class ClientElement extends ProjectComponent { | |||||
private String host = "127.0.0.1"; | private String host = "127.0.0.1"; | ||||
/** test collector elements */ | /** test collector elements */ | ||||
private Vector testCollectors = new Vector(); | |||||
private ArrayList testCollectors = new ArrayList(); | |||||
/** the command line to launch the TestRunner */ | /** the command line to launch the TestRunner */ | ||||
private CommandlineJava cmd = new CommandlineJava(); | private CommandlineJava cmd = new CommandlineJava(); | ||||
@@ -108,6 +108,9 @@ public final class ClientElement extends ProjectComponent { | |||||
/** the parent task */ | /** the parent task */ | ||||
private RJUnitTask parent; | private RJUnitTask parent; | ||||
/** help debug the TestRunner */ | |||||
private boolean debug = false; | |||||
/** create a new client */ | /** create a new client */ | ||||
public ClientElement(RJUnitTask value) { | public ClientElement(RJUnitTask value) { | ||||
parent = value; | parent = value; | ||||
@@ -133,7 +136,7 @@ public final class ClientElement extends ProjectComponent { | |||||
protected void doExecute() throws BuildException { | protected void doExecute() throws BuildException { | ||||
File tmp = configureTestRunner(); | File tmp = configureTestRunner(); | ||||
Execute execute = new Execute(new LogStreamHandler(parent, Project.MSG_INFO, Project.MSG_WARN)); | |||||
Execute execute = new Execute(new LogStreamHandler(parent, Project.MSG_VERBOSE, Project.MSG_VERBOSE)); | |||||
execute.setCommandline(cmd.getCommandline()); | execute.setCommandline(cmd.getCommandline()); | ||||
execute.setAntRun(project); | execute.setAntRun(project); | ||||
@@ -141,7 +144,7 @@ public final class ClientElement extends ProjectComponent { | |||||
int retVal = 0; | int retVal = 0; | ||||
try { | try { | ||||
retVal = execute.execute(); | retVal = execute.execute(); | ||||
if (retVal != 0){ | |||||
if (retVal != 0) { | |||||
throw new BuildException("task.process-failed.error"); | throw new BuildException("task.process-failed.error"); | ||||
} | } | ||||
} catch (IOException e) { | } catch (IOException e) { | ||||
@@ -162,14 +165,7 @@ public final class ClientElement extends ProjectComponent { | |||||
protected Enumeration collectTests() { | protected Enumeration collectTests() { | ||||
Enumeration[] tests = new Enumeration[testCollectors.size()]; | Enumeration[] tests = new Enumeration[testCollectors.size()]; | ||||
for (int i = 0; i < testCollectors.size(); i++) { | for (int i = 0; i < testCollectors.size(); i++) { | ||||
TestCollector te = (TestCollector) testCollectors.elementAt(i); | |||||
//@fixme I'm forced to append the classpath from batchtests | |||||
// here to make sure it will be included as part of the | |||||
// testrunner classpath. Need a better design ? | |||||
if (te instanceof BatchTestElement){ | |||||
Path path = ((BatchTestElement)te).getPath(); | |||||
cmd.getClasspath().append(path); | |||||
} | |||||
TestCollector te = (TestCollector) testCollectors.get(i); | |||||
tests[i] = te.collectTests(); | tests[i] = te.collectTests(); | ||||
} | } | ||||
return new CompoundEnumeration(tests); | return new CompoundEnumeration(tests); | ||||
@@ -182,8 +178,8 @@ public final class ClientElement extends ProjectComponent { | |||||
*/ | */ | ||||
protected File configureTestRunner() throws BuildException { | protected File configureTestRunner() throws BuildException { | ||||
Properties props = new Properties(); | Properties props = new Properties(); | ||||
props.setProperty("debug", "true"); | |||||
props.setProperty("host", "127.0.0.1"); | |||||
props.setProperty("debug", String.valueOf(debug)); | |||||
props.setProperty("host", host); | |||||
props.setProperty("port", String.valueOf(port)); | props.setProperty("port", String.valueOf(port)); | ||||
// get all test classes to run... | // get all test classes to run... | ||||
StringBuffer buf = new StringBuffer(10240); | StringBuffer buf = new StringBuffer(10240); | ||||
@@ -233,6 +229,11 @@ public final class ClientElement extends ProjectComponent { | |||||
host = value; | host = value; | ||||
} | } | ||||
/** set debug mode for the runner. it will log a file to working dir */ | |||||
public void setDebug(boolean flag) { | |||||
debug = flag; | |||||
} | |||||
/** Create a new JVM argument. */ | /** Create a new JVM argument. */ | ||||
public Commandline.Argument createJvmarg() { | public Commandline.Argument createJvmarg() { | ||||
return cmd.createVmArgument(); | return cmd.createVmArgument(); | ||||
@@ -244,14 +245,16 @@ public final class ClientElement extends ProjectComponent { | |||||
} | } | ||||
/** add a single test element */ | /** add a single test element */ | ||||
public void addTest(TestElement value) { | |||||
testCollectors.addElement(value); | |||||
public void addConfiguredTest(TestElement value) { | |||||
testCollectors.add(value); | |||||
} | } | ||||
/** add a batch test element */ | /** add a batch test element */ | ||||
public void addBatchTest(BatchTestElement value) { | |||||
testCollectors.addElement(value); | |||||
public void addConfiguredBatchTest(BatchTestElement value) { | |||||
// add the classpath of batchtest to cmd classpath | |||||
Path path = value.getPath(); | |||||
cmd.getClasspath().append(path); | |||||
testCollectors.add(value); | |||||
} | } | ||||
} | } |
@@ -89,44 +89,44 @@ import java.util.NoSuchElementException; | |||||
*/ | */ | ||||
public class CompoundEnumeration implements Enumeration { | public class CompoundEnumeration implements Enumeration { | ||||
/** enumeration array */ | |||||
private Enumeration[] enumArray; | |||||
/** enumeration array */ | |||||
private Enumeration[] enumArray; | |||||
/** index in the enums array */ | |||||
private int index = 0; | |||||
/** index in the enums array */ | |||||
private int index = 0; | |||||
public CompoundEnumeration(Enumeration[] enumarray) { | public CompoundEnumeration(Enumeration[] enumarray) { | ||||
this.enumArray = enumarray; | |||||
this.enumArray = enumarray; | |||||
} | } | ||||
/** | |||||
* Tests if this enumeration contains more elements. | |||||
* | |||||
* @return <code>true</code> if and only if this enumeration object | |||||
* contains at least one more element to provide; | |||||
* <code>false</code> otherwise. | |||||
*/ | |||||
/** | |||||
* Tests if this enumeration contains more elements. | |||||
* | |||||
* @return <code>true</code> if and only if this enumeration object | |||||
* contains at least one more element to provide; | |||||
* <code>false</code> otherwise. | |||||
*/ | |||||
public boolean hasMoreElements() { | public boolean hasMoreElements() { | ||||
while (index < enumArray.length) { | |||||
if (enumArray[index] != null && enumArray[index].hasMoreElements()) { | |||||
return true; | |||||
} | |||||
index++; | |||||
} | |||||
return false; | |||||
while (index < enumArray.length) { | |||||
if (enumArray[index] != null && enumArray[index].hasMoreElements()) { | |||||
return true; | |||||
} | |||||
index++; | |||||
} | |||||
return false; | |||||
} | } | ||||
/** | |||||
* Returns the next element of this enumeration if this enumeration | |||||
* object has at least one more element to provide. | |||||
* | |||||
* @return the next element of this enumeration. | |||||
* @throws NoSuchElementException if no more elements exist. | |||||
*/ | |||||
/** | |||||
* Returns the next element of this enumeration if this enumeration | |||||
* object has at least one more element to provide. | |||||
* | |||||
* @return the next element of this enumeration. | |||||
* @throws NoSuchElementException if no more elements exist. | |||||
*/ | |||||
public Object nextElement() throws NoSuchElementException { | public Object nextElement() throws NoSuchElementException { | ||||
if ( hasMoreElements() ) { | |||||
return enumArray[index].nextElement(); | |||||
} | |||||
throw new NoSuchElementException(); | |||||
if (hasMoreElements()) { | |||||
return enumArray[index].nextElement(); | |||||
} | |||||
throw new NoSuchElementException(); | |||||
} | } | ||||
} | } |
@@ -55,10 +55,12 @@ package org.apache.tools.ant.taskdefs.optional.rjunit; | |||||
import java.io.File; | import java.io.File; | ||||
import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
import java.lang.reflect.Modifier; | |||||
import java.net.URL; | import java.net.URL; | ||||
import junit.framework.Test; | import junit.framework.Test; | ||||
import junit.framework.TestSuite; | import junit.framework.TestSuite; | ||||
import junit.framework.TestCase; | |||||
import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
@@ -75,14 +77,24 @@ public final class JUnitHelper { | |||||
* This method parse the output of the method <tt>toString()</tt> | * This method parse the output of the method <tt>toString()</tt> | ||||
* from the <tt>TestCase</tt> class. The format returned is: | * from the <tt>TestCase</tt> class. The format returned is: | ||||
* <tt>name(classname)</tt> | * <tt>name(classname)</tt> | ||||
* @return an array with the elements in the order name, classname. | |||||
* @return the string corresponding to name. | |||||
*/ | */ | ||||
public static String[] parseTestString(String testname) { | |||||
int p1 = testname.indexOf('('); | |||||
int p2 = testname.indexOf(')', p1); | |||||
return new String[]{ | |||||
testname.substring(0, p1), | |||||
testname.substring(p1 + 1, p2)}; | |||||
public static String getTestName(String text){ | |||||
int p1 = text.indexOf('('); | |||||
int p2 = text.indexOf(')', p1); | |||||
return text.substring(0, p1); | |||||
} | |||||
/** | |||||
* This method parse the output of the method <tt>toString()</tt> | |||||
* from the <tt>TestCase</tt> class. The format returned is: | |||||
* <tt>name(classname)</tt> | |||||
* @return the string corresponding to classname. | |||||
*/ | |||||
public static String getSuiteName(String text){ | |||||
int p1 = text.indexOf('('); | |||||
int p2 = text.indexOf(')', p1); | |||||
return text.substring(p1 + 1, p2); | |||||
} | } | ||||
/** | /** | ||||
@@ -122,6 +134,14 @@ public final class JUnitHelper { | |||||
return (Test) suiteMethod.invoke(null, new Class[0]); | return (Test) suiteMethod.invoke(null, new Class[0]); | ||||
} catch (Exception e) { | } catch (Exception e) { | ||||
} | } | ||||
// check if it is really a valid testcase | |||||
int modifiers = clazz.getModifiers(); | |||||
if ( !Modifier.isPublic(modifiers) || | |||||
Modifier.isAbstract(modifiers) || | |||||
!TestCase.class.isAssignableFrom(clazz)) { | |||||
return null; | |||||
} | |||||
// try to extract a test suite automatically | // try to extract a test suite automatically | ||||
// this will generate warnings if the class is no suitable Test | // this will generate warnings if the class is no suitable Test | ||||
try { | try { | ||||
@@ -158,9 +158,9 @@ public class RJUnitTask extends Task { | |||||
public void run() { | public void run() { | ||||
try { | try { | ||||
server.execute(); | server.execute(); | ||||
System.out.println("PANIC !!!!!!"); | |||||
} catch (Exception e) { | } catch (Exception e) { | ||||
caught = e; | caught = e; | ||||
e.printStackTrace(); | |||||
} | } | ||||
} | } | ||||
@@ -53,8 +53,8 @@ | |||||
*/ | */ | ||||
package org.apache.tools.ant.taskdefs.optional.rjunit; | package org.apache.tools.ant.taskdefs.optional.rjunit; | ||||
import java.util.Enumeration; | |||||
import java.util.Vector; | |||||
import java.io.IOException; | |||||
import java.util.ArrayList; | |||||
import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
import org.apache.tools.ant.ProjectComponent; | import org.apache.tools.ant.ProjectComponent; | ||||
@@ -76,7 +76,7 @@ import org.apache.tools.ant.taskdefs.optional.rjunit.remote.Server; | |||||
public final class ServerElement extends ProjectComponent { | public final class ServerElement extends ProjectComponent { | ||||
/** formatters that write the tests results */ | /** formatters that write the tests results */ | ||||
private Vector formatterElements = new Vector(); | |||||
private ArrayList formatters = new ArrayList(); | |||||
/** port to run the server on. Default to 6666 */ | /** port to run the server on. Default to 6666 */ | ||||
private int port = 6666; | private int port = 6666; | ||||
@@ -101,17 +101,17 @@ public final class ServerElement extends ProjectComponent { | |||||
public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
// configure the server... | // configure the server... | ||||
server = new Server(port); | server = new Server(port); | ||||
Enumeration listeners = formatterElements.elements(); | |||||
while (listeners.hasMoreElements()) { | |||||
ResultFormatterElement fe = (ResultFormatterElement)listeners.nextElement(); | |||||
Formatter formatter = fe.createFormatter(); | |||||
server.addListener( formatter ); | |||||
final int formatterCount = formatters.size(); | |||||
for (int i = 0; i < formatterCount; i++) { | |||||
final Formatter f = (Formatter) formatters.get(i); | |||||
server.addListener(f); | |||||
} | } | ||||
// and run it. It will stop once a client has finished. | // and run it. It will stop once a client has finished. | ||||
try { | try { | ||||
server.start(true); | |||||
server.start(false); // do not loop | |||||
server.shutdown(); | server.shutdown(); | ||||
} catch (InterruptedException e){ | |||||
} catch (IOException e) { | |||||
throw new BuildException(e); | throw new BuildException(e); | ||||
} | } | ||||
} | } | ||||
@@ -133,7 +133,8 @@ public final class ServerElement extends ProjectComponent { | |||||
} | } | ||||
/** add a new formatter element */ | /** add a new formatter element */ | ||||
public void addFormatter(ResultFormatterElement fe) { | |||||
formatterElements.addElement(fe); | |||||
public void addConfiguredFormatter(ResultFormatterElement fe) { | |||||
Formatter formatter = fe.createFormatter(); | |||||
formatters.add(formatter); | |||||
} | } | ||||
} | } |