Browse Source

add support to nested XSL parameters in junitreport, Bugzilla 39708

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@418420 13f79535-47bb-0310-9956-ffa450edef68
master
Antoine Levy-Lambert 19 years ago
parent
commit
e7734def8b
9 changed files with 1179 additions and 22 deletions
  1. +2
    -0
      WHATSNEW
  2. +53
    -2
      docs/manual/OptionalTasks/junitreport.html
  3. +42
    -1
      src/etc/testcases/taskdefs/optional/junitreport.xml
  4. +877
    -0
      src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl
  5. +151
    -8
      src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java
  6. +2
    -2
      src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java
  7. +5
    -3
      src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java
  8. +5
    -5
      src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java
  9. +42
    -1
      src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java

+ 2
- 0
WHATSNEW View File

@@ -450,6 +450,8 @@ Other changes:


* <fixcrlf> now supports an outputencoding attribute. Bugzilla report 39697. * <fixcrlf> now supports an outputencoding attribute. Bugzilla report 39697.


* <junitreport> now supports nested XSL parameters. Bugzilla report 39708.

Changes from Ant 1.6.4 to Ant 1.6.5 Changes from Ant 1.6.4 to Ant 1.6.5
=================================== ===================================




+ 53
- 2
docs/manual/OptionalTasks/junitreport.html View File

@@ -95,6 +95,40 @@ element.</p>
<td align="center" valign="top">No. Default to current directory</td> <td align="center" valign="top">No. Default to current directory</td>
</tr> </tr>
</table> </table>
<h3>Nested Element of the report tag</h3>
<h4>param</h4>
<em>Since Ant 1.7</em>the report tag supports nested param tags.
These tags can pass XSL parameters to the stylesheet.
<h3>Parameters</h3>
<table width="60%" 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">name</td>
<td valign="top">Name of the XSL parameter</td>
<td align="center" valign="top">Yes</td>
</tr>
<tr>
<td valign="top">expression</td>
<td valign="top">Text value to be placed into the param.<br>
Was originally intended to be an XSL expression.</td>
<td align="center" valign="top">Yes</td>
</tr>
<tr>
<td valign="top">if</td>
<td valign="top">The param will only passed if this property is set.</td>
<td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">unless</td>
<td valign="top">The param will only passed unless this property is set.</td>
<td align="center" valign="top">No</td>
</tr>

</table>
<h3>Example of report</h3> <h3>Example of report</h3>
<blockquote> <blockquote>
<pre>&lt;junitreport todir=&quot;./reports&quot;&gt; <pre>&lt;junitreport todir=&quot;./reports&quot;&gt;
@@ -107,9 +141,26 @@ element.</p>
</blockquote> </blockquote>
<p>would generate a <tt>TESTS-TestSuites.xml</tt> file in the directory <tt>reports</tt> and <p>would generate a <tt>TESTS-TestSuites.xml</tt> file in the directory <tt>reports</tt> and
generate the default framed report in the directory <tt>report/html</tt>.</p> generate the default framed report in the directory <tt>report/html</tt>.</p>

<h3>Example of report with xsl params</h3>
<blockquote>
<pre>
&lt;junitreport todir="${outputdir}"&gt;
&lt;fileset dir="${jrdir}"&gt;
&lt;include name="TEST-*.xml"/&gt;
&lt;/fileset&gt;
&lt;report todir="${outputdir}/html"
styledir="junitreport"
format="frames"&gt;
&lt;param name="key1" expression="value1"/&gt;
&lt;param name="key2" expression="value2"/&gt;
&lt;/report&gt;
&lt;/junitreport&gt;
</pre>
</blockquote>
<p>This example requires a file called <tt>junitreport/junit-frames.xsl</tt>.
The XSL parameters key1 and key2 will be passed to the XSL transformation.</p>
<hr> <hr>
<p align="center">Copyright &copy; 2001-2002,2004-2005 The Apache Software Foundation. All rights
<p align="center">Copyright &copy; 2001-2002,2004-2006 The Apache Software Foundation. All rights
Reserved.</p> Reserved.</p>
</body> </body>




+ 42
- 1
src/etc/testcases/taskdefs/optional/junitreport.xml View File

@@ -105,4 +105,45 @@
</junitreport> </junitreport>
</target> </target>


</project>
<target name="testWithStyleFromClasspath">
<mkdir dir="${outputdir}/html"/>
<junitreport todir="${outputdir}">
<fileset dir="${jrdir}">
<include name="TEST-*.xml"/>
</fileset>
<report todir="${outputdir}/html"/>
</junitreport>
</target>

<target name="testWithStyleFromDir">
<mkdir dir="${outputdir}/html"/>
<junitreport todir="${outputdir}">
<fileset dir="${jrdir}">
<include name="TEST-*.xml"/>
</fileset>
<report todir="${outputdir}/html"
styledir="junitreport"
format="frames"/>
</junitreport>
</target>

<target name="testWithParams">
<mkdir dir="${outputdir}/html"/>
<junitreport todir="${outputdir}">
<fileset dir="${jrdir}">
<include name="TEST-*.xml"/>
</fileset>
<report todir="${outputdir}/html"
styledir="junitreport"
format="frames">
<param name="key1" expression="value1"/>
<param name="key2" expression="value2"/>
</report>
</junitreport>
<concat>
<fileset file="${outputdir}/html/index.html"/>
</concat>
</target>

</project>

+ 877
- 0
src/etc/testcases/taskdefs/optional/junitreport/junit-frames.xsl View File

