git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276793 13f79535-47bb-0310-9956-ffa450edef68master
@@ -32,8 +32,6 @@ Short term goals are: | |||
* A <wix> task. | |||
Mid term goals: | |||
* A <nunit> task. | |||
Those tasks should end up in an antlib of their own in order to be | |||
@@ -112,6 +112,10 @@ | |||
tool, untested.</li> | |||
<li><a href="wix.html">wix</a> - execute the WiX toolset, untested.</li> | |||
<li><a href="nunit.html">nunit</a> - execute the | |||
nunit-console.exe <a href="http://www.nunit.org/">NUnit</a> | |||
test runner.</li> | |||
</ul> | |||
<hr/> | |||
@@ -0,0 +1,177 @@ | |||
<html> | |||
<head> | |||
<meta http-equiv="Content-Language" content="en-us"></meta> | |||
<title>NUnit Task</title> | |||
</head> | |||
<body> | |||
<h2><a name="dotnetexec">NUnit</a></h2> | |||
<h3>Description</h3> | |||
<p>Runs the <a href="http://www.nunit.org/">NUnit</a> console | |||
test runner.</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">vm</td> | |||
<td valign="top">Same as <a | |||
href="dotnetexec.html">dotnetexec</a>'s vm attribute. | |||
Specify the framework to use.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">config</td> | |||
<td valign="top">Config file to use</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">output</td> | |||
<td valign="top">Where test output should go.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">error</td> | |||
<td valign="top">Where test error output should go.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">xmlout</td> | |||
<td valign="top">Where NUnit's XML output should go.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">transform</td> | |||
<td valign="top">The transformation to apply.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">thread</td> | |||
<td valign="top">Causes a separate thread to be created for | |||
running the tests - see the NUnit documentation for | |||
details.</td> | |||
<td align="center">No - defaults to false.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">noshadow</td> | |||
<td valign="top">Disables shadow copying of the assembly in | |||
order to provide improved performance..</td> | |||
<td align="center">No - defaults to false.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">fixture</td> | |||
<td valign="top">Test fixture to run.</td> | |||
<td align="center">No.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">labels</td> | |||
<td valign="top">Causes an identifying label to be displayed | |||
at the start of each test case.</td> | |||
<td align="center">No - defaults to false.</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">failOnError</td> | |||
<td valign="top">Stops the build if NUnit returns with a code | |||
indicating an error or failure.</td> | |||
<td align="center">No - defaults to false.</td> | |||
</tr> | |||
</table> | |||
<h3>Parameters specified as nested elements</h3> | |||
<h4>testassembly</h4> | |||
<p><code>testassembly</code> has a single required attribute name - | |||
specifies an assembly or a project file holding tests.</p> | |||
<h4>include/exclude</h4> | |||
<p><code>in/exclude</code> have a single required attribute name - | |||
specifies a category to include or exclude from the tests.</p> | |||
<p><b>Note</b> that in current versions of NUnit (up to 2.2) you | |||
may choose to either include or exclude categories in a run, but | |||
not both. This task does <b>not</b> enforce this restriction | |||
since future versions of NUnit may change behavior.</p> | |||
<h4>redirector</h4> | |||
<p>A nested <a | |||
href="http://ant.apache.org/manual/CoreTypes/redirector.html">I/O | |||
Redirector</a> can be specified. Any file mapping is done using a | |||
<code>null</code> sourcefile; therefore not all <a | |||
href="http://ant.apache.org/manual/CoreTypes/mapper.html">Mapper</a> | |||
types will return results.</p> | |||
<h4>env</h4> <p>It is possible to specify environment variables to | |||
pass to the system command via nested <code><env></code> | |||
elements. They support the same attributes as the nested <a | |||
href="http://ant.apache.org/manual/CoreTasks/exec.html#env"><code>env</code> | |||
element of the <code><exec></code> task</a>.</p> | |||
<h3>Examples</h3> | |||
<h4>Specify an assembly or project:</h4> | |||
<pre> | |||
<nunit> | |||
<testassembly name="nunit.tests.dll"/> | |||
</nunit> | |||
</pre> | |||
<p>or</p> | |||
<pre> | |||
<nunit> | |||
<testassembly name="nunit.tests.csproj"/> | |||
</nunit> | |||
</pre> | |||
<h4>Specifying an Assembly and a Fixture</h4> | |||
<pre> | |||
<nunit fixture="NUnit.Tests.AssertionTests"> | |||
<testassembly name="nunit.tests.dll"/> | |||
</nunit> | |||
</pre> | |||
<h4>Specifying Test Categories to Include</h4> | |||
<pre> | |||
<nunit> | |||
<testassembly name="nunit.tests.dll"/> | |||
<include name="Baseline"/> | |||
</nunit> | |||
</pre> | |||
<h4>Specifying the XML file name</h4> | |||
<pre> | |||
<nunit xmlout="console-test.xml"> | |||
<testassembly name="nunit.tests.dll"/> | |||
</nunit> | |||
</pre> | |||
<p>changes the name of the output file to "console-test.xml" - | |||
note that this task will resolve file names relative to the | |||
project's base directory, not the current working directory.</p> | |||
<h4>Specifying Multiple Assemblies</h4> | |||
<pre> | |||
<nunit> | |||
<testassembly name="assembly1.dll"/> | |||
<testassembly name="assembly2.dll"/> | |||
<testassembly name="assembly3.dll"/> | |||
</nunit> | |||
</pre> | |||
<hr/> | |||
<p align="center">Copyright © 2004 The Apache Software Foundation. All rights Reserved.</p> | |||
</body> | |||
</html> |
@@ -0,0 +1,81 @@ | |||
<?xml version="1.0"?> | |||
<!-- | |||
Copyright 2004 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. | |||
--> | |||
<project name="nunit" basedir="." default="echo" | |||
xmlns:dn="antlib:org.apache.tools.ant.taskdefs.optional.dotnet"> | |||
<property name="build.dir" value="build"/> | |||
<property name="src.dir" location="src"/> | |||
<taskdef | |||
uri="antlib:org.apache.tools.ant.taskdefs.optional.dotnet" | |||
resource="org/apache/tools/ant/taskdefs/optional/dotnet/antlib.xml"> | |||
<classpath> | |||
<pathelement location="../../../build/lib/dotnet.jar"/> | |||
</classpath> | |||
</taskdef> | |||
<property environment="env"/> | |||
<condition property="nunit.found"> | |||
<or> | |||
<available file="nunit-console.exe" filepath="${env.PATH}"/> | |||
<available file="nunit-console.exe" filepath="${env.Path}"/> | |||
<available file="nunit-console.exe"/> | |||
</or> | |||
</condition> | |||
<target name="no-assembly"> | |||
<dn:nunit/> | |||
</target> | |||
<target name="compile-pass"> | |||
<mkdir dir="${build.dir}"/> | |||
<csc destFile="${build.dir}/Pass.dll" | |||
targetType="library" references="nunit.framework.dll"> | |||
<src dir="${src.dir}" includes="pass.cs"/> | |||
</csc> | |||
</target> | |||
<target name="compile-fail"> | |||
<mkdir dir="${build.dir}"/> | |||
<csc destFile="${build.dir}/Fail.dll" | |||
targetType="library" references="nunit.framework.dll"> | |||
<src dir="${src.dir}" includes="fail.cs"/> | |||
</csc> | |||
</target> | |||
<target name="passing-test" depends="compile-pass"> | |||
<dn:nunit> | |||
<testassembly name="${build.dir}/Pass.dll"/> | |||
</dn:nunit> | |||
</target> | |||
<target name="failing-test" depends="compile-fail"> | |||
<dn:nunit> | |||
<testassembly name="${build.dir}/Fail.dll"/> | |||
</dn:nunit> | |||
</target> | |||
<target name="failing-test-with-fail" depends="compile-fail"> | |||
<dn:nunit failonerror="true"> | |||
<testassembly name="${build.dir}/Fail.dll"/> | |||
</dn:nunit> | |||
</target> | |||
<target name="teardown"> | |||
<delete dir="${build.dir}"/> | |||
</target> | |||
</project> |
@@ -0,0 +1,30 @@ | |||
/* | |||
* Copyright 2004 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. | |||
* | |||
*/ | |||
using System; | |||
using NUnit.Framework; | |||
[TestFixture] | |||
public class FailingTest | |||
{ | |||
[Test] | |||
public void Fail() | |||
{ | |||
Assert.IsTrue(false); | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
/* | |||
* Copyright 2004 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. | |||
* | |||
*/ | |||
using System; | |||
using NUnit.Framework; | |||
[TestFixture] | |||
public class PassingTest | |||
{ | |||
[Test] | |||
public void Pass() | |||
{ | |||
Assert.IsTrue(true); | |||
} | |||
} |
@@ -0,0 +1,335 @@ | |||
/* | |||
* Copyright 2004 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.optional.dotnet; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Task; | |||
import org.apache.tools.ant.types.Environment; | |||
import org.apache.tools.ant.types.RedirectorElement; | |||
import java.io.File; | |||
import java.util.ArrayList; | |||
import java.util.Iterator; | |||
/** | |||
* Task to run the NUnit Console test runner. | |||
* | |||
* @see http://www.nunit.org/ | |||
*/ | |||
public class NUnitTask extends Task { | |||
/** | |||
* The vm attribute - if given. | |||
*/ | |||
private String vm; | |||
/** | |||
* Test assemblies. | |||
*/ | |||
private ArrayList testAssemblies = new ArrayList(); | |||
/** | |||
* The /config argument. | |||
*/ | |||
private File configFile; | |||
/** | |||
* The /output argument. | |||
*/ | |||
private File out; | |||
/** | |||
* The /err argument. | |||
*/ | |||
private File err; | |||
/** | |||
* The /xml argument. | |||
*/ | |||
private File xmlOut; | |||
/** | |||
* The /transform argument. | |||
*/ | |||
private File transform; | |||
/** | |||
* The /thread argument. | |||
*/ | |||
private boolean thread = false; | |||
/** | |||
* The /fixture argument. | |||
*/ | |||
private String fixture; | |||
/** | |||
* Categories to include. | |||
*/ | |||
private ArrayList includes = new ArrayList(); | |||
/** | |||
* Categories to exclude. | |||
*/ | |||
private ArrayList excludes = new ArrayList(); | |||
/** | |||
* The /noshadow argument. | |||
*/ | |||
private boolean noshadow = false; | |||
/** | |||
* The /labels argument. | |||
*/ | |||
private boolean labels = false; | |||
/** | |||
* Redirects everything that NUnit wants to send to the console. | |||
*/ | |||
private RedirectorElement redirectorElement; | |||
/** | |||
* Whether a failure should stop the build. | |||
*/ | |||
private boolean failOnError = false; | |||
/** | |||
* Support for nested environment variables. | |||
*/ | |||
private Environment env = new Environment(); | |||
public NUnitTask() { | |||
super(); | |||
} | |||
/** | |||
* Set the name of the executable for the virtual machine. | |||
* | |||
* @param value the name of the executable for the virtual machine | |||
*/ | |||
public void setVm(String value) { | |||
this.vm = value; | |||
} | |||
/** | |||
* Sets the name of the config file. | |||
*/ | |||
public void setConfig(File c) { | |||
configFile = c; | |||
} | |||
/** | |||
* The /output argument. | |||
*/ | |||
public void setOut(File out) { | |||
this.out = out; | |||
} | |||
/** | |||
* The /err argument. | |||
*/ | |||
public void setError(File err) { | |||
this.err = err; | |||
} | |||
/** | |||
* The /xml argument. | |||
*/ | |||
public void setXmlOut(File out) { | |||
this.xmlOut = out; | |||
} | |||
/** | |||
* The /transform argument. | |||
*/ | |||
public void setTransform(File transform) { | |||
this.transform = transform; | |||
} | |||
/** | |||
* The /thread argument. | |||
*/ | |||
public void setThread(boolean thread) { | |||
this.thread = thread; | |||
} | |||
/** | |||
* The /fixture argument. | |||
*/ | |||
public void setFixture(String fixture) { | |||
this.fixture = fixture; | |||
} | |||
/** | |||
* The /noshadow argument. | |||
*/ | |||
public void setNoshadow(boolean noshadow) { | |||
this.noshadow = noshadow; | |||
} | |||
/** | |||
* The /labels argument. | |||
*/ | |||
public void setLabels(boolean labels) { | |||
this.labels = labels; | |||
} | |||
/** | |||
* Whether a failure should stop the build. | |||
*/ | |||
public void setFailOnError(boolean b) { | |||
failOnError = b; | |||
} | |||
/** | |||
* Adds a test assembly by name. | |||
*/ | |||
public void addTestAssembly(NamedElement a) { | |||
testAssemblies.add(a); | |||
} | |||
/** | |||
* Adds a category to the include list. | |||
*/ | |||
public void addInclude(NamedElement a) { | |||
includes.add(a); | |||
} | |||
/** | |||
* Adds a category to the exclude list. | |||
*/ | |||
public void addExclude(NamedElement a) { | |||
excludes.add(a); | |||
} | |||
/** | |||
* Add an environment variable to the launched process. | |||
* | |||
* @param var new environment variable | |||
*/ | |||
public void addEnv(Environment.Variable var) { | |||
env.addVariable(var); | |||
} | |||
/** | |||
* Add a <code>RedirectorElement</code> to this task. | |||
* | |||
* <p>This does not use the <code>out</code> and | |||
* <code>error</code> attributes, it only captures NUnits output | |||
* that has not been redirected by those attributes.</p> | |||
*/ | |||
public void addConfiguredRedirector(RedirectorElement redirectorElement) { | |||
if (this.redirectorElement != null) { | |||
throw new BuildException("cannot have > 1 nested <redirector>s"); | |||
} else { | |||
this.redirectorElement = redirectorElement; | |||
} | |||
} | |||
public void execute() { | |||
if (testAssemblies.size() == 0) { | |||
throw new BuildException("You must specify at least one test " | |||
+ "assembly."); | |||
} | |||
DotNetExecTask exec = DotNetExecTask.getTask(this, vm, | |||
"nunit-console.exe", | |||
env); | |||
Iterator iter = testAssemblies.iterator(); | |||
while (iter.hasNext()) { | |||
NamedElement a = (NamedElement) iter.next(); | |||
exec.createArg().setValue(a.getName()); | |||
} | |||
if (configFile != null) { | |||
exec.createArg().setValue("/config=" | |||
+ configFile.getAbsolutePath()); | |||
} | |||
exec.createArg().setValue("/nologo"); | |||
if (out != null) { | |||
exec.createArg().setValue("/output=" + out.getAbsolutePath()); | |||
} | |||
if (err != null) { | |||
exec.createArg().setValue("/err=" + err.getAbsolutePath()); | |||
} | |||
if (xmlOut != null) { | |||
exec.createArg().setValue("/xml=" + xmlOut.getAbsolutePath()); | |||
} | |||
if (transform != null) { | |||
exec.createArg().setValue("/transform=" | |||
+ transform.getAbsolutePath()); | |||
} | |||
if (thread) { | |||
exec.createArg().setValue("/thread"); | |||
} | |||
if (noshadow) { | |||
exec.createArg().setValue("/noshadow"); | |||
} | |||
if (labels) { | |||
exec.createArg().setValue("/labels"); | |||
} | |||
if (fixture != null) { | |||
exec.createArg().setValue("/fixture=" + fixture); | |||
} | |||
if (includes.size() > 0) { | |||
StringBuffer sb = new StringBuffer("/include="); | |||
iter = includes.iterator(); | |||
boolean first = false; | |||
while (iter.hasNext()) { | |||
if (first) { | |||
first = false; | |||
} else { | |||
sb.append(","); | |||
} | |||
NamedElement a = (NamedElement) iter.next(); | |||
sb.append(a.getName()); | |||
} | |||
exec.createArg().setValue(sb.toString()); | |||
} | |||
if (excludes.size() > 0) { | |||
StringBuffer sb = new StringBuffer("/exclude="); | |||
iter = excludes.iterator(); | |||
boolean first = false; | |||
while (iter.hasNext()) { | |||
if (first) { | |||
first = false; | |||
} else { | |||
sb.append(","); | |||
} | |||
NamedElement a = (NamedElement) iter.next(); | |||
sb.append(a.getName()); | |||
} | |||
exec.createArg().setValue(sb.toString()); | |||
} | |||
if (redirectorElement != null) { | |||
exec.addConfiguredRedirector(redirectorElement); | |||
} | |||
exec.setFailonerror(failOnError); | |||
exec.execute(); | |||
} | |||
public static class NamedElement { | |||
private String name; | |||
public String getName() {return name;} | |||
public void setName(String s) {name = s;} | |||
} | |||
} |
@@ -31,4 +31,8 @@ | |||
name="wix" | |||
classname="org.apache.tools.ant.taskdefs.optional.dotnet.WixTask" | |||
/> | |||
<taskdef | |||
name="nunit" | |||
classname="org.apache.tools.ant.taskdefs.optional.dotnet.NUnitTask" | |||
/> | |||
</antlib> |
@@ -0,0 +1,79 @@ | |||
/* | |||
* Copyright 2004 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.optional.dotnet; | |||
import org.apache.tools.ant.BuildFileTest; | |||
/** | |||
* Tests the NUnitTask task. | |||
*/ | |||
public class NUnitTaskTest extends BuildFileTest { | |||
/** | |||
* Description of the Field | |||
*/ | |||
private final static String TASKDEFS_DIR = "src/etc/testcases/"; | |||
/** | |||
* Constructor | |||
* | |||
* @param name testname | |||
*/ | |||
public NUnitTaskTest(String name) { | |||
super(name); | |||
} | |||
/** | |||
* The JUnit setup method | |||
*/ | |||
public void setUp() { | |||
configureProject(TASKDEFS_DIR + "nunit.xml"); | |||
} | |||
/** | |||
* The teardown method for JUnit | |||
*/ | |||
public void tearDown() { | |||
executeTarget("teardown"); | |||
} | |||
public void testNoAssembly() { | |||
expectSpecificBuildException("no-assembly", "no assembly", | |||
"You must specify at least one test assembly."); | |||
} | |||
public void testPass() { | |||
if (getProject().getProperty("nunit.found") != null) { | |||
expectLogContaining("passing-test", | |||
"Tests run: 1, Failures: 0, Not run: 0"); | |||
} | |||
} | |||
public void testFail() { | |||
if (getProject().getProperty("nunit.found") != null) { | |||
expectLogContaining("failing-test", | |||
"Tests run: 1, Failures: 1, Not run: 0"); | |||
} | |||
} | |||
public void testFailOnFail() { | |||
if (getProject().getProperty("nunit.found") != null) { | |||
expectBuildException("failing-test-with-fail", "test should fail"); | |||
} | |||
} | |||
} |