Author: ddevienne
Date: Wed Nov 23 09:41:51 2005
New Revision: 348500
URL: http://svn.apache.org/viewcvs?rev=348500&view=rev
Log:
Add new manifestclasspath core task. Make BuildFileTest call tearDown target
automatically in build file test if one is defined.
Added:
ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html
ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
Modified:
ant/core/trunk/WHATSNEW
ant/core/trunk/docs/manual/coretasklist.html
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java
Modified: ant/core/trunk/WHATSNEW
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/WHATSNEW?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Wed Nov 23 09:41:51 2005
@@ -163,6 +163,9 @@
Other changes:
--------------
+* New task <manifestclasspath> converts a path into a property
+ suitable as the value for a manifest's Class-Path attribute.
+
* Fixed references to obsoleted CVS web site. Bugzilla Report 36854.
* Log fine-grained events at verbose level from JUnit. Bugzilla report 31885.
Added: ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html (added)
+++ ant/core/trunk/docs/manual/CoreTasks/manifestclasspath.html Wed Nov 23
09:41:51 2005
@@ -0,0 +1,98 @@
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<link rel="stylesheet" type="text/css" href="../stylesheets/style.css">
+<title>ManifestClassPath Task</title>
+</head>
+
+<body>
+
+<h2><a name="manifestclasspath">Manifestclasspath</a></h2>
+
+<h3>Description</h3>
+<p>Converts a <a href="../using.html#path">Path</a> into a property
+whose value is appropriate for a <a href="manifest.html">Manifest</a>'s
+<code>Class-Path</code> attribute.</p>
+
+<p>This task is often used to work around command line limitations on Windows
+when using very long class paths when launching an application. The long class
+path normally specified on the command line is replaced by a single (possibly
+empty) jar file which an in-manifest Class-Path attribute whose value lists
+all the jar and zip files the class path should contain. The files referenced
+from this attribute must be found relatively to the jar file itself, usually
+in the same directory. The Java VM automically uses all file entries listed
+in the Class-Path attributes of a jar to locate/load classes. Note though that
+it silently ignores entries for which it cannot find any corresponding
file.</p>
+
+<p>Note that the property value created may be longer than a manifest's maximum
+72 characters per line, but will be properly wrapped as per the Jar
+specification by the <code><manifest></code> element, where the
+defined property is re-referenced.</p>
+
+<p><em>since Ant 1.7</em></p>
+
+<h3>Parameters</h3>
+<table border="1" cellpadding="2" cellspacing="0">
+ <tr>
+ <td valign="top"><b>Attribute</b></td>
+ <td valign="top"><b>Description</b></td>
+ <td align="center" valign="top"><b>Required</b></td>
+ </tr>
+ <tr>
+ <td valign="top">property</td>
+ <td valign="top">the name of the property to set. This property must
+ not already be set.</td>
+ <td valign="top" align="center">Yes</td>
+ </tr>
+ <tr>
+ <td valign="top">jarfile</td>
+ <td valign="top">
+ the filename for the Jar which will contain the manifest that will
+ use the property this task will set. This file need not exist yet,
+ but its parent directory must exist.
+ </td>
+ <td valign="top" align="center">Yes</td>
+ </tr>
+ <tr>
+ <td valign="top">maxParentLevels</td>
+ <td valign="top">
+ The maximum number of parent directories one is allowed to traverse
+ to navigate from the jar file to the path entry. Put differently, the
+ maximum number of .. which is allowed in the relative path from the
+ jar file to a given class path enty. Specify 0 to enforce a path
+ entry to be in the same directory (or one of its sub-directories)
+ as the jar file itself. Defaults to 2 levels.</td>
+ <td valign="top" align="center">No</td>
+ </tr>
+</table>
+
+<h3>Parameters specified as nested elements</h3>
+<h4>classpath</h4>
+<p>A <a href="../using#path.html">Path-like</a> element, which can be
+defined in-place, or refer to a path defined elsewhere using the
+<code><classpath refid="<em>pathid</em>" /></code> syntax.
+This classpath must not be empty, and is required.</p>
+
+<h3>Examples</h3>
+<div id="example1">
+ <blockquote><pre>
+ <manifestclasspath property="jar.classpath"
+ jarfile="build/acme.jar">
+ <classpath refid="classpath" />
+ </manifestclasspath>
+ </pre></blockquote>
+ <p>Assuming a path of id "classpath" was already defined, convert this
+ path relatively to the build/ directory that will contain acme.jar, which
+ can later be created with <code><jar></code> with a nested
+ <code><manifest></code> element that lists an
+ <code><attribute name="Class-Path" value="${jar.classpath}" /></code>.
+ </p>
+</div>
+
+<hr>
+<p align="center">Copyright © 2005 The Apache Software Foundation.
+All rights Reserved.</p>
+
+</body>
+</html>
Modified: ant/core/trunk/docs/manual/coretasklist.html
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/docs/manual/coretasklist.html?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/docs/manual/coretasklist.html (original)
+++ ant/core/trunk/docs/manual/coretasklist.html Wed Nov 23 09:41:51 2005
@@ -69,6 +69,7 @@
<a href="CoreTasks/mail.html">Mail</a><br>
<a href="CoreTasks/macrodef.html">MacroDef</a><br>
<a href="CoreTasks/manifest.html">Manifest</a><br>
+<a href="CoreTasks/manifestclasspath.html">ManifestClassPath</a><br>
<a href="CoreTasks/mkdir.html">Mkdir</a><br>
<a href="CoreTasks/move.html">Move</a><br>
<a href="CoreTasks/nice.html">Nice</a><br>
Added: ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml?rev=348500&view=auto
==============================================================================
--- ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml (added)
+++ ant/core/trunk/src/etc/testcases/taskdefs/manifestclasspath.xml Wed Nov 23
09:41:51 2005
@@ -0,0 +1,164 @@
+<?xml version="1.0"?>
+
+<project name="manifestclasspath" default="tearDown">
+
+ <target name="setUp">
+ <property name="tmp" location="${basedir}/${ant.project.name}.tmp" />
+ <mkdir dir="${tmp}" />
+ </target>
+
+ <target name="fullSetUp" depends="setUp">
+ <mkdir dir="${tmp}/lib" />
+ <touch file="${tmp}/lib/acme-core.jar" />
+ <touch file="${tmp}/lib/acme-pres.jar" />
+
+ <mkdir dir="${tmp}/classes/dsp-core/com/lgc/infra/core" />
+ <mkdir dir="${tmp}/classes/dsp-pres/com/lgc/infra/pres" />
+ <mkdir dir="${tmp}/classes/dsp-void" />
+ <mkdir dir="${tmp}/generated/dsp-core/com/lgc/infra/core/generated" />
+ <mkdir dir="${tmp}/generated/dsp-pres" />
+ <mkdir dir="${tmp}/generated/dsp-void" />
+ <mkdir dir="${tmp}/resources/dsp-core/com/lgc/infra/core" />
+ <mkdir dir="${tmp}/resources/dsp-pres/com/lgc/infra/pres" />
+ <mkdir dir="${tmp}/resources/dsp-void" />
+ </target>
+
+ <target name="tearDown">
+ <delete dir="${tmp}" />
+ </target>
+
+ <target name="test-bad-directory">
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classpath.jar">
+ <classpath />
+ </manifestclasspath>
+ </target>
+
+ <target name="test-bad-no-property" depends="setUp">
+ <manifestclasspath jarfile="${tmp}/classpath.jar">
+ <classpath />
+ </manifestclasspath>
+ </target>
+
+ <target name="test-bad-property-exists" depends="setUp">
+ <property name="jar.classpath" value="exists" />
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classpath.jar">
+ <classpath />
+ </manifestclasspath>
+ </target>
+
+ <target name="test-bad-no-jarfile" depends="setUp">
+ <manifestclasspath property="jar.classpath">
+ <classpath />
+ </manifestclasspath>
+ </target>
+
+ <target name="test-bad-no-classpath" depends="setUp">
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classpath.jar" />
+ </target>
+
+ <target name="test-pseudo-tahoe-refid" depends="fullSetUp">
+ <path id="classpath">
+ <!-- All the classes/ directories -->
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+
+ <!-- All the JAXB generated/ directories -->
+ <dirset dir="${tmp}/generated" includes="dsp-*">
+ <!-- Add only non-empty directories to the classpath -->
+ <present targetdir="${tmp}/generated" present="both">
+ <mapper type="regexp" from="(.*)" to="\1/com" />
+ </present>
+ </dirset>
+
+ <!-- All the resources/ directories -->
+ <dirset dir="${tmp}/resources" includes="dsp-*">
+ <!-- Add only non-empty directories to the classpath -->
+ <present targetdir="${tmp}/resources" present="both">
+ <mapper type="regexp" from="(.*)" to="\1/com" />
+ </present>
+ </dirset>
+ </path>
+
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classpath.jar">
+ <classpath refid="classpath" />
+ </manifestclasspath>
+ </target>
+
+ <target name="test-pseudo-tahoe-nested" depends="fullSetUp">
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classpath.jar">
+ <classpath>
+ <!-- All the classes/ directories -->
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+
+ <!-- All the JAXB generated/ directories -->
+ <dirset dir="${tmp}/generated" includes="dsp-*">
+ <!-- Add only non-empty directories to the classpath -->
+ <present targetdir="${tmp}/generated" present="both">
+ <mapper type="regexp" from="(.*)" to="\1/com" />
+ </present>
+ </dirset>
+
+ <!-- All the resources/ directories -->
+ <dirset dir="${tmp}/resources" includes="dsp-*">
+ <!-- Add only non-empty directories to the classpath -->
+ <present targetdir="${tmp}/resources" present="both">
+ <mapper type="regexp" from="(.*)" to="\1/com" />
+ </present>
+ </dirset>
+ </classpath>
+ </manifestclasspath>
+ </target>
+
+ <target name="test-parent-level1" depends="fullSetUp">
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classes/classpath.jar">
+ <classpath>
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+ <dirset dir="${tmp}/generated" includes="dsp-*" />
+ <dirset dir="${tmp}/resources" includes="dsp-*" />
+ </classpath>
+ </manifestclasspath>
+ </target>
+
+ <target name="test-parent-level2" depends="fullSetUp">
+ <mkdir dir="${tmp}/classes/level2" />
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classes/level2/classpath.jar">
+ <classpath>
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+ <dirset dir="${tmp}/generated" includes="dsp-*" />
+ <dirset dir="${tmp}/resources" includes="dsp-*" />
+ </classpath>
+ </manifestclasspath>
+ </target>
+
+ <target name="test-parent-level2-too-deep" depends="fullSetUp">
+ <mkdir dir="${tmp}/classes/level2" />
+ <manifestclasspath property="jar.classpath" maxParentLevels="1"
+ jarfile="${tmp}/classes/level2/classpath.jar">
+ <classpath>
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+ <dirset dir="${tmp}/generated" includes="dsp-*" />
+ <dirset dir="${tmp}/resources" includes="dsp-*" />
+ </classpath>
+ </manifestclasspath>
+ </target>
+
+ <target name="test-parent-level2-with-jars" depends="fullSetUp">
+ <mkdir dir="${tmp}/classes/level2" />
+ <manifestclasspath property="jar.classpath"
+ jarfile="${tmp}/classes/level2/classpath.jar">
+ <classpath>
+ <fileset dir="${tmp}/lib" includes="*.jar" />
+ <dirset dir="${tmp}/classes" includes="dsp-*" />
+ <dirset dir="${tmp}/generated" includes="dsp-*" />
+ <dirset dir="${tmp}/resources" includes="dsp-*" />
+ </classpath>
+ </manifestclasspath>
+ </target>
+
+</project>
Added:
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java?rev=348500&view=auto
==============================================================================
---
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
(added)
+++
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/ManifestClassPath.java
Wed Nov 23 09:41:51 2005
@@ -0,0 +1,184 @@
+/*
+ * Copyright 2005 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;
+
+import java.io.File;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Path;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.util.FileUtils;
+
+/**
+ * Converts a Path into a property suitable as a Manifest classpath.
+ *
+ * @since Ant 1.7
+ *
+ * @ant.task category="property"
+ */
+public class ManifestClassPath
+ extends Task {
+
+ /** The property name to hold the classpath value. */
+ private String _name;
+
+ /** The directory the classpath will be relative from. */
+ private File _dir;
+
+ /** The maximum parent directory level to traverse. */
+ private int _maxParentLevels = 2;
+
+ /** The classpath to convert. */
+ private Path _path;
+
+ /**
+ * Sets a property, which must not already exists, with a space
+ * separated list of files and directories relative to the jar
+ * file's parent directory.
+ */
+ public void execute() {
+ if (_name == null) {
+ throw new BuildException("Missing 'property' attribute!");
+ }
+ if (_dir == null) {
+ throw new BuildException("Missing 'jarfile' attribute!");
+ }
+ if (getProject().getProperty(_name) != null) {
+ throw new BuildException("Property '" + _name + "' already set!");
+ }
+ if (_path == null) {
+ throw new BuildException("Missing nested <classpath>!");
+ }
+
+ // Normalize the reference directory (containing the jar)
+ final FileUtils fileUtils = FileUtils.getFileUtils();
+ _dir = fileUtils.normalize(_dir.getAbsolutePath());
+
+ // Create as many directory prefixes as parent levels to traverse,
+ // in addition to the reference directory itself
+ File currDir = _dir;
+ String[] dirs = new String[_maxParentLevels + 1];
+ for (int i = 0; i < _maxParentLevels + 1; ++i) {
+ dirs[i] = currDir.getAbsolutePath() + File.separatorChar;
+ currDir = currDir.getParentFile();
+ if (currDir == null) {
+ _maxParentLevels = i + 1;
+ break;
+ }
+ }
+
+ String[] elements = _path.list();
+ StringBuffer buffer = new StringBuffer();
+ StringBuffer element = new StringBuffer();
+ for (int i = 0; i < elements.length; ++i) {
+ // Normalize the current file
+ File pathEntry = new File(elements[i]);
+ pathEntry = fileUtils.normalize(pathEntry.getAbsolutePath());
+ String fullPath = pathEntry.getAbsolutePath();
+
+ // Find the longest prefix shared by the current file
+ // and the reference directory.
+ String relPath = null;
+ for (int j = 0; j <= _maxParentLevels; ++j) {
+ String dir = dirs[j];
+ if (!fullPath.startsWith(dir)) {
+ continue;
+ }
+
+ // We have a match! Add as many ../ as parent
+ // directory traversed to get the relative path
+ element.setLength(0);
+ for (int k = 0; k < j; ++k) {
+ element.append("..");
+ element.append(File.separatorChar);
+ }
+ element.append(fullPath.substring(dir.length()));
+ relPath = element.toString();
+ break;
+ }
+
+ // No match, so bail out!
+ if (relPath == null) {
+ throw new BuildException("No suitable relative path from " +
+ _dir + " to " + fullPath);
+ }
+
+ // Manifest's ClassPath: attribute always uses forward
+ // slashes '/', and is space-separated. Ant will properly
+ // format it on 72 columns with proper line continuation
+ if (File.separatorChar != '/') {
+ relPath = relPath.replace(File.separatorChar, '/');
+ }
+ buffer.append(relPath);
+ if (pathEntry.isDirectory()) {
+ buffer.append('/');
+ }
+ buffer.append(' ');
+ }
+
+ // Get rid of trailing space, if any
+ if (buffer.length() > 0) {
+ buffer.setLength(buffer.length() - 1);
+ }
+
+ // Finally assign the property with the manifest classpath
+ getProject().setNewProperty(_name, buffer.toString());
+ }
+
+ /**
+ * Sets the property name to hold the classpath value.
+ *
+ * @param name the property name
+ */
+ public void setProperty(String name) {
+ _name = name;
+ }
+
+ /**
+ * The JAR file to contain the classpath attribute in its manifest.
+ *
+ * @param jarfile the JAR file. Need not exist yet, but its parent
+ * directory must exist on the other hand.
+ */
+ public void setJarFile(File jarfile) {
+ File parent = jarfile.getParentFile();
+ if (!parent.isDirectory()) {
+ throw new BuildException("Jar's directory not found: " + parent);
+ }
+ _dir = parent;
+ }
+
+ /**
+ * Sets the maximum parent directory levels allowed when computing
+ * a relative path.
+ *
+ * @param levels the max level. Defaults to 2.
+ */
+ public void setMaxParentLevels(int levels) {
+ _maxParentLevels = levels;
+ }
+
+ /**
+ * Adds the classpath to convert.
+ *
+ * @param path the classpath to convert.
+ */
+ public void addClassPath(Path path) {
+ _path = path;
+ }
+
+}
Modified:
ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
(original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/defaults.properties
Wed Nov 23 09:41:51 2005
@@ -47,6 +47,7 @@
macrodef=org.apache.tools.ant.taskdefs.MacroDef
mail=org.apache.tools.ant.taskdefs.email.EmailTask
manifest=org.apache.tools.ant.taskdefs.ManifestTask
+manifestclasspath=org.apache.tools.ant.taskdefs.ManifestClassPath
mkdir=org.apache.tools.ant.taskdefs.Mkdir
move=org.apache.tools.ant.taskdefs.Move
nice=org.apache.tools.ant.taskdefs.Nice
@@ -221,4 +222,4 @@
renameext=org.apache.tools.ant.taskdefs.optional.RenameExtensions
starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
style=org.apache.tools.ant.taskdefs.XSLTProcess
-WsdlToDotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet
\ No newline at end of file
+WsdlToDotnet=org.apache.tools.ant.taskdefs.optional.dotnet.WsdlToDotnet
Modified: ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java?rev=348500&r1=348499&r2=348500&view=diff
==============================================================================
--- ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java
(original)
+++ ant/core/trunk/src/testcases/org/apache/tools/ant/BuildFileTest.java Wed
Nov 23 09:41:51 2005
@@ -42,19 +42,42 @@
private BuildException buildException;
/**
- * Constructor for the BuildFileTest object
+ * Default constructor for the BuildFileTest object.
+ */
+ public BuildFileTest() {
+ super();
+ }
+
+ /**
+ * Constructor for the BuildFileTest object.
*
- [EMAIL PROTECTED] name string to pass up to TestCase constructor
+ * @param name string to pass up to TestCase constructor
*/
public BuildFileTest(String name) {
super(name);
}
/**
- * run a target, expect for any build exception
+ * Automatically calls the target called "tearDown"
+ * from the build file tested if it exits.
*
- [EMAIL PROTECTED] target target to run
- [EMAIL PROTECTED] cause information string to reader of report
+ * This allows to use Ant tasks directly in the build file
+ * to clean up after each test. Note that no "setUp" target
+ * is automatically called, since it's trivial to have a
+ * test target depend on it.
+ */
+ protected void tearDown() throws Exception {
+ final String tearDown = "tearDown";
+ if (project.getTargets().containsKey(tearDown)) {
+ project.executeTarget(tearDown);
+ }
+ }
+
+ /**
+ * run a target, expect for any build exception
+ *
+ * @param target target to run
+ * @param cause information string to reader of report
*/
protected void expectBuildException(String target, String cause) {
expectSpecificBuildException(target, cause, null);
@@ -71,9 +94,8 @@
}
/**
- * Assert that the given substring is in the log messages
+ * Assert that the given substring is in the log messages.
*/
-
protected void assertLogContaining(String substring) {
String realLog = getLog();
assertTrue("expecting log to contain \"" + substring + "\" log was \""
@@ -82,16 +104,16 @@
}
/**
- * Assert that the given substring is in the output messages
+ * Assert that the given substring is in the output messages.
* @since Ant1.7
*/
-
protected void assertOutputContaining(String substring) {
String realOutput = getOutput();
- assertTrue("expecting output to contain \"" + substring + "\" output
was \""
- + realOutput + "\"",
- realOutput.indexOf(substring) >= 0);
+ assertTrue("expecting output to contain \"" + substring
+ + "\" output was \"" + realOutput + "\"",
+ realOutput.indexOf(substring) >= 0);
}
+
/**
* Assert that the given message has been logged with a priority
* <= INFO when running the given target.
@@ -102,9 +124,9 @@
}
/**
- * Gets the log the BuildFileTest object.
- * only valid if configureProject() has
- * been called.
+ * Gets the log the BuildFileTest object.
+ * Only valid if configureProject() has been called.
+ *
* @pre logBuffer!=null
* @return The log value
*/
@@ -123,9 +145,8 @@
}
/**
- * Assert that the given substring is in the log messages
+ * Assert that the given substring is in the log messages.
*/
-
protected void assertDebuglogContaining(String substring) {
String realLog = getFullLog();
assertTrue("expecting debug log to contain \"" + substring
@@ -135,9 +156,10 @@
}
/**
- * Gets the log the BuildFileTest object.
- * only valid if configureProject() has
- * been called.
+ * Gets the log the BuildFileTest object.
+ *
+ * Only valid if configureProject() has been called.
+ *
* @pre fullLogBuffer!=null
* @return The log value
*/
@@ -146,12 +168,11 @@
}
/**
- * execute the target, verify output matches expectations
+ * execute the target, verify output matches expectations
*
- [EMAIL PROTECTED] target target to execute
- [EMAIL PROTECTED] output output to look for
+ * @param target target to execute
+ * @param output output to look for
*/
-
protected void expectOutput(String target, String output) {
executeTarget(target);
String realOutput = getOutput();
@@ -159,13 +180,13 @@
}
/**
- * execute the target, verify output matches expectations
- * and that we got the named error at the end
- [EMAIL PROTECTED] target target to execute
- [EMAIL PROTECTED] output output to look for
- [EMAIL PROTECTED] error Description of Parameter
+ * Executes the target, verify output matches expectations
+ * and that we got the named error at the end
+ *
+ * @param target target to execute
+ * @param output output to look for
+ * @param error Description of Parameter
*/
-
protected void expectOutputAndError(String target, String output, String
error) {
executeTarget(target);
String realOutput = getOutput();
@@ -206,7 +227,7 @@
}
/**
- * set up to run the named project
+ * Sets up to run the named project
*
* @param filename name of project file to run
*/
@@ -215,7 +236,7 @@
}
/**
- * set up to run the named project
+ * Sets up to run the named project
*
* @param filename name of project file to run
*/
@@ -232,7 +253,8 @@
}
/**
- * execute a target we have set up
+ * Executes a target we have set up
+ *
* @pre configureProject has been called
* @param targetName target to run
*/
@@ -269,7 +291,8 @@
}
/**
- * get the directory of the project
+ * Gets the directory of the project.
+ *
* @return the base dir of the project
*/
protected File getProjectDir() {
@@ -277,12 +300,12 @@
}
/**
- * run a target, wait for a build exception
+ * Runs a target, wait for a build exception.
*
- [EMAIL PROTECTED] target target to run
- [EMAIL PROTECTED] cause information string to reader of report
- [EMAIL PROTECTED] msg the message value of the build exception we are
waiting for
- set to null for any build exception to be valid
+ * @param target target to run
+ * @param cause information string to reader of report
+ * @param msg the message value of the build exception we are waiting
+ * for set to null for any build exception to be valid
*/
protected void expectSpecificBuildException(String target, String cause,
String msg) {
try {
@@ -300,12 +323,12 @@
}
/**
- * run a target, expect an exception string
- * containing the substring we look for (case sensitive match)
+ * run a target, expect an exception string
+ * containing the substring we look for (case sensitive match)
*
- [EMAIL PROTECTED] target target to run
- [EMAIL PROTECTED] cause information string to reader of report
- [EMAIL PROTECTED] contains substring of the build exception to look for
+ * @param target target to run
+ * @param cause information string to reader of report
+ * @param contains substring of the build exception to look for
*/
protected void expectBuildExceptionContaining(String target, String cause,
String contains) {
try {
@@ -320,7 +343,6 @@
fail("Should throw BuildException because: " + cause);
}
-
/**
* call a target, verify property is as expected
*
@@ -328,7 +350,6 @@
* @param property property name
* @param value expected value
*/
-
protected void expectPropertySet(String target, String property, String
value) {
executeTarget(target);
assertPropertyEquals(property, value);
@@ -336,6 +357,7 @@
/**
* assert that a property equals a value; comparison is case sensitive.
+ *
* @param property property name
* @param value expected value
*/
@@ -345,7 +367,8 @@
}
/**
- * assert that a property equals "true"
+ * assert that a property equals "true".
+ *
* @param property property name
*/
protected void assertPropertySet(String property) {
@@ -353,14 +376,14 @@
}
/**
- * assert that a property is null
+ * assert that a property is null.
+ *
* @param property property name
*/
protected void assertPropertyUnset(String property) {
assertPropertyEquals(property, null);
}
-
/**
* call a target, verify named property is "true".
*
@@ -371,9 +394,9 @@
expectPropertySet(target, property, "true");
}
-
/**
- * call a target, verify property is null
+ * Call a target, verify property is null.
+ *
* @param target build file target
* @param property property name
*/
@@ -385,6 +408,7 @@
* Retrieve a resource from the caller classloader to avoid
* assuming a vm working directory. The resource path must be
* relative to the package name or absolute from the root path.
+ *
* @param resource the resource to retrieve its url.
* @throws AssertionFailureException if resource is not found.
*/
@@ -410,77 +434,77 @@
}
/**
- * our own personal build listener
+ * Our own personal build listener.
*/
private class AntTestListener implements BuildListener {
private int logLevel;
/**
* Constructs a test listener which will ignore log events
- * above the given level
+ * above the given level.
*/
public AntTestListener(int logLevel) {
this.logLevel = logLevel;
}
/**
- * Fired before any targets are started.
+ * Fired before any targets are started.
*/
public void buildStarted(BuildEvent event) {
}
/**
- * Fired after the last target has finished. This event
- * will still be thrown if an error occurred during the build.
+ * Fired after the last target has finished. This event
+ * will still be thrown if an error occurred during the build.
*
- * @see BuildEvent#getException()
+ * @see BuildEvent#getException()
*/
public void buildFinished(BuildEvent event) {
}
/**
- * Fired when a target is started.
+ * Fired when a target is started.
*
- * @see BuildEvent#getTarget()
+ * @see BuildEvent#getTarget()
*/
public void targetStarted(BuildEvent event) {
//System.out.println("targetStarted " +
event.getTarget().getName());
}
/**
- * Fired when a target has finished. This event will
- * still be thrown if an error occurred during the build.
+ * Fired when a target has finished. This event will
+ * still be thrown if an error occurred during the build.
*
- * @see BuildEvent#getException()
+ * @see BuildEvent#getException()
*/
public void targetFinished(BuildEvent event) {
//System.out.println("targetFinished " +
event.getTarget().getName());
}
/**
- * Fired when a task is started.
+ * Fired when a task is started.
*
- * @see BuildEvent#getTask()
+ * @see BuildEvent#getTask()
*/
public void taskStarted(BuildEvent event) {
//System.out.println("taskStarted " +
event.getTask().getTaskName());
}
/**
- * Fired when a task has finished. This event will still
- * be throw if an error occurred during the build.
+ * Fired when a task has finished. This event will still
+ * be throw if an error occurred during the build.
*
- * @see BuildEvent#getException()
+ * @see BuildEvent#getException()
*/
public void taskFinished(BuildEvent event) {
//System.out.println("taskFinished " +
event.getTask().getTaskName());
}
/**
- * Fired whenever a message is logged.
+ * Fired whenever a message is logged.
*
- * @see BuildEvent#getMessage()
- * @see BuildEvent#getPriority()
+ * @see BuildEvent#getMessage()
+ * @see BuildEvent#getPriority()
*/
public void messageLogged(BuildEvent event) {
if (event.getPriority() > logLevel) {
@@ -494,9 +518,7 @@
logBuffer.append(event.getMessage());
}
fullLogBuffer.append(event.getMessage());
-
}
}
-
}
Added:
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
URL:
http://svn.apache.org/viewcvs/ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java?rev=348500&view=auto
==============================================================================
---
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
(added)
+++
ant/core/trunk/src/testcases/org/apache/tools/ant/taskdefs/ManifestClassPathTest.java
Wed Nov 23 09:41:51 2005
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2000-2005 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;
+
+import java.io.File;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.tools.ant.BuildFileTest;
+
+/**
+ * Tests <bm:manifestclasspath>.
+ */
+public class ManifestClassPathTest
+ extends BuildFileTest {
+
+ public void setUp() {
+ configureProject("src/etc/testcases/taskdefs/manifestclasspath.xml");
+ }
+
+ public void testBadDirectory() {
+ expectBuildExceptionContaining("test-bad-directory", "bad-jar-dir",
+ "Jar's directory not found:");
+ assertPropertyUnset("jar.classpath");
+ }
+
+ public void testBadNoProperty() {
+ expectBuildExceptionContaining("test-bad-no-property", "no-property",
+ "Missing 'property' attribute!");
+ assertPropertyUnset("jar.classpath");
+ }
+
+ public void testBadPropertyExists() {
+ expectBuildExceptionContaining("test-bad-property-exists",
+ "property-exits", "Property 'jar.classpath' already set!");
+ assertPropertyEquals("jar.classpath", "exists");
+ }
+
+ public void testBadNoJarfile() {
+ expectBuildExceptionContaining("test-bad-no-jarfile", "no-jarfile",
+ "Missing 'jarfile' attribute!");
+ assertPropertyUnset("jar.classpath");
+ }
+
+ public void testBadNoClassPath() {
+ expectBuildExceptionContaining("test-bad-no-classpath", "no-classpath",
+ "Missing nested <classpath>!");
+ assertPropertyUnset("jar.classpath");
+ }
+
+ public void testParentLevel1() {
+ executeTarget("test-parent-level1");
+
+ assertPropertyEquals("jar.classpath", "dsp-core/ " +
+ "dsp-pres/ " +
+ "dsp-void/ " +
+ "../generated/dsp-core/ " +
+ "../generated/dsp-pres/ " +
+ "../generated/dsp-void/ " +
+ "../resources/dsp-core/ " +
+ "../resources/dsp-pres/ " +
+ "../resources/dsp-void/");
+ }
+
+ public void testParentLevel2() {
+ executeTarget("test-parent-level2");
+
+ assertPropertyEquals("jar.classpath", "../dsp-core/ " +
+ "../dsp-pres/ " +
+ "../dsp-void/ " +
+ "../../generated/dsp-core/ " +
+ "../../generated/dsp-pres/ " +
+ "../../generated/dsp-void/ " +
+ "../../resources/dsp-core/ " +
+ "../../resources/dsp-pres/ " +
+ "../../resources/dsp-void/");
+ }
+
+ public void testParentLevel2TooDeep() {
+ expectBuildExceptionContaining("test-parent-level2-too-deep", "nopath",
+ "No suitable relative path from ");
+ assertPropertyUnset("jar.classpath");
+ }
+
+ public void testPseudoTahoeRefid() {
+ executeTarget("test-pseudo-tahoe-refid");
+
+ assertPropertyEquals("jar.classpath", "classes/dsp-core/ " +
+ "classes/dsp-pres/ " +
+ "classes/dsp-void/ " +
+ "generated/dsp-core/ " +
+ "resources/dsp-core/ " +
+ "resources/dsp-pres/");
+ }
+
+ public void testPseudoTahoeNested() {
+ executeTarget("test-pseudo-tahoe-nested");
+
+ assertPropertyEquals("jar.classpath", "classes/dsp-core/ " +
+ "classes/dsp-pres/ " +
+ "classes/dsp-void/ " +
+ "generated/dsp-core/ " +
+ "resources/dsp-core/ " +
+ "resources/dsp-pres/");
+ }
+
+ public void testParentLevel2WithJars() {
+ executeTarget("test-parent-level2-with-jars");
+
+ assertPropertyEquals("jar.classpath", "../../lib/acme-core.jar " +
+ "../../lib/acme-pres.jar " +
+ "../dsp-core/ " +
+ "../dsp-pres/ " +
+ "../dsp-void/ " +
+ "../../generated/dsp-core/ " +
+ "../../generated/dsp-pres/ " +
+ "../../generated/dsp-void/ " +
+ "../../resources/dsp-core/ " +
+ "../../resources/dsp-pres/ " +
+ "../../resources/dsp-void/");
+ }
+
+} // END class ManifestClassPathTest
+
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]