@@ -0,0 +1,877 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
xmlns:lxslt="http://xml.apache.org/xslt"
xmlns:redirect="http://xml.apache.org/xalan/redirect"
xmlns:stringutils="xalan://org.apache.tools.ant.util.StringUtils"
extension-element-prefixes="redirect">
<xsl:output method="html" indent="yes" encoding="US-ASCII"/>
<xsl:decimal-format decimal-separator="." grouping-separator=","/>
<!--
Copyright 2001-2006 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.
-->

<!--

Sample stylesheet to be used with Ant JUnitReport output.

It creates a set of HTML files a la javadoc where you can browse easily
through all packages and classes.

-->
<xsl:param name="output.dir" select="'.'"/>
<xsl:param name="key1" select="'defaultValue1'"/>
<xsl:param name="key2" select="'defaultValue2'"/>

<xsl:template match="testsuites">
<!-- create the index.html -->
<redirect:write file="{$output.dir}/index.html">
<xsl:call-template name="index.html"/>
</redirect:write>

<!-- create the stylesheet.css -->
<redirect:write file="{$output.dir}/stylesheet.css">
<xsl:call-template name="stylesheet.css"/>
</redirect:write>

<!-- create the overview-packages.html at the root -->
<redirect:write file="{$output.dir}/overview-summary.html">
<xsl:apply-templates select="." mode="overview.packages"/>
</redirect:write>

<!-- create the all-packages.html at the root -->
<redirect:write file="{$output.dir}/overview-frame.html">
<xsl:apply-templates select="." mode="all.packages"/>
</redirect:write>

<!-- create the all-classes.html at the root -->
<redirect:write file="{$output.dir}/allclasses-frame.html">
<xsl:apply-templates select="." mode="all.classes"/>
</redirect:write>

<!-- create the all-tests.html at the root -->
<redirect:write file="{$output.dir}/all-tests.html">
<xsl:apply-templates select="." mode="all.tests"/>
</redirect:write>

<!-- create the alltests-fails.html at the root -->
<redirect:write file="{$output.dir}/alltests-fails.html">
<xsl:apply-templates select="." mode="all.tests">
<xsl:with-param name="type" select="'fails'"/>
</xsl:apply-templates>
</redirect:write>

<!-- create the alltests-errors.html at the root -->
<redirect:write file="{$output.dir}/alltests-errors.html">
<xsl:apply-templates select="." mode="all.tests">
<xsl:with-param name="type" select="'errors'"/>
</xsl:apply-templates>
</redirect:write>

<!-- process all packages -->
<xsl:for-each select="./testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
<xsl:call-template name="package">
<xsl:with-param name="name" select="@package"/>
</xsl:call-template>
</xsl:for-each>
</xsl:template>


<xsl:template name="package">
<xsl:param name="name"/>
<xsl:variable name="package.dir">
<xsl:if test="not($name = '')"><xsl:value-of select="translate($name,'.','/')"/></xsl:if>
<xsl:if test="$name = ''">.</xsl:if>
</xsl:variable>
<!--Processing package <xsl:value-of select="@name"/> in <xsl:value-of select="$output.dir"/> -->
<!-- create a classes-list.html in the package directory -->
<redirect:write file="{$output.dir}/{$package.dir}/package-frame.html">
<xsl:call-template name="classes.list">
<xsl:with-param name="name" select="$name"/>
</xsl:call-template>
</redirect:write>

<!-- create a package-summary.html in the package directory -->
<redirect:write file="{$output.dir}/{$package.dir}/package-summary.html">
<xsl:call-template name="package.summary">
<xsl:with-param name="name" select="$name"/>
</xsl:call-template>
</redirect:write>

<!-- for each class, creates a @name.html -->
<!-- @bug there will be a problem with inner classes having the same name, it will be overwritten -->
<xsl:for-each select="/testsuites/testsuite[@package = $name]">
<redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}.html">
<xsl:apply-templates select="." mode="class.details"/>
</redirect:write>
<xsl:if test="string-length(./system-out)!=0">
<redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-out.txt">
<xsl:value-of disable-output-escaping="yes" select="./system-out"/>
</redirect:write>
</xsl:if>
<xsl:if test="string-length(./system-err)!=0">
<redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-err.txt">
<xsl:value-of disable-output-escaping="yes" select="./system-err"/>
</redirect:write>
</xsl:if>
<xsl:if test="@failures != 0">
<redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-fails.html">
<xsl:apply-templates select="." mode="class.details">
<xsl:with-param name="type" select="'fails'"/>
</xsl:apply-templates>
</redirect:write>
</xsl:if>
<xsl:if test="@errors != 0">
<redirect:write file="{$output.dir}/{$package.dir}/{@id}_{@name}-errors.html">
<xsl:apply-templates select="." mode="class.details">
<xsl:with-param name="type" select="'errors'"/>
</xsl:apply-templates>
</redirect:write>
</xsl:if>
</xsl:for-each>
</xsl:template>

<xsl:template name="index.html">
<html>
<head>
<title>
Unit Test Results. key1=<xsl:value-of select="$key1"/>,key2=<xsl:value-of select="$key2"/>
</title>
</head>
<frameset cols="20%,80%">
<frameset rows="30%,70%">
<frame src="overview-frame.html" name="packageListFrame"/>
<frame src="allclasses-frame.html" name="classListFrame"/>
</frameset>
<frame src="overview-summary.html" name="classFrame"/>
<noframes>
<h2>Frame Alert</h2>
<p>
This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.
</p>
</noframes>
</frameset>
</html>
</xsl:template>

<!-- this is the stylesheet css to use for nearly everything -->
<xsl:template name="stylesheet.css">
body {
font:normal 68% verdana,arial,helvetica;
color:#000000;
}
table tr td, table tr th {
font-size: 68%;
}
table.details tr th{
font-weight: bold;
text-align:left;
background:#a6caf0;
}
table.details tr td{
background:#eeeee0;
}

