<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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

https://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.
-->
<html>
  <head>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>AntUnit Task</title>
  </head>

  <body>
    <h2><a name="antunit">AntUnit</a></h2>

    <h3>Description</h3>

    <p>Runs Ant on targets of a build file that follow a certain
      naming convention.  If Ant throws the special subclass of
        <code>BuildException</code> that the 
        <a href="assert.html"><code>assertTrue</code></a>
      task uses, consider it a failed test.  Any other exception is
      considered a failure.  If Ant completes the target without any
      exception, consider it a passed test.</p>

    <p>Tests are specified via ResourceCollections.</p>

    <p>All targets whose name starts with "test" (but not if the name
    is "test" exactly) are considered test cases.  If a test build
    file contains a target named setUp, this gets executed before each
    test target.  If it contains a target named tearDown this gets
    executed after each test target.</p>

    <p>If the test build file contains a target named suiteSetUp, this
    gets executed before te very first test target (or before the
    setUp target is executed for the first time).  If it contains a
    target named suiteTearDown this gets executed after the last test
    target (or tearDown has been executed the last time).</p>

    <p>Each test target is run in a fresh Ant project, i.e. each test
    target has a fresh set of properties and references.</p>

    <p>So in a build file with targets setUp, tearDown, test1 and
    test2, antunit will run two Ant builds.  One will run the targets
    setUp, test1 and tearDown (in that order), the other one will run
    setUp, test2 and tearDown.  The order of those two Ant builds is
    not defined.</p>

    <p>&lt;antunit&gt; also supports AntUnitListeners, i.e. classes
    that receive notifications on test runs, failures and so one.
    Currently two implementations of this interface are
    provided with this Ant library.</p>

    <p>Log output during each antunit test case is captured by an
    instance of the LogCapturer class that is available via a project
    reference named ant.antunit.log.  The published interface of that
    class is:</p>

    <pre>
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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
 *
 * https://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.ant.antunit;

public class LogCapturer {
    public static final String REFERENCE_ID = "ant.antunit.log";

    /**
     * All messages with <code>logLevel == Project.MSG_ERR</code>.
     */
    public String getErrLog();
    /**
     * All messages with <code>logLevel == Project.MSG_WARN</code> or
     * more severe.
     */
    public String getWarnLog();
    /**
     * All messages with <code>logLevel == Project.MSG_INFO</code> or
     * more severe.
     */
    public String getInfoLog();
    /**
     * All messages with <code>logLevel == Project.MSG_VERBOSE</code> or
     * more severe.
     */
    public String getVerboseLog();
    /**
     * All messages with <code>logLevel == Project.MSG_DEBUG</code> or
     * more severe.
     */
    public String getDebugLog();
}
</pre>

