git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@275293 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,153 @@ | |||
| <?xml version="1.0"?> | |||
| <project name="assertions" basedir="." default="init"> | |||
| <property name="build.dir" location="assertions/build"/> | |||
| <property name="src.dir" location="assertions"/> | |||
| <property name="classname" value="AssertionTest"/> | |||
| <path id="assert.classpath"> | |||
| <pathelement location="${build.dir}"/> | |||
| </path> | |||
| <target name="setup" > | |||
| <mkdir dir="${build.dir}"/> | |||
| <javac srcdir="${src.dir}" | |||
| includes="*.java" | |||
| source="1.4" | |||
| debug="true" | |||
| destdir="${build.dir}" | |||
| /> | |||
| </target> | |||
| <target name="teardown" > | |||
| <delete dir="${build.dir}"/> | |||
| </target> | |||
| <!-- if per-class assertions work, this run asserts --> | |||
| <target name="test-classname" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enablesystemassertions="true"> | |||
| <enable class="${classname}" /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- if package works, this run asserts --> | |||
| <target name="test-package" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enableSystemAssertions="false" > | |||
| <enable package="..." /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- this test should run the app successfully --> | |||
| <target name="test-empty-assertions" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions/> | |||
| </java> | |||
| </target> | |||
| <!-- this test should run the app successfully --> | |||
| <target name="test-disable" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enableSystemAssertions="false" > | |||
| <enable package="..." /> | |||
| <disable class="${classname}" /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- repeated settigns result in the last declaration winning | |||
| except that the rule 'classes win over packages takes priority | |||
| this run will assert --> | |||
| <target name="test-override" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enableSystemAssertions="false" > | |||
| <enable package="..." /> | |||
| <disable class="${classname}" /> | |||
| <enable class="${classname}" /> | |||
| <disable package="..." /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- repeated settigns result in the last declaration winning; | |||
| this run will not assert --> | |||
| <target name="test-override2" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enableSystemAssertions="false" > | |||
| <enable package="..." /> | |||
| <enable class="${classname}" /> | |||
| <disable class="${classname}" /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- if references work, this run asserts --> | |||
| <target name="test-references"> | |||
| <assertions id="project.assertions" > | |||
| <enable package="org.apache.test" /> | |||
| <disable package="org.apache.log4j"/> | |||
| <enable package="..."/> | |||
| </assertions> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions refid="project.assertions"/> | |||
| </java> | |||
| </target> | |||
| <!-- when fork=false; we need to reject the construct --> | |||
| <target name="test-nofork" depends="setup"> | |||
| <java fork="false" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enablesystemassertions="true"> | |||
| <enable class="${classname}" /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| <!-- this throws a build error --> | |||
| <target name="test-multiple-assertions" depends="setup"> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions enablesystemassertions="true"> | |||
| <enable class="${classname}" /> | |||
| </assertions> | |||
| <assertions/> | |||
| </java> | |||
| </target> | |||
| <!-- should throw a build exception --> | |||
| <target name="test-reference-abuse" depends="setup"> | |||
| <assertions id="project.assertions2" > | |||
| <enable package="org.apache.test" /> | |||
| <disable package="org.apache.log4j"/> | |||
| <enable package="..."/> | |||
| </assertions> | |||
| <java fork="true" failonerror="true" | |||
| classname="${classname}" | |||
| classpathref="assert.classpath"> | |||
| <assertions refid="project.assertions2"> | |||
| <disable class="${classname}" /> | |||
| </assertions> | |||
| </java> | |||
| </target> | |||
| </project> | |||
| @@ -0,0 +1,66 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "Ant" and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| /** | |||
| * this is an assertion tester | |||
| */ | |||
| public class AssertionTest { | |||
| public static void main(String args[]) { | |||
| assert true == false : "there exist no facts that are both true and false"; | |||
| System.out.println("Assertions are disabled"); | |||
| } | |||
| } | |||
| @@ -156,6 +156,10 @@ public class Java extends Task { | |||
| throw new BuildException("You have used an attribute which is " | |||
| + "not compatible with spawn"); | |||
| } | |||
| if (cmdl.getAssertions() != null && !fork) { | |||
| log("Assertion statements are currently ignored in non-forked mode"); | |||
| } | |||
| if (fork) { | |||
| if (perm != null) { | |||
| log("Permissions can not be set this way in forked mode.", Project.MSG_WARN); | |||
| @@ -591,7 +595,10 @@ public class Java extends Task { | |||
| * @since Ant 1.6 | |||
| * @param asserts assertion set | |||
| */ | |||
| public void setAssertions(Assertions asserts) { | |||
| public void addAssertions(Assertions asserts) { | |||
| if(cmdl.getAssertions() != null) { | |||
| throw new BuildException("Only one assertion declaration is allowed"); | |||
| } | |||
| cmdl.setAssertions(asserts); | |||
| } | |||
| @@ -97,7 +97,7 @@ public class Jasper41Mangler implements JspMangler { | |||
| modifiedClassName.append(mangleChar(ch)); | |||
| } | |||
| } | |||
| return modifiedClassName.toString(); | |||
| return modifiedClassName.toString()+".java"; | |||
| } | |||
| /** | |||
| @@ -568,7 +568,10 @@ public class JUnitTask extends Task { | |||
| * @since Ant 1.6 | |||
| * @param asserts assertion set | |||
| */ | |||
| public void setAssertions(Assertions asserts) { | |||
| public void addAssertions(Assertions asserts) { | |||
| if (commandline.getAssertions() != null) { | |||
| throw new BuildException("Only one assertion declaration is allowed"); | |||
| } | |||
| commandline.setAssertions(asserts); | |||
| } | |||
| @@ -55,14 +55,15 @@ | |||
| package org.apache.tools.ant.types; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.Project; | |||
| import java.util.List; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| /** | |||
| * implement the assertion datatype. This type describes | |||
| * assertion settings for the <java> task and derivatives. | |||
| * The assertion datatype. This type describes | |||
| * assertion settings for the <java> task and others. | |||
| * One can set the system assertions, and enable/disable those in | |||
| * packages & classes. | |||
| * Assertions can only be enabled or disabled when forking Java. | |||
| @@ -127,7 +128,7 @@ public class Assertions extends DataType { | |||
| * disable assertions | |||
| * @param assertion | |||
| */ | |||
| public void addDisable(EnabledAssertion assertion) { | |||
| public void addDisable(DisabledAssertion assertion) { | |||
| checkChildrenAllowed(); | |||
| assertionList.add(assertion); | |||
| } | |||
| @@ -196,11 +197,14 @@ public class Assertions extends DataType { | |||
| * @param commandList | |||
| */ | |||
| public void applyAssertions(List commandList) { | |||
| getProject().log("Applying assertions",Project.MSG_DEBUG); | |||
| Assertions clause = getFinalReference(); | |||
| //do the system assertions | |||
| if (Boolean.TRUE.equals(clause.enableSystemAssertions)) { | |||
| getProject().log("Enabling system assertions", Project.MSG_DEBUG); | |||
| commandList.add("-enablesystemassertions"); | |||
| } else if (Boolean.FALSE.equals(clause.enableSystemAssertions)) { | |||
| getProject().log("disabling system assertions", Project.MSG_DEBUG); | |||
| commandList.add("-disablesystemassertions"); | |||
| } | |||
| @@ -209,6 +213,7 @@ public class Assertions extends DataType { | |||
| while (it.hasNext()) { | |||
| BaseAssertion assertion = (BaseAssertion) it.next(); | |||
| String arg = assertion.toCommand(); | |||
| getProject().log("adding assertion "+arg, Project.MSG_DEBUG); | |||
| commandList.add(arg); | |||
| } | |||
| } | |||
| @@ -19,4 +19,4 @@ selector=org.apache.tools.ant.types.selectors.SelectSelector | |||
| zipfileset=org.apache.tools.ant.types.ZipFileSet | |||
| scriptfilter=org.apache.tools.ant.types.optional.ScriptFilter | |||
| propertyset=org.apache.tools.ant.types.PropertySet | |||
| assertion=org.apache.tools.ant.types.Assertion | |||
| assertions=org.apache.tools.ant.types.Assertions | |||
| @@ -0,0 +1,132 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "Ant" and "Apache Software Foundation" | |||
| * must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.types; | |||
| import org.apache.tools.ant.BuildFileTest; | |||
| /** | |||
| * test assertion handling | |||
| */ | |||
| public class AssertionsTest extends BuildFileTest { | |||
| public AssertionsTest(String name) { | |||
| super(name); | |||
| } | |||
| protected void setUp() throws Exception { | |||
| configureProject("src/etc/testcases/types/assertions.xml"); | |||
| } | |||
| protected void tearDown() throws Exception { | |||
| executeTarget("teardown"); | |||
| } | |||
| /** | |||
| * runs a test and expects an assertion thrown in forked code | |||
| * @param target | |||
| */ | |||
| protected void expectAssertion(String target) { | |||
| expectBuildExceptionContaining(target, | |||
| "assertion not thrown in "+target, | |||
| "Java returned: 1"); | |||
| } | |||
| public void testClassname() { | |||
| expectAssertion("test-classname"); | |||
| } | |||
| public void testPackage() { | |||
| expectAssertion("test-package"); | |||
| } | |||
| public void testEmptyAssertions() { | |||
| executeTarget("test-empty-assertions"); | |||
| } | |||
| public void testDisable() { | |||
| executeTarget("test-disable"); | |||
| } | |||
| public void testOverride() { | |||
| expectAssertion("test-override"); | |||
| } | |||
| public void testOverride2() { | |||
| executeTarget("test-override2"); | |||
| } | |||
| public void testReferences() { | |||
| expectAssertion("test-references"); | |||
| } | |||
| public void testMultipleAssertions() { | |||
| expectBuildExceptionContaining("test-multiple-assertions", | |||
| "multiple assertions rejected", | |||
| "Only one assertion declaration is allowed"); | |||
| } | |||
| public void testReferenceAbuse() { | |||
| expectBuildExceptionContaining("test-reference-abuse", | |||
| "reference abuse rejected", | |||
| "You must not specify more than one attribute when using refid"); | |||
| } | |||
| public void testNofork() { | |||
| expectLogContaining("test-nofork", | |||
| "Assertion statements are currently ignored in non-forked mode"); | |||
| } | |||
| } | |||