p {
line-height:1.5em;
margin-top:0.5em; margin-bottom:1.0em;
}
h1 {
margin: 0px 0px 5px; font: 165% verdana,arial,helvetica
}
h2 {
margin-top: 1em; margin-bottom: 0.5em; font: bold 125% verdana,arial,helvetica
}
h3 {
margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica
}
h4 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
h5 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
h6 {
margin-bottom: 0.5em; font: bold 100% verdana,arial,helvetica
}
.Error {
font-weight:bold; color:red;
}
.Failure {
font-weight:bold; color:purple;
}
.Properties {
text-align:right;
}
</xsl:template>

<!-- Create list of all/failed/errored tests -->
<xsl:template match="testsuites" mode="all.tests">
<xsl:param name="type" select="'all'"/>
<html>
<xsl:variable name="title">
<xsl:choose>
<xsl:when test="$type = 'fails'">
<xsl:text>All Failures</xsl:text>
</xsl:when>
<xsl:when test="$type = 'errors'">
<xsl:text>All Errors</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>All Tests</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<head>
<title>Unit Test Results: <xsl:value-of select="$title"/></title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name"/>
</xsl:call-template>
</head>
<body>
<xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
<xsl:call-template name="pageHeader"/>
<h2><xsl:value-of select="$title"/></h2>

<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testcase.test.header">
<xsl:with-param name="show.class" select="'yes'"/>
</xsl:call-template>
<!--
test can even not be started at all (failure to load the class)
so report the error directly
-->
<xsl:if test="./error">
<tr class="Error">
<td colspan="4">
<xsl:apply-templates select="./error"/>
</td>
</tr>
</xsl:if>
<xsl:choose>
<xsl:when test="$type = 'fails'">
<xsl:apply-templates select=".//testcase[failure]" mode="print.test">
<xsl:with-param name="show.class" select="'yes'"/>
</xsl:apply-templates>
</xsl:when>
<xsl:when test="$type = 'errors'">
<xsl:apply-templates select=".//testcase[error]" mode="print.test">
<xsl:with-param name="show.class" select="'yes'"/>
</xsl:apply-templates>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select=".//testcase" mode="print.test">
<xsl:with-param name="show.class" select="'yes'"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</table>
</body>
</html>
</xsl:template>


<!-- ======================================================================
This page is created for every testsuite class.
It prints a summary of the testsuite and detailed information about
testcase methods.
====================================================================== -->
<xsl:template match="testsuite" mode="class.details">
<xsl:param name="type" select="'all'"/>
<xsl:variable name="package.name" select="@package"/>
<xsl:variable name="class.name"><xsl:if test="not($package.name = '')"><xsl:value-of select="$package.name"/>.</xsl:if><xsl:value-of select="@name"/></xsl:variable>
<html>
<head>
<title>Unit Test Results: <xsl:value-of select="$class.name"/></title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name" select="$package.name"/>
</xsl:call-template>
<script type="text/javascript" language="JavaScript">
var TestCases = new Array();
var cur;
<xsl:apply-templates select="properties"/>
</script>
<script type="text/javascript" language="JavaScript"><![CDATA[
function displayProperties (name) {
var win = window.open('','JUnitSystemProperties','scrollbars=1,resizable=1');
var doc = win.document;
doc.open();
doc.write("<html><head><title>Properties of " + name + "</title>");
doc.write("<style type=\"text/css\">");
doc.write("body {font:normal 68% verdana,arial,helvetica; color:#000000; }");
doc.write("table tr td, table tr th { font-size: 68%; }");
doc.write("table.properties { border-collapse:collapse; border-left:solid 1 #cccccc; border-top:solid 1 #cccccc; padding:5px; }");
doc.write("table.properties th { text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#eeeeee; }");
doc.write("table.properties td { font:normal; text-align:left; border-right:solid 1 #cccccc; border-bottom:solid 1 #cccccc; background-color:#fffffff; }");
doc.write("h3 { margin-bottom: 0.5em; font: bold 115% verdana,arial,helvetica }");
doc.write("</style>");
doc.write("</head><body>");
doc.write("<h3>Properties of " + name + "</h3>");
doc.write("<div align=\"right\"><a href=\"javascript:window.close();\">Close</a></div>");
doc.write("<table class='properties'>");
doc.write("<tr><th>Name</th><th>Value</th></tr>");
for (prop in TestCases[name]) {
doc.write("<tr><th>" + prop + "</th><td>" + TestCases[name][prop] + "</td></tr>");
}
doc.write("</table>");
doc.write("</body></html>");
doc.close();
win.focus();
}
]]>
</script>
</head>
<body>
<xsl:call-template name="pageHeader"/>
<h3>Class <xsl:value-of select="$class.name"/></h3>


<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testsuite.test.header"/>
<xsl:apply-templates select="." mode="print.test"/>
</table>

<xsl:choose>
<xsl:when test="$type = 'fails'">
<h2>Failures</h2>
</xsl:when>
<xsl:when test="$type = 'errors'">
<h2>Errors</h2>
</xsl:when>
<xsl:otherwise>
<h2>Tests</h2>
</xsl:otherwise>
</xsl:choose>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testcase.test.header"/>
<!--
test can even not be started at all (failure to load the class)
so report the error directly
-->
<xsl:if test="./error">
<tr class="Error">
<td colspan="4"><xsl:apply-templates select="./error"/></td>
</tr>
</xsl:if>
<xsl:choose>
<xsl:when test="$type = 'fails'">
<xsl:apply-templates select="./testcase[failure]" mode="print.test"/>
</xsl:when>
<xsl:when test="$type = 'errors'">
<xsl:apply-templates select="./testcase[error]" mode="print.test"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="./testcase" mode="print.test"/>
</xsl:otherwise>
</xsl:choose>
</table>
<div class="Properties">
<a>
<xsl:attribute name="href">javascript:displayProperties('<xsl:value-of select="@package"/>.<xsl:value-of select="@name"/>');</xsl:attribute>
Properties &#187;
</a>
</div>
<xsl:if test="string-length(./system-out)!=0">
<div class="Properties">
<a>
<xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-out.txt</xsl:attribute>
System.out &#187;
</a>
</div>
</xsl:if>
<xsl:if test="string-length(./system-err)!=0">
<div class="Properties">
<a>
<xsl:attribute name="href">./<xsl:value-of select="@id"/>_<xsl:value-of select="@name"/>-err.txt</xsl:attribute>
System.err &#187;
</a>
</div>
</xsl:if>
</body>
</html>
</xsl:template>

