add unit tests add includeruntime to allow unittests to run git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275605 13f79535-47bb-0310-9956-ffa450edef68master
@@ -71,6 +71,12 @@ href="#nested">nested elements</a>.</p> | |||
<td VALIGN=TOP>The directory to invoke the VM in. (Ignored if fork is disabled)</td> | |||
<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> | |||
@@ -0,0 +1,53 @@ | |||
<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> |
@@ -61,6 +61,7 @@ import java.io.PrintWriter; | |||
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.EnumeratedAttribute; | |||
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 @@ public class JDependTask extends Task { | |||
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 @@ public class JDependTask extends Task { | |||
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 class JDependTask extends Task { | |||
} | |||
} | |||
/* | |||
public void setTimeout(Integer value) { | |||
_timeout = value; | |||
} | |||
/** | |||
* 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; | |||
} | |||
public Integer getTimeout() { | |||
return _timeout; | |||
} | |||
*/ | |||
/** | |||
* @return the timeout value | |||
*/ | |||
public Long getTimeout() { | |||
return timeout; | |||
} | |||
/** | |||
* The output file name. | |||
@@ -350,6 +376,43 @@ public class JDependTask extends Task { | |||
*/ | |||
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 | |||
* | |||
@@ -380,7 +443,7 @@ public class JDependTask extends Task { | |||
// 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 @@ public class JDependTask extends Task { | |||
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 @@ public class JDependTask extends Task { | |||
// 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 @@ public class JDependTask extends Task { | |||
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 @@ public class JDependTask extends Task { | |||
* @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()); | |||
} | |||
} |
@@ -0,0 +1,155 @@ | |||
/* | |||
* 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); | |||
} | |||
} |