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>&lt;manifest&gt;</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>&lt;classpath refid="<em>pathid</em>" /&gt;</code> syntax.

+This classpath must not be empty, and is required.</p>

+

+<h3>Examples</h3>

+<div id="example1">

+  <blockquote><pre>

+    &lt;manifestclasspath property="jar.classpath"

+                       jarfile="build/acme.jar"&gt;

+      &lt;classpath refid="classpath" /&gt;

+    &lt;/manifestclasspath&gt;

+  </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>&lt;jar&gt;</code> with a nested 

+  <code>&lt;manifest&gt;</code> element that lists an

+  <code>&lt;attribute name="Class-Path" value="${jar.classpath}" /&gt;</code>.

+  </p>

+</div>

+

+<hr>

+<p align="center">Copyright &copy; 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
      * &lt;= 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 &quot;true&quot;
+     * 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 &lt;bm:manifestclasspath&gt;.

+ */

+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]

Reply via email to