<!--
Write properties into a JavaScript data structure.
This is based on the original idea by Erik Hatcher (ehatcher@apache.org)
-->
<xsl:template match="properties">
cur = TestCases['<xsl:value-of select="../@package"/>.<xsl:value-of select="../@name"/>'] = new Array();
<xsl:for-each select="property">
<xsl:sort select="@name"/>
cur['<xsl:value-of select="@name"/>'] = '<xsl:call-template name="JS-escape"><xsl:with-param name="string" select="@value"/></xsl:call-template>';
</xsl:for-each>
</xsl:template>


<!-- ======================================================================
This page is created for every package.
It prints the name of all classes that belongs to this package.
@param name the package name to print classes.
====================================================================== -->
<!-- list of classes in a package -->
<xsl:template name="classes.list">
<xsl:param name="name"/>
<html>
<head>
<title>Unit Test Classes: <xsl:value-of select="$name"/></title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name" select="$name"/>
</xsl:call-template>
</head>
<body>
<table width="100%">
<tr>
<td nowrap="nowrap">
<h2><a href="package-summary.html" target="classFrame">
<xsl:value-of select="$name"/>
<xsl:if test="$name = ''">&lt;none&gt;</xsl:if>
</a></h2>
</td>
</tr>
</table>

<h2>Classes</h2>
<table width="100%">
<xsl:for-each select="/testsuites/testsuite[./@package = $name]">
<xsl:sort select="@name"/>
<tr>
<td nowrap="nowrap">
<a href="{@id}_{@name}.html" target="classFrame"><xsl:value-of select="@name"/></a>
</td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>


<!--
Creates an all-classes.html file that contains a link to all package-summary.html
on each class.
-->
<xsl:template match="testsuites" mode="all.classes">
<html>
<head>
<title>All Unit Test Classes</title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name"/>
</xsl:call-template>
</head>
<body>
<h2>Classes</h2>
<table width="100%">
<xsl:apply-templates select="testsuite" mode="all.classes">
<xsl:sort select="@name"/>
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="testsuite" mode="all.classes">
<xsl:variable name="package.name" select="@package"/>
<tr>
<td nowrap="nowrap">
<a target="classFrame">
<xsl:attribute name="href">
<xsl:if test="not($package.name='')">
<xsl:value-of select="translate($package.name,'.','/')"/><xsl:text>/</xsl:text>
</xsl:if><xsl:value-of select="@id"/>_<xsl:value-of select="@name"/><xsl:text>.html</xsl:text>
</xsl:attribute>
<xsl:value-of select="@name"/>
</a>
</td>
</tr>
</xsl:template>


<!--
Creates an html file that contains a link to all package-summary.html files on
each package existing on testsuites.
@bug there will be a problem here, I don't know yet how to handle unnamed package :(
-->
<xsl:template match="testsuites" mode="all.packages">
<html>
<head>
<title>All Unit Test Packages</title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name"/>
</xsl:call-template>
</head>
<body>
<h2><a href="overview-summary.html" target="classFrame">Home</a></h2>
<h2>Packages</h2>
<table width="100%">
<xsl:apply-templates select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]" mode="all.packages">
<xsl:sort select="@package"/>
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="testsuite" mode="all.packages">
<tr>
<td nowrap="nowrap">
<a href="./{translate(@package,'.','/')}/package-summary.html" target="classFrame">
<xsl:value-of select="@package"/>
<xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
</a>
</td>
</tr>
</xsl:template>


<xsl:template match="testsuites" mode="overview.packages">
<html>
<head>
<title>Unit Test Results: Summary</title>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name"/>
</xsl:call-template>
</head>
<body>
<xsl:attribute name="onload">open('allclasses-frame.html','classListFrame')</xsl:attribute>
<xsl:call-template name="pageHeader"/>
<h2>Summary</h2>
<xsl:variable name="testCount" select="sum(testsuite/@tests)"/>
<xsl:variable name="errorCount" select="sum(testsuite/@errors)"/>
<xsl:variable name="failureCount" select="sum(testsuite/@failures)"/>
<xsl:variable name="timeCount" select="sum(testsuite/@time)"/>
<xsl:variable name="successRate" select="($testCount - $failureCount - $errorCount) div $testCount"/>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<tr valign="top">
<th>Tests</th>
<th>Failures</th>
<th>Errors</th>
<th>Success rate</th>
<th>Time</th>
</tr>
<tr valign="top">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="$errorCount &gt; 0">Error</xsl:when>
<xsl:when test="$failureCount &gt; 0">Failure</xsl:when>
<xsl:otherwise>Pass</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<td><a title="Display all tests" href="all-tests.html"><xsl:value-of select="$testCount"/></a></td>
<td><a title="Display all failures" href="alltests-fails.html"><xsl:value-of select="$failureCount"/></a></td>
<td><a title="Display all errors" href="alltests-errors.html"><xsl:value-of select="$errorCount"/></a></td>
<td>
<xsl:call-template name="display-percent">
<xsl:with-param name="value" select="$successRate"/>
</xsl:call-template>
</td>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="$timeCount"/>
</xsl:call-template>
</td>
</tr>
</table>
<table border="0" width="95%">
<tr>
<td style="text-align: justify;">
Note: <em>failures</em> are anticipated and checked for with assertions while <em>errors</em> are unanticipated.
</td>
</tr>
</table>

