bodewig     2004/10/06 08:01:55

  Modified:    src/etc/testcases/taskdefs/optional junit.xml
               src/main/org/apache/tools/ant/taskdefs/optional/junit
                        JUnitTask.java JUnitTestRunner.java
               src/testcases/org/apache/tools/ant/taskdefs/optional/junit
                        JUnitTaskTest.java NoVmCrash.java Sleeper.java
                        VmCrash.java
  Added:       src/main/org/apache/tools/ant/taskdefs/optional/junit
                        OutErrSummaryJUnitResultFormatter.java
               src/testcases/org/apache/tools/ant/taskdefs/optional/junit
                        Printer.java
  Log:
  Make sure test output gets grabbed early enough to capture everything.
  
  PR: 30798
  
  While fixing this, I noticed that printsummary="withOutAndErr" didn't
  work with fork="true".
  
  Revision  Changes    Path
  1.4       +23 -0     ant/src/etc/testcases/taskdefs/optional/junit.xml
  
  Index: junit.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/optional/junit.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- junit.xml 30 Sep 2004 09:39:57 -0000      1.3
  +++ junit.xml 6 Oct 2004 15:01:55 -0000       1.4
  @@ -7,6 +7,10 @@
       <pathelement location="../../../../../build/testcases" />
     </path>
   
  +  <target name="cleanup">
  +    <delete file="testlog.txt"/>
  +  </target>
  +
     <target name="testForkedOutput">
       <junit fork="yes" haltonerror="true" haltonfailure="true" 
              showoutput="${showoutput}">
  @@ -67,6 +71,25 @@
       <junit fork="true" errorproperty="timeout" timeout="15000">
         <test name="org.apache.tools.ant.taskdefs.optional.junit.Sleeper"/>
         <classpath refid="test" />
  +    </junit>
  +  </target>
  +
  +  <target name="capture">
  +    <property name="fork" value="false"/>
  +    <junit fork="${fork}">
  +      <test
  +        name="org.apache.tools.ant.taskdefs.optional.junit.Printer"
  +        outfile="testlog"/>
  +      <formatter type="plain"/>
  +      <classpath refid="test"/>
  +    </junit>
  +  </target>
  +
  +  <target name="captureToSummary">
  +    <property name="fork" value="true"/>
  +    <junit fork="${fork}" printSummary="withOutAndErr">
  +      <test name="org.apache.tools.ant.taskdefs.optional.junit.Printer"/>
  +      <classpath refid="test"/>
       </junit>
     </target>
   </project>
  
  
  
  1.104     +7 -2      
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.103
  retrieving revision 1.104
  diff -u -r1.103 -r1.104
  --- JUnitTask.java    30 Sep 2004 12:41:12 -0000      1.103
  +++ JUnitTask.java    6 Oct 2004 15:01:55 -0000       1.104
  @@ -805,9 +805,14 @@
   
           if (summary) {
               log("Running " + test.getName(), Project.MSG_INFO);
  +            String prefix = "";
  +            if ("withoutanderr".equalsIgnoreCase(summaryValue)) {
  +                prefix = "OutErr";
  +            }
               cmd.createArgument()
                   .setValue("formatter"
  -                + 
"=org.apache.tools.ant.taskdefs.optional.junit.SummaryJUnitResultFormatter");
  +                          + "=org.apache.tools.ant.taskdefs.optional.junit."
  +                          + prefix + "SummaryJUnitResultFormatter");
           }
   
           cmd.createArgument().setValue("showoutput="
  
  
  
  1.51      +98 -99    
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.50
  retrieving revision 1.51
  diff -u -r1.50 -r1.51
  --- JUnitTestRunner.java      30 Sep 2004 09:42:16 -0000      1.50
  +++ JUnitTestRunner.java      6 Oct 2004 15:01:55 -0000       1.51
  @@ -127,16 +127,6 @@
       private boolean haltOnFailure = false;
   
       /**
  -     * The corresponding testsuite.
  -     */
  -    private Test suite = null;
  -
  -    /**
  -     * Exception caught in constructor.
  -     */
  -    private Exception exception;
  -
  -    /**
        * Returncode
        */
       private int retCode = SUCCESS;
  @@ -158,6 +148,9 @@
       /** Running more than one test suite? */
       private static boolean multipleTests = false;
   
  +    /** ClassLoader passed in in non-forked mode. */
  +    private ClassLoader loader;
  +
       /**
        * Constructor for fork=true or when the user hasn't specified a
        * classpath.
  @@ -197,38 +190,7 @@
           this.haltOnError = haltOnError;
           this.haltOnFailure = haltOnFailure;
           this.showOutput = showOutput;
  -
  -        try {
  -            Class testClass = null;
  -            if (loader == null) {
  -                testClass = Class.forName(test.getName());
  -            } else {
  -                testClass = Class.forName(test.getName(), true, loader);
  -            }
  -
  -            Method suiteMethod = null;
  -            try {
  -                // check if there is a suite method
  -                suiteMethod = testClass.getMethod("suite", new Class[0]);
  -            } catch (NoSuchMethodException e) {
  -                // no appropriate suite method found. We don't report any
  -                // error here since it might be perfectly normal.
  -            }
  -            if (suiteMethod != null) {
  -                // if there is a suite method available, then try
  -                // to extract the suite from it. If there is an error
  -                // here it will be caught below and reported.
  -                suite = (Test) suiteMethod.invoke(null, new Class[0]);
  -            } else {
  -                // try to extract a test suite automatically
  -                // this will generate warnings if the class is no suitable 
Test
  -                suite = new TestSuite(testClass);
  -            }
  -
  -        } catch (Exception e) {
  -            retCode = ERRORS;
  -            exception = e;
  -        }
  +        this.loader = loader;
       }
   
       public void run() {
  @@ -238,77 +200,114 @@
               res.addListener((TestListener) formatters.elementAt(i));
           }
   
  -        long start = System.currentTimeMillis();
  +        ByteArrayOutputStream errStrm = new ByteArrayOutputStream();
  +        systemError = new PrintStream(errStrm);
   
  -        fireStartTestSuite();
  -        if (exception != null) { // had an exception in the constructor
  -            for (int i = 0; i < formatters.size(); i++) {
  -                ((TestListener) formatters.elementAt(i)).addError(null,
  -                                                                  exception);
  -            }
  -            junitTest.setCounts(1, 0, 1);
  -            junitTest.setRunTime(0);
  -        } else {
  +        ByteArrayOutputStream outStrm = new ByteArrayOutputStream();
  +        systemOut = new PrintStream(outStrm);
   
  +        PrintStream savedOut = null;
  +        PrintStream savedErr = null;
   
  -            ByteArrayOutputStream errStrm = new ByteArrayOutputStream();
  -            systemError = new PrintStream(errStrm);
  +        if (forked) {
  +            savedOut = System.out;
  +            savedErr = System.err;
  +            if (!showOutput) {
  +                System.setOut(systemOut);
  +                System.setErr(systemError);
  +            } else {
  +                System.setOut(new PrintStream(
  +                                       new TeeOutputStream(savedOut, 
systemOut)
  +                                       )
  +                              );
  +                System.setErr(new PrintStream(
  +                                       new TeeOutputStream(savedErr,
  +                                                           systemError)
  +                                       )
  +                              );
  +            }
  +            perm = null;
  +        } else {
  +            if (perm != null) {
  +                perm.setSecurityManager();
  +            }
  +        }
   
  -            ByteArrayOutputStream outStrm = new ByteArrayOutputStream();
  -            systemOut = new PrintStream(outStrm);
  +        Test suite = null;
  +        Exception exception = null;
   
  -            PrintStream savedOut = null;
  -            PrintStream savedErr = null;
  +        try {
   
  -            if (forked) {
  -                savedOut = System.out;
  -                savedErr = System.err;
  -                if (!showOutput) {
  -                    System.setOut(systemOut);
  -                    System.setErr(systemError);
  +            try {
  +                Class testClass = null;
  +                if (loader == null) {
  +                    testClass = Class.forName(junitTest.getName());
                   } else {
  -                    System.setOut(new PrintStream(
  -                                      new TeeOutputStream(savedOut, 
systemOut)
  -                                      )
  -                                  );
  -                    System.setErr(new PrintStream(
  -                                      new TeeOutputStream(savedErr,
  -                                                          systemError)
  -                                      )
  -                                  );
  +                    testClass = Class.forName(junitTest.getName(), true, 
  +                                              loader);
                   }
  -                perm = null;
  -            } else {
  -                if (perm != null) {
  -                    perm.setSecurityManager();
  +
  +                Method suiteMethod = null;
  +                try {
  +                    // check if there is a suite method
  +                    suiteMethod = testClass.getMethod("suite", new Class[0]);
  +                } catch (NoSuchMethodException e) {
  +                    // no appropriate suite method found. We don't report any
  +                    // error here since it might be perfectly normal.
  +                }
  +                if (suiteMethod != null) {
  +                    // if there is a suite method available, then try
  +                    // to extract the suite from it. If there is an error
  +                    // here it will be caught below and reported.
  +                    suite = (Test) suiteMethod.invoke(null, new Class[0]);
  +                } else {
  +                    // try to extract a test suite automatically this
  +                    // will generate warnings if the class is no
  +                    // suitable Test
  +                    suite = new TestSuite(testClass);
                   }
  -            }
   
  +            } catch (Exception e) {
  +                retCode = ERRORS;
  +                exception = e;
  +            }
   
  -            try {
  -                suite.run(res);
  -            } finally {
  -                if (perm != null) {
  -                    perm.restoreSecurityManager();
  -                }
  -                if (savedOut != null) {
  -                    System.setOut(savedOut);
  +            long start = System.currentTimeMillis();
  +
  +            fireStartTestSuite();
  +            if (exception != null) { // had an exception constructing suite
  +                for (int i = 0; i < formatters.size(); i++) {
  +                    ((TestListener) formatters.elementAt(i))
  +                        .addError(null, exception);
                   }
  -                if (savedErr != null) {
  -                    System.setErr(savedErr);
  +                junitTest.setCounts(1, 0, 1);
  +                junitTest.setRunTime(0);
  +            } else {
  +                try {
  +                    suite.run(res);
  +                } finally {
  +                    junitTest.setCounts(res.runCount(), res.failureCount(),
  +                                        res.errorCount());
  +                    junitTest.setRunTime(System.currentTimeMillis() - start);
                   }
  -
  -                systemError.close();
  -                systemError = null;
  -                systemOut.close();
  -                systemOut = null;
  -                sendOutAndErr(new String(outStrm.toByteArray()),
  -                              new String(errStrm.toByteArray()));
  -
  -                junitTest.setCounts(res.runCount(), res.failureCount(),
  -                                    res.errorCount());
  -                junitTest.setRunTime(System.currentTimeMillis() - start);
               }
  +        } finally {
  +            if (perm != null) {
  +                perm.restoreSecurityManager();
  +            }
  +            if (savedOut != null) {
  +                System.setOut(savedOut);
  +            }
  +            if (savedErr != null) {
  +                System.setErr(savedErr);
  +            }
  +
  +            systemError.close();
  +            systemError = null;
  +            systemOut.close();
  +            systemOut = null;
  +            sendOutAndErr(new String(outStrm.toByteArray()),
  +                          new String(errStrm.toByteArray()));
           }
           fireEndTestSuite();
   
  
  
  
  1.1                  
ant/src/main/org/apache/tools/ant/taskdefs/optional/junit/OutErrSummaryJUnitResultFormatter.java
  
  Index: OutErrSummaryJUnitResultFormatter.java
  ===================================================================
  /*
   * Copyright  2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   */
  
  package org.apache.tools.ant.taskdefs.optional.junit;
  
  /**
   * Used instead of SummaryJUnitResultFormatter in forked tests if
   * withOutAndErr is requested.
   */
  
  public class OutErrSummaryJUnitResultFormatter 
      extends SummaryJUnitResultFormatter {
  
      /**
       * Empty
       */
      public OutErrSummaryJUnitResultFormatter() {
          super();
          setWithOutAndErr(true);
      }
  }
  
  
  
  1.2       +69 -7     
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskTest.java
  
  Index: JUnitTaskTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskTest.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- JUnitTaskTest.java        30 Sep 2004 09:39:57 -0000      1.1
  +++ JUnitTaskTest.java        6 Oct 2004 15:01:55 -0000       1.2
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2002,2004 The Apache Software Foundation
  + * Copyright  2004 The Apache Software Foundation
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -16,17 +16,15 @@
    */
   package org.apache.tools.ant.taskdefs.optional.junit;
   
  -import org.apache.tools.ant.Project;
  -import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.BuildFileTest;
  -import java.lang.reflect.InvocationTargetException;
  +import java.io.BufferedReader;
  +import java.io.FileReader;
  +import java.io.IOException;
   
   public class JUnitTaskTest extends BuildFileTest {
   
       /**
        * Constructor for the JUnitTaskTest object
  -     *
  -     * @param name we dont know
        */
       public JUnitTaskTest(String name) {
           super(name);
  @@ -45,7 +43,7 @@
        * The teardown method for JUnit
        */
       public void tearDown() {
  -        //executeTarget("cleanup");
  +        executeTarget("cleanup");
       }
   
       public void testCrash() {
  @@ -62,6 +60,70 @@
   
       public void testNoTimeout() {
          expectPropertyUnset("notimeout", "timeout");
  +    }
  +
  +    public void testNonForkedCapture() throws IOException {
  +        executeTarget("capture");
  +        assertNoPrint(getLog(), "log");
  +        assertNoPrint(getFullLog(), "debug log");
  +    }
  +
  +    public void testForkedCapture() throws IOException {
  +        getProject().setProperty("fork", "true");
  +        testNonForkedCapture();
  +        // those would fail because of the way BuildFileTest captures output
  +        assertNoPrint(getOutput(), "output");
  +        assertNoPrint(getError(), "error output");
  +        assertOutput();
  +    }
  +
  +    private void assertNoPrint(String result, String where) {
  +        assertTrue(where + " '" + result + "' must not contain print 
statement",
  +                   result.indexOf("print to System.") == -1);
  +    }
  +
  +    private void assertOutput() throws IOException {
  +        FileReader inner = new FileReader(getProject()
  +                                          .resolveFile("testlog.txt"));
  +        BufferedReader reader = new BufferedReader(inner);
  +        try {
  +            String line = reader.readLine();
  +            assertEquals("Testsuite: 
org.apache.tools.ant.taskdefs.optional.junit.Printer",
  +                         line);
  +            line = reader.readLine();
  +            assertNotNull(line);
  +            assertTrue(line.startsWith("Tests run: 1, Failures: 0, Errors: 
0, Time elapsed:"));
  +            line = reader.readLine();
  +            assertEquals("------------- Standard Output ---------------",
  +                         line);
  +            assertPrint(reader.readLine(), "static", "out");
  +            assertPrint(reader.readLine(), "constructor", "out");
  +            assertPrint(reader.readLine(), "method", "out");
  +            line = reader.readLine();
  +            assertEquals("------------- ---------------- ---------------",
  +                         line);
  +            line = reader.readLine();
  +            assertEquals("------------- Standard Error -----------------",
  +                         line);
  +            assertPrint(reader.readLine(), "static", "err");
  +            assertPrint(reader.readLine(), "constructor", "err");
  +            assertPrint(reader.readLine(), "method", "err");
  +            line = reader.readLine();
  +            assertEquals("------------- ---------------- ---------------",
  +                         line);
  +            line = reader.readLine();
  +            assertEquals("", line);
  +            line = reader.readLine();
  +            assertNotNull(line);
  +            assertTrue(line.startsWith("Testcase: testNoCrash took "));
  +        } finally {
  +            inner.close();
  +        }
  +    }
  +
  +    private void assertPrint(String line, String from, String to) {
  +        String search = from + " print to System." + to;
  +        assertEquals(search, line);
       }
   
   }
  
  
  
  1.2       +1 -3      
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/NoVmCrash.java
  
  Index: NoVmCrash.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/NoVmCrash.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- NoVmCrash.java    30 Sep 2004 09:39:57 -0000      1.1
  +++ NoVmCrash.java    6 Oct 2004 15:01:55 -0000       1.2
  @@ -16,9 +16,7 @@
    */
   package org.apache.tools.ant.taskdefs.optional.junit;
   
  -import junit.framework.Test;
   import junit.framework.TestCase;
  -import junit.framework.TestResult;
   
   /**
    * @version $Revision$
  
  
  
  1.2       +1 -3      
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/Sleeper.java
  
  Index: Sleeper.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/Sleeper.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Sleeper.java      30 Sep 2004 09:39:57 -0000      1.1
  +++ Sleeper.java      6 Oct 2004 15:01:55 -0000       1.2
  @@ -16,9 +16,7 @@
    */
   package org.apache.tools.ant.taskdefs.optional.junit;
   
  -import junit.framework.Test;
   import junit.framework.TestCase;
  -import junit.framework.TestResult;
   
   /**
    * @version $Revision$
  
  
  
  1.2       +1 -3      
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/VmCrash.java
  
  Index: VmCrash.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/VmCrash.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- VmCrash.java      30 Sep 2004 09:39:57 -0000      1.1
  +++ VmCrash.java      6 Oct 2004 15:01:55 -0000       1.2
  @@ -16,9 +16,7 @@
    */
   package org.apache.tools.ant.taskdefs.optional.junit;
   
  -import junit.framework.Test;
   import junit.framework.TestCase;
  -import junit.framework.TestResult;
   
   /**
    * @version $Revision$
  
  
  
  1.1                  
ant/src/testcases/org/apache/tools/ant/taskdefs/optional/junit/Printer.java
  
  Index: Printer.java
  ===================================================================
  /*
   * Copyright 2004 The Apache Software Foundation
   *
   *  Licensed under the Apache License, Version 2.0 (the "License");
   *  you may not use this file except in compliance with the License.
   *  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   *  Unless required by applicable law or agreed to in writing, software
   *  distributed under the License is distributed on an "AS IS" BASIS,
   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *  See the License for the specific language governing permissions and
   *  limitations under the License.
   *
   */
  package org.apache.tools.ant.taskdefs.optional.junit;
  
  import junit.framework.TestCase;
  
  /**
   * @version $Revision: 1.1 $
   */
  public class Printer extends TestCase {
  
      public Printer(String name) {
          super(name);
          System.err.println("constructor print to System.err");
          System.out.println("constructor print to System.out");
      }
  
      static {
          System.err.println("static print to System.err");
          System.out.println("static print to System.out");
      }
  
      public void testNoCrash() {
          System.err.println("method print to System.err");
          System.out.println("method print to System.out");
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to