Author: jhm Date: Wed Sep 12 01:49:57 2007 New Revision: 574848 URL: http://svn.apache.org/viewvc?rev=574848&view=rev Log: New Failure Listener, like the new one for JUnit.
Added: ant/antlibs/antunit/trunk/docs/failurelistener.html ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java Modified: ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/antlib.xml Added: ant/antlibs/antunit/trunk/docs/failurelistener.html URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/docs/failurelistener.html?rev=574848&view=auto ============================================================================== --- ant/antlibs/antunit/trunk/docs/failurelistener.html (added) +++ ant/antlibs/antunit/trunk/docs/failurelistener.html Wed Sep 12 01:49:57 2007 @@ -0,0 +1,61 @@ +<!-- +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 + +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. +--> +<html> + <head> + <meta http-equiv="Content-Language" content="en-us"></meta> + <link rel="stylesheet" type="text/css" href="style.css"> + <title>XMLListener AntUnit Listener</title> + </head> + + <body> + <h2><a name="xmllistener">Failure AntUnit Listener</a></h2> + + <h3>Description</h3> + + <p>Writes reports similar to the "failure" JUnit formatter.</p><p>This AntUnitListener creates a new buildfile with a target for each failed test target in the AntUnit run. The generated target calls the failed target (with setUp and tearDown if present in the called project). <br></p><p>This is intended for rerunning just failed tests.<br></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">file</td> + <td valign="top">Where to write the generated buildfile.<br></td> + <td align="center">Yes.</td> + </tr> + </table> + + <h3>Examples</h3> + +<pre> <br> <au:antunit> + <fileset dir="${tests}" includes="*.xml"/> + <au:failurelistener file="${build.dir}/failed-tests/failed.xml"/> + </au:antunit> <br> +</pre> + + <p>Runs AntUnit on all XML files in the directory + <code>${tests}</code> and collecting all failed tests. If there was a failure the file <code>${build.dir}/failed-tests/failed.xml</code> is created and has a <em>textXXX </em>target for each failed test. Additionally it has a default target <em>antunit</em> which runs all these failed tests.<br> </p> + + </body> +</html> Modified: ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/antlib.xml URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/antlib.xml?rev=574848&r1=574847&r2=574848&view=diff ============================================================================== --- ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/antlib.xml (original) +++ ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/antlib.xml Wed Sep 12 01:49:57 2007 @@ -33,6 +33,9 @@ <typedef name="xmllistener" classname="org.apache.ant.antunit.listener.XMLAntUnitListener"/> + <typedef name="failurelistener" + classname="org.apache.ant.antunit.listener.FailureAntUnitListener"/> + <typedef name="logcapturer" classname="org.apache.ant.antunit.LogCapturer"/> Added: ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java URL: http://svn.apache.org/viewvc/ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java?rev=574848&view=auto ============================================================================== --- ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java (added) +++ ant/antlibs/antunit/trunk/src/main/org/apache/ant/antunit/listener/FailureAntUnitListener.java Wed Sep 12 01:49:57 2007 @@ -0,0 +1,208 @@ +/* + * 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 + * + * 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.ant.antunit.listener; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.NumberFormat; +import java.util.Iterator; +import java.util.SortedSet; +import java.util.TreeSet; + +import org.apache.ant.antunit.AssertionFailedException; +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.util.FileUtils; + +/** + * This AntUnitListener creates a new buildfile with a target for each + * failed test target in the AntUnit run. The generated target calls + * the failed target (with setUp and tearDown if present in the called + * project). + * This is intended for rerunning just failed tests. + */ +public class FailureAntUnitListener extends BaseAntUnitListener { + + /** LineSeparator just for beautifying the output. */ + private static final String BR = System.getProperty("line.separator"); + + /** A sorted list (without duplicates) of failed tests. */ + private static SortedSet failedTests = new TreeSet(); + + /** Where to write the generated buildfile. */ + private static File failureBuildfile; + + /** The current running test project. Needed for addError()/addFailure(). */ + private Project currentTestProject; + + /** The current running build file. Needed for addError()/addFailure(). */ + private String currentBuildFile; + + + /** No-arg constructor. */ + public FailureAntUnitListener() { + super(new BaseAntUnitListener.SendLogTo(SendLogTo.ANT_LOG), "txt"); + } + + public void startTestSuite(Project testProject, String buildFile) { + super.startTestSuite(testProject, buildFile); + currentTestProject = testProject; + currentBuildFile = buildFile; + } + + public void addError(String target, Throwable ae) { + super.addError(target, ae); + failedTests.add(new TestInfos(currentTestProject, currentBuildFile, target, ae.getMessage())); + } + + public void addFailure(String target, AssertionFailedException ae) { + super.addFailure(target, ae); + failedTests.add(new TestInfos(currentTestProject, currentBuildFile, target, ae.getMessage())); + } + + /** not in use */ + public void endTest(String target) { + } + + public void endTestSuite(Project testProject, String buildFile) { + StringBuffer sb = new StringBuffer(); + // <project> and antunit-target for direct run + sb.append("<project default=\"antunit\" xmlns:au=\"antlib:org.apache.ant.antunit\">"); + sb.append(BR); + sb.append(BR); + sb.append(" <target name=\"antunit\">").append(BR); + sb.append(" <au:antunit>").append(BR); + sb.append(" <au:plainlistener/>").append(BR); + sb.append(" <file file=\"${ant.file}\"/>").append(BR); + sb.append(" </au:antunit>").append(BR); + sb.append(" </target>").append(BR); + sb.append(BR); + sb.append(BR); + + // one target for each failed test + int testNumber = 0; + NumberFormat f = NumberFormat.getIntegerInstance(); + for (Iterator it = failedTests.iterator(); it.hasNext();) { + sb.append(" <target name=\"test"); + sb.append(f.format(testNumber++)); + sb.append("\">").append(BR); + TestInfos testInfos = (TestInfos) it.next(); + sb.append(testInfos); + sb.append(" </target>").append(BR); + sb.append(BR); + } + + // close the <project> + sb.append("</project>").append(BR); + + // write the whole file + try { + FileOutputStream fos = new FileOutputStream(failureBuildfile); + fos.write(sb.toString().getBytes()); + FileUtils.close(fos); + } catch (FileNotFoundException e) { + throw new BuildException(e); + } catch (IOException e) { + throw new BuildException(e); + } + } + + + /** + * Class for collecting needed information about failed tests. + */ + public class TestInfos implements Comparable { + /** Does the project has a setUp target? */ + boolean projectHasSetup = false; + + /** Does the project has a tearDown target? */ + boolean projectHasTearDown = false; + + /** The called target. */ + String target; + + /** The buildfile of the project. */ + String buildfile; + + /** The error message which was shown. */ + String errorMessage; + + public TestInfos(Project project, String buildfile, String target, String errorMessage) { + projectHasSetup = project.getTargets().containsKey("setUp"); + projectHasTearDown = project.getTargets().containsKey("tearDown"); + this.buildfile = buildfile; + this.target = target; + this.errorMessage = errorMessage; + } + + /** + * Creates an <ant> call according to the stored information. + * @see java.lang.Object#toString() + */ + public String toString() { + StringBuffer sb = new StringBuffer(); + // make the reader of the buildfile happy + sb.append(" <!-- "); + sb.append(errorMessage); + sb.append(" -->").append(BR); + // <ant antfile="" inheritAll="false"> + sb.append(" <ant "); + sb.append("antfile=\""); + sb.append(buildfile.replace('\\', '/')); + sb.append("\" "); + sb.append("inheritAll=\"false\">"); + sb.append(BR); + // <target name=""/> + if (projectHasSetup) { + sb.append(" <target name=\"setUp\"/>").append(BR); + } + sb.append(" <target name=\""); + sb.append(target); + sb.append("\"/>"); + sb.append(BR); + if (projectHasTearDown) { + sb.append(" <target name=\"tearDown\"/>").append(BR); + } + // </ant> + sb.append(" </ant>").append(BR); + return sb.toString(); + } + + // Needed, so that a SortedSet could sort this class into the list. + public int compareTo(Object other) { + if (!(other instanceof TestInfos)) { + return -1; + } else { + TestInfos that = (TestInfos)other; + return this.toString().compareTo(that.toString()); + } + } + } + + + + public void setFile(File file) { + this.failureBuildfile = file; + } + +} --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]