<h2>Packages</h2>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testsuite.test.header"/>
<xsl:for-each select="testsuite[not(./@package = preceding-sibling::testsuite/@package)]">
<xsl:sort select="@package" order="ascending"/>
<!-- get the node set containing all testsuites that have the same package -->
<xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = current()/@package]"/>
<tr valign="top">
<!-- display a failure if there is any failure/error in the package -->
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="sum($insamepackage/@errors) &gt; 0">Error</xsl:when>
<xsl:when test="sum($insamepackage/@failures) &gt; 0">Failure</xsl:when>
<xsl:otherwise>Pass</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<td><a href="./{translate(@package,'.','/')}/package-summary.html">
<xsl:value-of select="@package"/>
<xsl:if test="@package = ''">&lt;none&gt;</xsl:if>
</a></td>
<td><xsl:value-of select="sum($insamepackage/@tests)"/></td>
<td><xsl:value-of select="sum($insamepackage/@errors)"/></td>
<td><xsl:value-of select="sum($insamepackage/@failures)"/></td>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="sum($insamepackage/@time)"/>
</xsl:call-template>
</td>
<td><xsl:value-of select="$insamepackage/@timestamp"/></td>
<td><xsl:value-of select="$insamepackage/@hostname"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>


<xsl:template name="package.summary">
<xsl:param name="name"/>
<html>
<head>
<xsl:call-template name="create.stylesheet.link">
<xsl:with-param name="package.name" select="$name"/>
</xsl:call-template>
</head>
<body>
<xsl:attribute name="onload">open('package-frame.html','classListFrame')</xsl:attribute>
<xsl:call-template name="pageHeader"/>
<h3>Package <xsl:value-of select="$name"/></h3>

<!--table border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="class.metrics.header"/>
<xsl:apply-templates select="." mode="print.metrics"/>
</table-->

<xsl:variable name="insamepackage" select="/testsuites/testsuite[./@package = $name]"/>
<xsl:if test="count($insamepackage) &gt; 0">
<h2>Classes</h2>
<p>
<table class="details" border="0" cellpadding="5" cellspacing="2" width="95%">
<xsl:call-template name="testsuite.test.header"/>
<xsl:apply-templates select="$insamepackage" mode="print.test">
<xsl:sort select="@name"/>
</xsl:apply-templates>
</table>
</p>
</xsl:if>
</body>
</html>
</xsl:template>


<!--
transform string like a.b.c to ../../../
@param path the path to transform into a descending directory path
-->
<xsl:template name="path">
<xsl:param name="path"/>
<xsl:if test="contains($path,'.')">
<xsl:text>../</xsl:text>
<xsl:call-template name="path">
<xsl:with-param name="path"><xsl:value-of select="substring-after($path,'.')"/></xsl:with-param>
</xsl:call-template>
</xsl:if>
<xsl:if test="not(contains($path,'.')) and not($path = '')">
<xsl:text>../</xsl:text>
</xsl:if>
</xsl:template>


<!-- create the link to the stylesheet based on the package name -->
<xsl:template name="create.stylesheet.link">
<xsl:param name="package.name"/>
<link rel="stylesheet" type="text/css" title="Style"><xsl:attribute name="href"><xsl:if test="not($package.name = 'unnamed package')"><xsl:call-template name="path"><xsl:with-param name="path" select="$package.name"/></xsl:call-template></xsl:if>stylesheet.css</xsl:attribute></link>
</xsl:template>


<!-- Page HEADER -->
<xsl:template name="pageHeader">
<h1>Unit Test Results</h1>
<table width="100%">
<tr>
<td align="left"></td>
<td align="right">Designed for use with <a href="http://www.junit.org/">JUnit</a> and <a href="http://ant.apache.org/">Ant</a>.</td>
</tr>
</table>
<hr size="1"/>
</xsl:template>

<!-- class header -->
<xsl:template name="testsuite.test.header">
<tr valign="top">
<th width="80%">Name</th>
<th>Tests</th>
<th>Errors</th>
<th>Failures</th>
<th nowrap="nowrap">Time(s)</th>
<th nowrap="nowrap">Time Stamp</th>
<th>Host</th>
</tr>
</xsl:template>

<!-- method header -->
<xsl:template name="testcase.test.header">
<xsl:param name="show.class" select="''"/>
<tr valign="top">
<xsl:if test="boolean($show.class)">
<th>Class</th>
</xsl:if>
<th>Name</th>
<th>Status</th>
<th width="80%">Type</th>
<th nowrap="nowrap">Time(s)</th>
</tr>
</xsl:template>


<!-- class information -->
<xsl:template match="testsuite" mode="print.test">
<tr valign="top">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="@errors[.&gt; 0]">Error</xsl:when>
<xsl:when test="@failures[.&gt; 0]">Failure</xsl:when>
<xsl:otherwise>Pass</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<td><a title="Display all tests" href="{@id}_{@name}.html"><xsl:value-of select="@name"/></a></td>
<td><a title="Display all tests" href="{@id}_{@name}.html"><xsl:apply-templates select="@tests"/></a></td>
<td>
<xsl:choose>
<xsl:when test="@errors != 0">
<a title="Display only errors" href="{@id}_{@name}-errors.html"><xsl:apply-templates select="@errors"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@errors"/>
</xsl:otherwise>
</xsl:choose>
</td>
<td>
<xsl:choose>
<xsl:when test="@failures != 0">
<a title="Display only failures" href="{@id}_{@name}-fails.html"><xsl:apply-templates select="@failures"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="@failures"/>
</xsl:otherwise>
</xsl:choose>
</td>
<td><xsl:call-template name="display-time">
<xsl:with-param name="value" select="@time"/>
</xsl:call-template>
</td>
<td><xsl:apply-templates select="@timestamp"/></td>
<td><xsl:apply-templates select="@hostname"/></td>
</tr>
</xsl:template>

