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
  +     * &lt;batchtest&gt; 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]

Reply via email to