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"); | |||
| } | |||
| } | |||
| } | |||