<xsl:template match="testcase" mode="print.test">
<xsl:param name="show.class" select="''"/>
<tr valign="top">
<xsl:attribute name="class">
<xsl:choose>
<xsl:when test="error">Error</xsl:when>
<xsl:when test="failure">Failure</xsl:when>
<xsl:otherwise>TableRowColor</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
<xsl:variable name="class.href">
<xsl:value-of select="concat(translate(../@package,'.','/'), '/', ../@id, '_', ../@name, '.html')"/>
</xsl:variable>
<xsl:if test="boolean($show.class)">
<td><a href="{$class.href}"><xsl:value-of select="../@name"/></a></td>
</xsl:if>
<td>
<a name="{@name}"/>
<xsl:choose>
<xsl:when test="boolean($show.class)">
<a href="{concat($class.href, '#', @name)}"><xsl:value-of select="@name"/></a>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@name"/>
</xsl:otherwise>
</xsl:choose>
</td>
<xsl:choose>
<xsl:when test="failure">
<td>Failure</td>
<td><xsl:apply-templates select="failure"/></td>
</xsl:when>
<xsl:when test="error">
<td>Error</td>
<td><xsl:apply-templates select="error"/></td>
</xsl:when>
<xsl:otherwise>
<td>Success</td>
<td></td>
</xsl:otherwise>
</xsl:choose>
<td>
<xsl:call-template name="display-time">
<xsl:with-param name="value" select="@time"/>
</xsl:call-template>
</td>
</tr>
</xsl:template>


<!-- Note : the below template error and failure are the same style
so just call the same style store in the toolkit template -->
<xsl:template match="failure">
<xsl:call-template name="display-failures"/>
</xsl:template>

<xsl:template match="error">
<xsl:call-template name="display-failures"/>
</xsl:template>

<!-- Style for the error and failure in the testcase template -->
<xsl:template name="display-failures">
<xsl:choose>
<xsl:when test="not(@message)">N/A</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@message"/>
</xsl:otherwise>
</xsl:choose>
<!-- display the stacktrace -->
<br/><br/>
<code>
<xsl:call-template name="br-replace">
<xsl:with-param name="word" select="."/>
</xsl:call-template>
</code>
<!-- the latter is better but might be problematic for non-21" monitors... -->
<!--pre><xsl:value-of select="."/></pre-->
</xsl:template>

<xsl:template name="JS-escape">
<xsl:param name="string"/>
<xsl:param name="tmp1" select="stringutils:replace(string($string),'\','\\')"/>
<xsl:param name="tmp2" select="stringutils:replace(string($tmp1),&quot;'&quot;,&quot;\&apos;&quot;)"/>
<xsl:value-of select="$tmp2"/>
</xsl:template>


<!--
template that will convert a carriage return into a br tag
@param word the text from which to convert CR to BR tag
-->
<xsl:template name="br-replace">
<xsl:param name="word"/>
<xsl:value-of disable-output-escaping="yes" select='stringutils:replace(string($word),"&#xA;","&lt;br/>")'/>
</xsl:template>

<xsl:template name="display-time">
<xsl:param name="value"/>
<xsl:value-of select="format-number($value,'0.000')"/>
</xsl:template>

<xsl:template name="display-percent">
<xsl:param name="value"/>
<xsl:value-of select="format-number($value,'0.00%')"/>
</xsl:template>
</xsl:stylesheet>

+ 151
- 8
src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2002,2004 The Apache Software Foundation
* Copyright 2001-2002,2004,2006 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -21,14 +21,29 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;

import java.net.URL; import java.net.URL;

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task; import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.XSLTProcess;
import org.apache.tools.ant.taskdefs.Delete;
import org.apache.tools.ant.taskdefs.TempFile;
import org.apache.tools.ant.util.JAXPUtils; import org.apache.tools.ant.util.JAXPUtils;
import org.apache.tools.ant.util.FileUtils;
import org.apache.tools.ant.types.EnumeratedAttribute; import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.resources.URLResource;
import org.apache.tools.ant.types.resources.FileResource;

import org.w3c.dom.Document; import org.w3c.dom.Document;


