diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java index 4292c8287..8862d1571 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClasspathTestCollector.java @@ -54,9 +54,9 @@ package org.apache.tools.ant.taskdefs.optional.rjunit; import java.io.File; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; -import java.util.Vector; import junit.runner.TestCollector; @@ -90,7 +90,7 @@ public final class ClasspathTestCollector extends ProjectComponent String[] paths = path.list(); for (int i = paths.length - 1; i >= 0; i--) { File f = new File(paths[i]); - Vector included = null; + ArrayList included = null; if (f.isDirectory()) { included = gatherFromDirectory(f); } else if (f.getName().endsWith(".zip") @@ -103,16 +103,22 @@ public final class ClasspathTestCollector extends ProjectComponent final int includedCount = included.size(); log("Adding " + includedCount + " testcases from " + f, Project.MSG_VERBOSE); for (int j = 0; j < includedCount; j++) { - String testname = (String) included.elementAt(j); + String testname = (String) included.get(j); 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(); } - 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(); DirectoryScanner ds = new DirectoryScanner(); ds.setBasedir(dir); @@ -123,7 +129,13 @@ public final class ClasspathTestCollector extends ProjectComponent 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(); zs.setBasedir(zip); zs.setIncludes(patterns.getIncludePatterns(project)); @@ -133,13 +145,17 @@ public final class ClasspathTestCollector extends ProjectComponent 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++) { String file = classFileNames[i]; if (isTestClass(file)) { String classname = classNameFromFile(file); - tests.addElement(classname); + tests.add(classname); } } return tests; @@ -165,7 +181,7 @@ public final class ClasspathTestCollector extends ProjectComponent this.path = path; } - public Path getPath(){ + public Path getPath() { return this.path; } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java index f89a154df..132a6de8c 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ClientElement.java @@ -54,14 +54,14 @@ package org.apache.tools.ant.taskdefs.optional.rjunit; import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.io.ByteArrayOutputStream; +import java.util.ArrayList; import java.util.Enumeration; import java.util.Properties; -import java.util.Vector; import junit.runner.TestCollector; @@ -100,7 +100,7 @@ public final class ClientElement extends ProjectComponent { private String host = "127.0.0.1"; /** test collector elements */ - private Vector testCollectors = new Vector(); + private ArrayList testCollectors = new ArrayList(); /** the command line to launch the TestRunner */ private CommandlineJava cmd = new CommandlineJava(); @@ -108,6 +108,9 @@ public final class ClientElement extends ProjectComponent { /** the parent task */ private RJUnitTask parent; + /** help debug the TestRunner */ + private boolean debug = false; + /** create a new client */ public ClientElement(RJUnitTask value) { parent = value; @@ -133,7 +136,7 @@ public final class ClientElement extends ProjectComponent { protected void doExecute() throws BuildException { 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.setAntRun(project); @@ -141,7 +144,7 @@ public final class ClientElement extends ProjectComponent { int retVal = 0; try { retVal = execute.execute(); - if (retVal != 0){ + if (retVal != 0) { throw new BuildException("task.process-failed.error"); } } catch (IOException e) { @@ -162,14 +165,7 @@ public final class ClientElement extends ProjectComponent { protected Enumeration collectTests() { Enumeration[] tests = new Enumeration[testCollectors.size()]; 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(); } return new CompoundEnumeration(tests); @@ -182,8 +178,8 @@ public final class ClientElement extends ProjectComponent { */ protected File configureTestRunner() throws BuildException { 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)); // get all test classes to run... StringBuffer buf = new StringBuffer(10240); @@ -233,6 +229,11 @@ public final class ClientElement extends ProjectComponent { 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. */ public Commandline.Argument createJvmarg() { return cmd.createVmArgument(); @@ -244,14 +245,16 @@ public final class ClientElement extends ProjectComponent { } /** 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 */ - 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); } - } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/CompoundEnumeration.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/CompoundEnumeration.java index 85fd68740..f8515e9a0 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/CompoundEnumeration.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/CompoundEnumeration.java @@ -89,44 +89,44 @@ import java.util.NoSuchElementException; */ 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) { - this.enumArray = enumarray; + this.enumArray = enumarray; } - /** - * Tests if this enumeration contains more elements. - * - * @return true if and only if this enumeration object - * contains at least one more element to provide; - * false otherwise. - */ + /** + * Tests if this enumeration contains more elements. + * + * @return true if and only if this enumeration object + * contains at least one more element to provide; + * false otherwise. + */ 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 { - if ( hasMoreElements() ) { - return enumArray[index].nextElement(); - } - throw new NoSuchElementException(); + if (hasMoreElements()) { + return enumArray[index].nextElement(); + } + throw new NoSuchElementException(); } } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java index 8b4f3f93a..75e57001d 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/JUnitHelper.java @@ -55,10 +55,12 @@ package org.apache.tools.ant.taskdefs.optional.rjunit; import java.io.File; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.net.URL; import junit.framework.Test; import junit.framework.TestSuite; +import junit.framework.TestCase; import org.apache.tools.ant.types.Path; @@ -75,14 +77,24 @@ public final class JUnitHelper { * This method parse the output of the method toString() * from the TestCase class. The format returned is: * name(classname) - * @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 toString() + * from the TestCase class. The format returned is: + * name(classname) + * @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]); } 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 // this will generate warnings if the class is no suitable Test try { diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/RJUnitTask.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/RJUnitTask.java index 1b8e50b07..a4fd1da61 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/RJUnitTask.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/RJUnitTask.java @@ -158,9 +158,9 @@ public class RJUnitTask extends Task { public void run() { try { server.execute(); - System.out.println("PANIC !!!!!!"); } catch (Exception e) { caught = e; + e.printStackTrace(); } } diff --git a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ServerElement.java b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ServerElement.java index 59b4092fe..eaa40d4c7 100644 --- a/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ServerElement.java +++ b/proposal/sandbox/junit/src/main/org/apache/tools/ant/taskdefs/optional/rjunit/ServerElement.java @@ -53,8 +53,8 @@ */ 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.ProjectComponent; @@ -76,7 +76,7 @@ import org.apache.tools.ant.taskdefs.optional.rjunit.remote.Server; public final class ServerElement extends ProjectComponent { /** 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 */ private int port = 6666; @@ -101,17 +101,17 @@ public final class ServerElement extends ProjectComponent { public void execute() throws BuildException { // configure the server... 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. try { - server.start(true); + server.start(false); // do not loop server.shutdown(); - } catch (InterruptedException e){ + } catch (IOException e) { throw new BuildException(e); } } @@ -133,7 +133,8 @@ public final class ServerElement extends ProjectComponent { } /** 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); } }