You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by pe...@apache.org on 2003/11/03 16:34:13 UTC

cvs commit: ant/src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend JDependTest.java

peterreilly    2003/11/03 07:34:13

  Modified:    docs/manual/OptionalTasks jdepend.html
               src/main/org/apache/tools/ant/taskdefs/optional/jdepend
                        JDependTask.java
  Added:       src/etc/testcases/taskdefs/optional/jdepend jdepend.xml
               src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend
                        JDependTest.java
  Log:
  fix timeout attribute of jdepend
  add unit tests
  add includeruntime to allow unittests to run
  
  Revision  Changes    Path
  1.11      +6 -0      ant/docs/manual/OptionalTasks/jdepend.html
  
  Index: jdepend.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/OptionalTasks/jdepend.html,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- jdepend.html	3 Apr 2003 15:49:47 -0000	1.10
  +++ jdepend.html	3 Nov 2003 15:34:13 -0000	1.11
  @@ -72,6 +72,12 @@
       <td ALIGN=CENTER VALIGN=TOP>No</td>
     </tr>
     <tr>
  +    <td VALIGN=TOP>includeruntime</td>
  +    <td VALIGN=TOP>Implicitly add the classes required to run jdepend
  +    in forked mode. (Ignored if fork is disabled). Since ant 1.6.</td>
  +    <td ALIGN=CENTER VALIGN=TOP>No, default is "no".</td>
  +  </tr>
  +  <tr>
       <td VALIGN=TOP>classpathref</td>
       <td VALIGN=TOP>the classpath to use, given as reference to a PATH defined elsewhere.</td>
       <td ALIGN=CENTER VALIGN=TOP>No</td>
  
  
  
  1.1                  ant/src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml
  
  Index: jdepend.xml
  ===================================================================
  <project>
    <property name="testclasses" location="../../../../../../build/testcases"/>
    
    <path id="all-test-classes.id">
      <pathelement location="../../../../build/testcases" />
      <pathelement path="${java.class.path}" />
    </path>
  
    <path id="example-classes.id">
      <pathelement location="${testclasses}/org/apache/tools/ant/util/facade" />
    </path>
  
    <path id="test-classes.id">
      <pathelement location="${testclasses}" />
    </path>
  
    <target name="simple">
      <jdepend>
        <classespath refid="example-classes.id"/>
      </jdepend>
    </target>
  
    <target name="xml">
      <jdepend format="xml">
        <classespath refid="example-classes.id"/>
      </jdepend>
    </target>
  
    <target name="fork">
      <jdepend fork="yes" includeruntime="yes">
        <classespath refid="example-classes.id"/>
      </jdepend>
    </target>
  
    <target name="fork-xml">
      <jdepend fork="yes" format="xml" includeruntime="yes">
        <classespath refid="example-classes.id"/>
      </jdepend>
    </target>
  
    <target name="fork-timeout">
      <jdepend fork="yes" timeout="10" includeruntime="yes">
        <classespath refid="test-classes.id"/>
      </jdepend>
    </target>
  
    <target name="fork-timeout-not">
      <jdepend fork="yes" timeout="100000" includeruntime="yes">
        <classespath refid="example-classes.id"/>
      </jdepend>
    </target>
  
  </project>
  
  
  1.26      +106 -25   ant/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java
  
  Index: JDependTask.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java,v
  retrieving revision 1.25
  retrieving revision 1.26
  diff -u -r1.25 -r1.26
  --- JDependTask.java	3 Nov 2003 15:22:28 -0000	1.25
  +++ JDependTask.java	3 Nov 2003 15:34:13 -0000	1.26
  @@ -61,6 +61,7 @@
   import java.lang.reflect.Constructor;
   import java.lang.reflect.Method;
   import java.util.Vector;
  +import java.util.Enumeration;
   import org.apache.tools.ant.BuildException;
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.Task;
  @@ -73,6 +74,7 @@
   import org.apache.tools.ant.types.Path;
   import org.apache.tools.ant.types.PatternSet;
   import org.apache.tools.ant.types.Reference;
  +import org.apache.tools.ant.util.LoaderUtils;
   
   /**
    * Runs JDepend tests.
  @@ -99,7 +101,7 @@
       private Path compileClasspath;
       private boolean haltonerror = false;
       private boolean fork = false;
  -    //private Integer _timeout = null;
  +    private Long timeout = null;
   
       private String jvm = null;
       private String format = "text";
  @@ -108,6 +110,9 @@
       private static Constructor packageFilterC;
       private static Method setFilter;
   
  +    private boolean includeRuntime = false;
  +    private Path runtimeClasses = null;
  +
       static {
           try {
               Class packageFilter =
  @@ -124,15 +129,36 @@
           }
       }
   
  -    /*
  -      public void setTimeout(Integer value) {
  -      _timeout = value;
  -      }
  -
  -      public Integer getTimeout() {
  -      return _timeout;
  -      }
  -    */
  +    /**
  +     * If true,
  +     *  include jdepend.jar in the forked VM.
  +     *
  +     * @param b include ant run time yes or no
  +     * @since Ant 1.6
  +     */
  +    public void setIncluderuntime(boolean b) {
  +        includeRuntime = b;
  +    }
  +
  +    /**
  +     * Set the timeout value (in milliseconds).
  +     *
  +     * <p>If the operation is running for more than this value, the jdepend
  +     * will be canceled. (works only when in 'fork' mode).</p>
  +     * @param value the maximum time (in milliseconds) allowed before
  +     * declaring the test as 'timed-out'
  +     * @see #setFork(boolean)
  +     */
  +    public void setTimeout(Long value) {
  +        timeout = value;
  +    }
  +
  +    /**
  +     * @return the timeout value
  +     */
  +    public Long getTimeout() {
  +        return timeout;
  +    }
   
       /**
        * The output file name.
  @@ -351,6 +377,43 @@
       private static final int ERRORS = 1;
   
       /**
  +     * Search for the given resource and add the directory or archive
  +     * that contains it to the classpath.
  +     *
  +     * <p>Doesn't work for archives in JDK 1.1 as the URL returned by
  +     * getResource doesn't contain the name of the archive.</p>
  +     *
  +     * @param resource resource that one wants to lookup
  +     * @since Ant 1.6
  +     */
  +    private void addClasspathEntry(String resource) {
  +        /*
  +         * pre Ant 1.6 this method used to call getClass().getResource
  +         * while Ant 1.6 will call ClassLoader.getResource().
  +         *
  +         * The difference is that Class.getResource expects a leading
  +         * slash for "absolute" resources and will strip it before
  +         * delegating to ClassLoader.getResource - so we now have to
  +         * emulate Class's behavior.
  +         */
  +        if (resource.startsWith("/")) {
  +            resource = resource.substring(1);
  +        } else {
  +            resource = "org/apache/tools/ant/taskdefs/optional/jdepend/"
  +                + resource;
  +        }
  +
  +        File f = LoaderUtils.getResourceSource(getClass().getClassLoader(),
  +                                               resource);
  +        if (f != null) {
  +            log("Found " + f.getAbsolutePath(), Project.MSG_DEBUG);
  +            runtimeClasses.createPath().setLocation(f);
  +        } else {
  +            log("Couldn\'t find " + resource, Project.MSG_DEBUG);
  +        }
  +    }
  +
  +    /**
        * execute the task
        *
        * @exception BuildException if an error occurs
  @@ -380,7 +443,7 @@
   
           // execute the test and get the return code
           int exitValue = JDependTask.ERRORS;
  -        //boolean wasKilled = false;
  +        boolean wasKilled = false;
           if (!getFork()) {
               exitValue = executeInVM(commandline);
           } else {
  @@ -388,21 +451,22 @@
               exitValue = executeAsForked(commandline, watchdog);
               // null watchdog means no timeout, you'd better not check with null
               if (watchdog != null) {
  -                //info will be used in later version do nothing for now
  -                //wasKilled = watchdog.killedProcess();
  +                wasKilled = watchdog.killedProcess();
               }
           }
   
           // if there is an error/failure and that it should halt, stop
           // everything otherwise just log a statement
  -        boolean errorOccurred = exitValue == JDependTask.ERRORS;
  +        boolean errorOccurred = exitValue == JDependTask.ERRORS || wasKilled;
   
           if (errorOccurred) {
  +            String errorMessage = "JDepend FAILED"
  +                + (wasKilled ? " - Timed out" : "");
  +
               if  (getHaltonerror()) {
  -                throw new BuildException("JDepend failed",
  -                                         getLocation());
  +                throw new BuildException(errorMessage, getLocation());
               } else {
  -                log("JDepend FAILED", Project.MSG_ERR);
  +                log(errorMessage, Project.MSG_ERR);
               }
           }
       }
  @@ -540,6 +604,9 @@
       // JL: comment extracted from JUnitTask (and slightly modified)
       public int executeAsForked(CommandlineJava commandline,
                                  ExecuteWatchdog watchdog) throws BuildException {
  +        runtimeClasses = new Path(getProject());
  +        addClasspathEntry("/jdepend/textui/JDepend.class");
  +
           // if not set, auto-create the ClassPath from the project
           createClasspath();
   
  @@ -550,6 +617,24 @@
               createJvmarg(commandline).setValue(getClasspath().toString());
           }
   
  +        if (includeRuntime) {
  +            Vector v = Execute.getProcEnvironment();
  +            Enumeration e = v.elements();
  +            while (e.hasMoreElements()) {
  +                String s = (String) e.nextElement();
  +                if (s.startsWith("CLASSPATH=")) {
  +                    commandline.createClasspath(getProject()).createPath()
  +                        .append(new Path(getProject(),
  +                                         s.substring("CLASSPATH=".length()
  +                                                     )));
  +                }
  +            }
  +            log("Implicitly adding " + runtimeClasses + " to CLASSPATH",
  +                Project.MSG_VERBOSE);
  +            commandline.createClasspath(getProject()).createPath()
  +                .append(runtimeClasses);
  +        }
  +
           if (getOutputFile() != null) {
               // having a space between the file and its path causes commandline
               // to add quotes around the argument thus making JDepend not taking
  @@ -620,13 +705,9 @@
        * @throws BuildException in case of error
        */
       protected ExecuteWatchdog createWatchdog() throws BuildException {
  -
  -        return null;
  -        /*
  -          if (getTimeout() == null) {
  -          return null;
  -          }
  -          return new ExecuteWatchdog(getTimeout().intValue());
  -        */
  +        if (getTimeout() == null) {
  +            return null;
  +        }
  +        return new ExecuteWatchdog(getTimeout().longValue());
       }
   }
  
  
  
  1.1                  ant/src/testcases/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTest.java
  
  Index: JDependTest.java
  ===================================================================
  /*
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "Ant" and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   */
  
  package org.apache.tools.ant.taskdefs.optional.jdepend;
  
  import java.io.File;
  import java.io.FileReader;
  import java.io.IOException;
  import java.util.Date;
  import java.util.Vector;
  import java.util.Enumeration;
  import java.util.Hashtable;
  import org.apache.tools.ant.BuildFileTest;
  import org.apache.tools.ant.Project;
  import org.apache.tools.ant.types.FileSet;
  import org.apache.tools.ant.DirectoryScanner;
  
  /**
   * Testcase for the JDepend optional task.
   *
   * @author Peter Reilly
   */
  public class JDependTest extends BuildFileTest {
      public static final String RESULT_FILESET = "result";
  
      public JDependTest(String name) {
          super(name);
      }
  
      public void setUp() {
          configureProject(
              "src/etc/testcases/taskdefs/optional/jdepend/jdepend.xml");
      }
  
      /**
       * Test simple
       */
      public void testSimple() {
          expectOutputContaining(
              "simple", "Package: org.apache.tools.ant.util.facade");
      }
      
      /**
       * Test xml
       */
      public void testXml() {
          expectOutputContaining(
              "xml", "<Package>java.lang</Package>");
      }
  
      /**
       * Test fork
       * - forked output goes to log
       */
      public void testFork() {
          expectLogContaining(
              "fork", "Package: org.apache.tools.ant.util.facade");
      }
      
      /**
       * Test fork xml
       */
      public void testForkXml() {
          expectLogContaining(
              "fork-xml", "<Package>java.lang</Package>");
      }
  
      /**
       * Test timeout
       */
      public void testTimeout() {
          expectLogContaining(
              "fork-timeout", "JDepend FAILED - Timed out");
      }
      
  
      /**
       * Test timeout without timing out
       */
      public void testTimeoutNot() {
          expectLogContaining(
              "fork-timeout-not", "Package: org.apache.tools.ant.util.facade");
      }
  
      /**
       * Assert that the given substring is in the output messages
       */
  
      protected void assertOutputContaining(String substring) {
          String realOutput = getOutput();
          assertTrue("expecting output to contain \"" + substring + "\" output was \""
                     + realOutput + "\"",
                     realOutput.indexOf(substring) >= 0);
      }
      
      /**
       * Assert that the given message has been outputted
       */
      protected void expectOutputContaining(String target, String substring) {
          executeTarget(target);
          assertOutputContaining(substring);
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org