/** /**
@@ -40,12 +55,24 @@ import org.w3c.dom.Document;
* *
*/ */
public class AggregateTransformer { public class AggregateTransformer {

/**
* name of the frames format.
*/
public static final String FRAMES = "frames"; public static final String FRAMES = "frames";


/**
* name of the no frames format.
*/
public static final String NOFRAMES = "noframes"; public static final String NOFRAMES = "noframes";


/**
* defines acceptable formats.
*/
public static class Format extends EnumeratedAttribute { public static class Format extends EnumeratedAttribute {
/**
* list authorized values.
* @return authorized values.
*/
public String[] getValues() { public String[] getValues() {
return new String[]{FRAMES, NOFRAMES}; return new String[]{FRAMES, NOFRAMES};
} }
@@ -63,6 +90,25 @@ public class AggregateTransformer {
/** the destination directory, this is the root from where html should be generated */ /** the destination directory, this is the root from where html should be generated */
protected File toDir; protected File toDir;


/**
* The params that will be sent to the XSL transformation
*
* @since Ant 1.7
*/
private List params;

/**
* Instance of a utility class to use for file operations.
*
* @since Ant 1.7
*/
private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();

/**
* Used to ensure the uniqueness of a property
*/
private static int counter = 0;

/** the format to use for the report. Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> */ /** the format to use for the report. Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> */
protected String format = FRAMES; protected String format = FRAMES;


@@ -77,8 +123,13 @@ public class AggregateTransformer {
dbfactory = privateDBFactory; dbfactory = privateDBFactory;
} }


/**
* constructor creating the transformer from the junitreport task.
* @param task task delegating to this class
*/
public AggregateTransformer(Task task) { public AggregateTransformer(Task task) {
this.task = task; this.task = task;
params = new Vector();
} }


/** /**
@@ -90,10 +141,18 @@ public class AggregateTransformer {
return privateDBFactory; return privateDBFactory;
} }


/**
* sets the format.
* @param format Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt>
*/
public void setFormat(Format format) { public void setFormat(Format format) {
this.format = format.getValue(); this.format = format.getValue();
} }


/**
* sets the input document.
* @param doc input dom tree
*/
public void setXmlDocument(Document doc) { public void setXmlDocument(Document doc) {
this.document = doc; this.document = doc;
} }
@@ -102,6 +161,7 @@ public class AggregateTransformer {
* Set the xml file to be processed. This is a helper if you want * Set the xml file to be processed. This is a helper if you want
* to set the file directly. Much more for testing purposes. * to set the file directly. Much more for testing purposes.
* @param xmlfile xml file to be processed * @param xmlfile xml file to be processed
* @throws BuildException if the document cannot be parsed.
*/ */
protected void setXmlfile(File xmlfile) throws BuildException { protected void setXmlfile(File xmlfile) throws BuildException {
try { try {
@@ -128,31 +188,113 @@ public class AggregateTransformer {
this.styleDir = styledir; this.styleDir = styledir;
} }


/** set the destination directory */
/** set the destination directory.
* @param todir the destination directory
*/
public void setTodir(File todir) { public void setTodir(File todir) {
this.toDir = todir; this.toDir = todir;
} }


/** set the extension of the output files */
/** set the extension of the output files
* @param ext extension.
*/
public void setExtension(String ext) { public void setExtension(String ext) {
task.log("extension is not used anymore", Project.MSG_WARN); task.log("extension is not used anymore", Project.MSG_WARN);
} }


/**
* Create an instance of an XSL parameter for configuration by Ant.
*
* @return an instance of the Param class to be configured.
* @since Ant 1.7
*/
public XSLTProcess.Param createParam() {
XSLTProcess.Param p = new XSLTProcess.Param();
params.add(p);
return p;
}

/**
* transformation
* @throws BuildException exception if something goes wrong with the transformation.
*/
public void transform() throws BuildException { public void transform() throws BuildException {
checkOptions(); checkOptions();
Project project = task.getProject();

TempFile tempFileTask = new TempFile();
tempFileTask.bindToOwner(task);
String tempFileProperty = getClass().getName() + String.valueOf(counter++);
File tmp = FILE_UTILS.resolveFile(project.getBaseDir(),
project.getProperty("java.io.tmpdir"));
tempFileTask.setDestDir(tmp);
tempFileTask.setProperty(tempFileProperty);
tempFileTask.execute();

XSLTProcess xsltTask = new XSLTProcess();
xsltTask.bindToOwner(task);

xsltTask.addConfigured(getStylesheet());
// acrobatic cast.
xsltTask.setIn(((XMLResultAggregator) task).getDestinationFile());
File dummyFile = new File(project.getProperty(tempFileProperty));
xsltTask.setOut(dummyFile);
for (Iterator i = params.iterator(); i.hasNext();) {
XSLTProcess.Param param = (XSLTProcess.Param) i.next();
XSLTProcess.Param newParam = xsltTask.createParam();
newParam.setProject(task.getProject());
newParam.setName(param.getName());
newParam.setExpression(param.getExpression());
}
XSLTProcess.Param paramx = xsltTask.createParam();
paramx.setProject(task.getProject());
paramx.setName("output.dir");
paramx.setExpression(toDir.getAbsolutePath());
final long t0 = System.currentTimeMillis(); final long t0 = System.currentTimeMillis();
XalanExecutor executor = XalanExecutor.newInstance(this);
try { try {
executor.execute();
xsltTask.execute();
} catch (Exception e) { } catch (Exception e) {
throw new BuildException("Errors while applying transformations: " throw new BuildException("Errors while applying transformations: "
+ e.getMessage(), e);
+ e.getMessage(), e);
} }
final long dt = System.currentTimeMillis() - t0; final long dt = System.currentTimeMillis() - t0;
task.log("Transform time: " + dt + "ms"); task.log("Transform time: " + dt + "ms");
Delete delete = new Delete();
delete.bindToOwner(task);
delete.setFile(dummyFile);
delete.execute();
} }


/** check for invalid options */
/**
* access the stylesheet to be used as a resource.
* @return stylesheet as a resource
*/
protected Resource getStylesheet() {
String xslname = "junit-frames.xsl";
if (NOFRAMES.equals(format)) {
xslname = "junit-noframes.xsl";
}
if (styleDir == null) {
// If style dir is not specified we have to retrieve
// the stylesheet from the classloader
URLResource stylesheet = new URLResource();
URL stylesheetURL = getClass().getClassLoader().getResource(
"org/apache/tools/ant/taskdefs/optional/junit/xsl/" + xslname);
stylesheet.setURL(stylesheetURL);
return stylesheet;
}
// If we are here, then the style dir is here and we
// should read the stylesheet from the filesystem
FileResource stylesheet = new FileResource();
File stylesheetFile = new File(styleDir, xslname);
stylesheet.setFile(stylesheetFile);
return stylesheet;
}


/** check for invalid options
* @throws BuildException if something goes wrong.
*/
protected void checkOptions() throws BuildException { protected void checkOptions() throws BuildException {
// set the destination directory relative from the project if needed. // set the destination directory relative from the project if needed.
if (toDir == null) { if (toDir == null) {
@@ -167,6 +309,7 @@ public class AggregateTransformer {
* name and styledir. If no styledir is defined it will load * name and styledir. If no styledir is defined it will load
* it as a java resource in the xsl child package, otherwise it * it as a java resource in the xsl child package, otherwise it
* will get it from the given directory. * will get it from the given directory.
* @return system ID of the stylesheet.
* @throws IOException thrown if the requested stylesheet does * @throws IOException thrown if the requested stylesheet does
* not exist. * not exist.
*/ */


+ 2
- 2
src/main/org/apache/tools/ant/taskdefs/optional/junit/XMLResultAggregator.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2005 The Apache Software Foundation
* Copyright 2001-2006 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -158,7 +158,7 @@ public class XMLResultAggregator extends Task implements XMLConstants {
* the <tt>todir</tt> and <tt>tofile</tt> attributes. * the <tt>todir</tt> and <tt>tofile</tt> attributes.
* @return the destination file where should be written the result file. * @return the destination file where should be written the result file.
*/ */
protected File getDestinationFile() {
public File getDestinationFile() {
if (toFile == null) { if (toFile == null) {
toFile = DEFAULT_FILENAME; toFile = DEFAULT_FILENAME;
} }


+ 5
- 3
src/main/org/apache/tools/ant/taskdefs/optional/junit/Xalan2Executor.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2002,2004 The Apache Software Foundation
* Copyright 2001-2002,2004,2006 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -28,8 +28,10 @@ import javax.xml.transform.stream.StreamSource;
import org.apache.tools.ant.BuildException; import org.apache.tools.ant.BuildException;


/** /**
* Xalan executor via JAXP. Nothing special must exists in the classpath
* besides of course, a parser, jaxp and xalan.
* This class is not used by the framework any more.
* We plan to remove it in Ant 1.8
* @deprecated since Ant 1.7
*
* *
* @ant.task ignore="true" * @ant.task ignore="true"
*/ */


+ 5
- 5
src/main/org/apache/tools/ant/taskdefs/optional/junit/XalanExecutor.java View File

@@ -1,5 +1,5 @@
/* /*
* Copyright 2001-2005 The Apache Software Foundation
* Copyright 2001-2006 The Apache Software Foundation
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -27,10 +27,10 @@ import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project; import org.apache.tools.ant.Project;


/** /**
* Command class that encapsulate specific behavior for each
* Xalan version. The right executor will be instantiated at
* runtime via class lookup. For instance, it will check first
* for Xalan2/XSLTC, then for Xalan1.
* This class is not used by the framework any more.
* We plan to remove it in Ant 1.8
* @deprecated since Ant 1.7
*
*/ */
abstract class XalanExecutor { abstract class XalanExecutor {
private static final String PACKAGE = private static final String PACKAGE =


+ 42
- 1
src/testcases/org/apache/tools/ant/taskdefs/optional/junit/JUnitReportTest.java View File

@@ -122,6 +122,7 @@ public class JUnitReportTest extends BuildFileTest {
InputStream reportStream = reportUrl.openStream(); InputStream reportStream = reportUrl.openStream();
assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0);
} }

public void testSpecialSignsInHtmlPath() throws Exception { public void testSpecialSignsInHtmlPath() throws Exception {
executeTarget("testSpecialSignsInHtmlPath"); executeTarget("testSpecialSignsInHtmlPath");
File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html# $%\u00A7&-!report/index.html"); File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html# $%\u00A7&-!report/index.html");
@@ -134,4 +135,44 @@ public class JUnitReportTest extends BuildFileTest {
InputStream reportStream = reportUrl.openStream(); InputStream reportStream = reportUrl.openStream();
assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0); assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0);
} }
}

//Bugzilla Report 39708
public void testWithStyleFromDir() throws Exception {
executeTarget("testWithStyleFromDir");
File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html");
// tests one the file object
assertTrue("No index.html present. Not generated?", reportFile.exists() );
assertTrue("Cant read the report file.", reportFile.canRead() );
assertTrue("File shouldnt be empty.", reportFile.length() > 0 );
// conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report
URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) );
InputStream reportStream = reportUrl.openStream();
assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0);
}

public void testWithStyleFromClasspath() throws Exception {
executeTarget("testWithStyleFromClasspath");
File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html");
// tests one the file object
assertTrue("No index.html present. Not generated?", reportFile.exists() );
assertTrue("Cant read the report file.", reportFile.canRead() );
assertTrue("File shouldnt be empty.", reportFile.length() > 0 );
// conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report
URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) );
InputStream reportStream = reportUrl.openStream();
assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0);
}

public void testWithParams() throws Exception {
expectLogContaining("testWithParams", "key1=value1,key2=value2");
File reportFile = new File(System.getProperty("root"), "src/etc/testcases/taskdefs/optional/junitreport/test/html/index.html");
// tests one the file object
assertTrue("No index.html present. Not generated?", reportFile.exists() );
assertTrue("Cant read the report file.", reportFile.canRead() );
assertTrue("File shouldnt be empty.", reportFile.length() > 0 );
// conversion to URL via FileUtils like in XMLResultAggregator, not as suggested in the bug report
URL reportUrl = new URL( FileUtils.getFileUtils().toURI(reportFile.getAbsolutePath()) );
InputStream reportStream = reportUrl.openStream();
assertTrue("This shouldnt be an empty stream.", reportStream.available() > 0);
}
}

Loading…
Cancel
Save