<p>Additionally, the contents of the log can be accessed through a
<a href="logcontent.html">LogContent</a> resource.</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">failOnError</td>
        <td valign="top">Whether to stop the build if one of the tests
          fails/causes an error.  Defaults to true.</td>
        <td align="center">No.</td>
      </tr>
      <tr>
        <td valign="top">errorProperty</td>
        <td valign="top">Name of the Ant property to set if one of the
        tests fails/causes an error.  Only useful if the failOnError
        attribute is set to false.</td>
        <td align="center">No.</td>
      </tr>
    </table>

    <h3>Parameters specified as nested elements</h3>

    <h4>any file system resource collection</h4>

    <p>Specifies the build files to run as tests.  At least one
    resource is required.</p>

    <h4>any implementation of AntUnitListener</h4>

    <p>Creates a test listener that gets attached to the task.</p>

    <p>Some listeners are part of this antlib:</p>

    <ul>
      <li><a href="plainlistener.html">&lt;plainlistener/&gt;</a>
        creates reports similar to the "plain" &lt;formatter&gt; of the
        &lt;junit&gt; task.</li>
      <li><a href="xmllistener.html">&lt;xmllistener/&gt;</a> is similar
        to the "xml" &lt;formatter&gt;.</li>
      <li><a href="logforwarder.html">&lt;logforwarder/&gt;</a>
        forwards log output from the project under test to the project
        executing the antunit task.</li>
    </ul>

    <h4>propertyset</h4>

    <p><a
    href="http://ant.apache.org/manual/Types/propertyset.html">&lt;propertyset&gt;</a>s
    can be used to pass properties to the build files under test.</p>

    <h4>reference</h4>

    <p>One or more references may be passed to the antunit script.  For example, paths and filesets
    can be defined once in the outer build script and passed through to multiple antunit scripts.</p>

    <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">refid</td>
        <td valign="top">The reference ID to inherit</td>
        <td align="center" valign="middle" rowspan="2">Exactly one of these</td>
      </tr>
      <tr>
        <td valign="top">regex</td>
        <td valign="top">A regular expression identifying a group of reference IDs to inherit.</td>
      </tr>
      <tr>
        <td valign="top">torefid</td>
        <td valign="top">The ID of the reference in the test project.  </td>
        <td align="center" valign="middle" width="25%">No.  If this reference appears inside
        a <a href="#referenceset">&lt;referenceset&gt;</a> with a nested mapper element, the mapper
        will be used to determine the target reference ID.  Otherwise, defaults to the source
        reference ID.</td>
      </tr>
    </table>

    <a name="referenceset"/><h4>referenceset</h4>

    <p>References can be grouped inside a &lt;referenceset&gt; element for clarity.  Additionally, &lt;referenceset&gt;
    elements may contain exactly one nested <a href="https://ant.apache.org/manual/CoreTypes/mapper.html">&lt;mapper&gt;</a> 
    element, which defines how source reference IDs are translated into target reference IDs.  For example,

<pre>
  &lt;au:antunit&gt;
    &lt;referenceset&gt;
      &lt;reference refid="first.ref"/&gt;
      &lt;reference refid="second.ref"/&gt;
      &lt;mapper type="regexp" from="(.*)\.ref" to="mapped.ref.\1"/&gt;
    &lt;/referenceset&gt;
  &lt;/au:antunit&gt;
</pre>
    </p>

    <h3>Examples</h3>

    <p>This build file snippet (from src/etc/testcases/antunit/base.xml)</p>
<pre>
  &lt;target name="setUp">
    &lt;echo>setup&lt;/echo>
  &lt;/target>

  &lt;target name="test1">
    &lt;echo>test1&lt;/echo>
  &lt;/target>

  &lt;target name="test2">
    &lt;echo>test2&lt;/echo>
  &lt;/target>

  &lt;target name="Xtest3">
    &lt;echo>test3&lt;/echo>
  &lt;/target>

  &lt;target name="test4">
    &lt;au:assertTrue message="test4 fails">
      &lt;istrue value="false"/>
    &lt;/au:assertTrue>
  &lt;/target>

  &lt;target name="test5">
    &lt;fail message="test5 exits with error"/>
  &lt;/target>

  &lt;target name="testLogCaptureActive">
    &lt;au:assertReferenceSet refid="ant.antunit.log"/>
  &lt;/target>

  &lt;target name="test">
    &lt;fail>should be ignored&lt;/fail>
  &lt;/target>

  &lt;target name="tearDown">
    &lt;echo>tearDown&lt;/echo>
  &lt;/target>
</pre>

    <p>together with</p>

<pre>
    &lt;au:antunit>
      &lt;file file="antunit/base.xml"/>
      &lt;au:plainlistener/>
    &lt;/au:antunit>
</pre>

    <p>results in output similar to</p>

<pre>
[au:antunit] Build File: .../src/etc/testcases/antunit/base.xml
[au:antunit] Tests run: 5, Failures: 1, Errors: 1, Time elapsed: 0.216 sec
[au:antunit] Target: test2 took 0.001 sec
[au:antunit] Target: test1 took 0.001 sec
[au:antunit] Target: testLogCaptureActive took 0.128 sec
[au:antunit] Target: test5  caused an ERROR
[au:antunit]    at line 56, column 45
[au:antunit]    Message: test5 exits with error
[au:antunit]    took 0.01 sec
[au:antunit] Target: test4  FAILED
[au:antunit]    at line 50, column 42
[au:antunit]    Message: test4 fails
[au:antunit]    took 0.003 sec
</pre>
  </body>
</html>
