Browse Source

fix linefeeds

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@743227 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 16 years ago
parent
commit
1fa24dc235
18 changed files with 1863 additions and 1863 deletions
  1. +113
    -113
      src/main/org/apache/tools/ant/TaskConfigurationChecker.java
  2. +59
    -59
      src/main/org/apache/tools/ant/input/SecureInputHandler.java
  3. +112
    -112
      src/main/org/apache/tools/ant/listener/ProfileLogger.java
  4. +247
    -247
      src/main/org/apache/tools/ant/taskdefs/HostInfo.java
  5. +88
    -88
      src/main/org/apache/tools/ant/taskdefs/Retry.java
  6. +101
    -101
      src/main/org/apache/tools/ant/taskdefs/condition/HasFreeSpace.java
  7. +165
    -165
      src/main/org/apache/tools/ant/taskdefs/condition/ResourceContains.java
  8. +425
    -425
      src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
  9. +36
    -36
      src/main/org/apache/tools/ant/types/resources/FileProvider.java
  10. +77
    -77
      src/tests/antunit/core/location/location.xml
  11. +25
    -25
      src/tests/antunit/core/location/src/task/EchoLocation.java
  12. +54
    -54
      src/tests/antunit/taskdefs/condition/antversion-test.xml
  13. +40
    -40
      src/tests/antunit/taskdefs/condition/hasfreespace-test.xml
  14. +87
    -87
      src/tests/antunit/taskdefs/echoxml-test.xml
  15. +46
    -46
      src/tests/antunit/taskdefs/gzip-test.xml
  16. +94
    -94
      src/tests/antunit/taskdefs/hostinfo-test.xml
  17. +41
    -41
      src/tests/antunit/taskdefs/loadresource-test.xml
  18. +53
    -53
      src/tests/antunit/types/resources/files-test.xml

+ 113
- 113
src/main/org/apache/tools/ant/TaskConfigurationChecker.java View File

@@ -1,113 +1,113 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* <p>Helper class for the check of the configuration of a given task.
* This class provides methods for making assumptions about the task configuration.
* After collecting all violations with <tt>assert*</tt> and <tt>fail</tt>
* methods the <tt>checkErrors</tt> will throw a BuildException with all collected
* messages or does nothing if there wasn't any error.</p>
*
* <p>Example:</p>
*
* <pre>
* public class MyTask extends Task {
* ...
* public void execute() {
* TaskConfigurationChecker checker = TaskConfigurationChecker(this);
* checker.assertConfig(
* srcdir != null,
* "Attribute 'srcdir' must be set.
* );
* checker.assertConfig(
* srcdir.exists(),
* "Srcdir (" + srcdir + ") must exist."
* );
* if (someComplexCondition()) {
* fail("Complex condition failed.");
* }
* checker.checkErrors();
* }
* }
* </pre>
*
* @see <a href="http://martinfowler.com/eaaDev/Notification.html">Notification Pattern</a>
*/
public class TaskConfigurationChecker {
/** List of all collected error messages. */
private List/*<String>*/ errors = new ArrayList();
/** Task for which the configuration should be checked. */
private final Task task;
/**
* Constructor.
* @param task which task should be checked
*/
public TaskConfigurationChecker(Task task) {
this.task = task;
}
/**
* Asserts that a condition is true.
* @param condition which condition to check
* @param errormessage errormessage to throw if a condition failed
*/
public void assertConfig(boolean condition, String errormessage) {
if (!condition) {
errors.add(errormessage);
}
}
/**
* Registers an error.
* @param errormessage the message for the registered error
*/
public void fail(String errormessage) {
errors.add(errormessage);
}
/**
* Checks if there are any collected errors and throws a BuildException
* with all messages if there was one or more.
* @throws BuildException if one or more errors were registered
*/
public void checkErrors() throws BuildException {
if (!errors.isEmpty()) {
StringBuffer sb = new StringBuffer();
sb.append("Configurationerror on <");
sb.append(task.getTaskName());
sb.append(">:");
sb.append(System.getProperty("line.separator"));
for (Iterator it = errors.iterator(); it.hasNext();) {
String msg = (String) it.next();
sb.append("- ");
sb.append(msg);
sb.append(System.getProperty("line.separator"));
}
throw new BuildException(sb.toString(), task.getLocation());
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* <p>Helper class for the check of the configuration of a given task.
* This class provides methods for making assumptions about the task configuration.
* After collecting all violations with <tt>assert*</tt> and <tt>fail</tt>
* methods the <tt>checkErrors</tt> will throw a BuildException with all collected
* messages or does nothing if there wasn't any error.</p>
*
* <p>Example:</p>
*
* <pre>
* public class MyTask extends Task {
* ...
* public void execute() {
* TaskConfigurationChecker checker = TaskConfigurationChecker(this);
* checker.assertConfig(
* srcdir != null,
* "Attribute 'srcdir' must be set.
* );
* checker.assertConfig(
* srcdir.exists(),
* "Srcdir (" + srcdir + ") must exist."
* );
* if (someComplexCondition()) {
* fail("Complex condition failed.");
* }
* checker.checkErrors();
* }
* }
* </pre>
*
* @see <a href="http://martinfowler.com/eaaDev/Notification.html">Notification Pattern</a>
*/
public class TaskConfigurationChecker {
/** List of all collected error messages. */
private List/*<String>*/ errors = new ArrayList();
/** Task for which the configuration should be checked. */
private final Task task;
/**
* Constructor.
* @param task which task should be checked
*/
public TaskConfigurationChecker(Task task) {
this.task = task;
}
/**
* Asserts that a condition is true.
* @param condition which condition to check
* @param errormessage errormessage to throw if a condition failed
*/
public void assertConfig(boolean condition, String errormessage) {
if (!condition) {
errors.add(errormessage);
}
}
/**
* Registers an error.
* @param errormessage the message for the registered error
*/
public void fail(String errormessage) {
errors.add(errormessage);
}
/**
* Checks if there are any collected errors and throws a BuildException
* with all messages if there was one or more.
* @throws BuildException if one or more errors were registered
*/
public void checkErrors() throws BuildException {
if (!errors.isEmpty()) {
StringBuffer sb = new StringBuffer();
sb.append("Configurationerror on <");
sb.append(task.getTaskName());
sb.append(">:");
sb.append(System.getProperty("line.separator"));
for (Iterator it = errors.iterator(); it.hasNext();) {
String msg = (String) it.next();
sb.append("- ");
sb.append(msg);
sb.append(System.getProperty("line.separator"));
}
throw new BuildException(sb.toString(), task.getLocation());
}
}
}

+ 59
- 59
src/main/org/apache/tools/ant/input/SecureInputHandler.java View File

@@ -1,60 +1,60 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.input;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.ReflectUtil;
/**
* Prompts and requests input. May loop until a valid input has
* been entered. Doesn't echo input (requires Java6). If Java6 is not
* available, fallsback to the DefaultHandler (insecure).
* @since Ant 1.7.1
*/
public class SecureInputHandler extends DefaultInputHandler {
/**
* Default no-args constructor
*/
public SecureInputHandler() {
}
/**
* Handle the input
* @param request the request to handle
* @throws BuildException if not possible to read from console
*/
public void handleInput(InputRequest request) throws BuildException {
String prompt = getPrompt(request);
try {
Class system = Class.forName("java.lang.System");
Object console = ReflectUtil.invokeStatic(system, "console");
do {
char[] input = (char[]) ReflectUtil.invoke(
console, "readPassword", String.class, prompt,
Object[].class, (Object[]) null);
request.setInput(new String(input));
/* for security zero char array after retrieving value */
java.util.Arrays.fill(input, ' ');
} while (!request.isInputValid());
} catch (Exception e) {
/* Java6 not present use default handler */
super.handleInput(request);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.input;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.ReflectUtil;
/**
* Prompts and requests input. May loop until a valid input has
* been entered. Doesn't echo input (requires Java6). If Java6 is not
* available, fallsback to the DefaultHandler (insecure).
* @since Ant 1.7.1
*/
public class SecureInputHandler extends DefaultInputHandler {
/**
* Default no-args constructor
*/
public SecureInputHandler() {
}
/**
* Handle the input
* @param request the request to handle
* @throws BuildException if not possible to read from console
*/
public void handleInput(InputRequest request) throws BuildException {
String prompt = getPrompt(request);
try {
Class system = Class.forName("java.lang.System");
Object console = ReflectUtil.invokeStatic(system, "console");
do {
char[] input = (char[]) ReflectUtil.invoke(
console, "readPassword", String.class, prompt,
Object[].class, (Object[]) null);
request.setInput(new String(input));
/* for security zero char array after retrieving value */
java.util.Arrays.fill(input, ' ');
} while (!request.isInputValid());
} catch (Exception e) {
/* Java6 not present use default handler */
super.handleInput(request);
}
}
}

+ 112
- 112
src/main/org/apache/tools/ant/listener/ProfileLogger.java View File

@@ -1,112 +1,112 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.listener;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.util.StringUtils;
/**
* This is a special logger that is designed to profile builds.
*
* @since Ant1.8
*/
public class ProfileLogger extends DefaultLogger {
private Map profileData = new HashMap(); // <Object, Date>
/**
* Logs a message to say that the target has started.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void targetStarted(BuildEvent event) {
Date now = new Date();
String name = "Target " + event.getTarget().getName();
logStart(event, now, name);
profileData.put(event.getTarget(), now);
}
/**
* Logs a message to say that the target has finished.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void targetFinished(BuildEvent event) {
Date start = (Date) profileData.remove(event.getTarget());
String name = "Target " + event.getTarget().getName();
logFinish(event, start, name);
}
/**
* Logs a message to say that the task has started.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void taskStarted(BuildEvent event) {
String name = event.getTask().getTaskName();
Date now = new Date();
logStart(event, now, name);
profileData.put(event.getTask(), now);
}
/**
* Logs a message to say that the task has finished.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void taskFinished(BuildEvent event) {
Date start = (Date) profileData.remove(event.getTask());
String name = event.getTask().getTaskName();
logFinish(event, start, name);
}
private void logFinish(BuildEvent event, Date start, String name) {
Date now = new Date();
String msg = null;
if (start != null) {
long diff = now.getTime() - start.getTime();
msg = StringUtils.LINE_SEP + name + ": finished" + now + " ("
+ diff + "ms)";
} else {
msg = StringUtils.LINE_SEP + name + ": finished" + now
+ " (unknown duration, start not detected)";
}
printMessage(msg, out, event.getPriority());
log(msg);
}
private void logStart(BuildEvent event, Date start, String name) {
String msg = StringUtils.LINE_SEP + name + ": started " + start;
printMessage(msg, out, event.getPriority());
log(msg);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.listener;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.DefaultLogger;
import org.apache.tools.ant.util.StringUtils;
/**
* This is a special logger that is designed to profile builds.
*
* @since Ant1.8
*/
public class ProfileLogger extends DefaultLogger {
private Map profileData = new HashMap(); // <Object, Date>
/**
* Logs a message to say that the target has started.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void targetStarted(BuildEvent event) {
Date now = new Date();
String name = "Target " + event.getTarget().getName();
logStart(event, now, name);
profileData.put(event.getTarget(), now);
}
/**
* Logs a message to say that the target has finished.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void targetFinished(BuildEvent event) {
Date start = (Date) profileData.remove(event.getTarget());
String name = "Target " + event.getTarget().getName();
logFinish(event, start, name);
}
/**
* Logs a message to say that the task has started.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void taskStarted(BuildEvent event) {
String name = event.getTask().getTaskName();
Date now = new Date();
logStart(event, now, name);
profileData.put(event.getTask(), now);
}
/**
* Logs a message to say that the task has finished.
*
* @param event
* An event with any relevant extra information. Must not be
* <code>null</code>.
*/
public void taskFinished(BuildEvent event) {
Date start = (Date) profileData.remove(event.getTask());
String name = event.getTask().getTaskName();
logFinish(event, start, name);
}
private void logFinish(BuildEvent event, Date start, String name) {
Date now = new Date();
String msg = null;
if (start != null) {
long diff = now.getTime() - start.getTime();
msg = StringUtils.LINE_SEP + name + ": finished" + now + " ("
+ diff + "ms)";
} else {
msg = StringUtils.LINE_SEP + name + ": finished" + now
+ " (unknown duration, start not detected)";
}
printMessage(msg, out, event.getPriority());
log(msg);
}
private void logStart(BuildEvent event, Date start, String name) {
String msg = StringUtils.LINE_SEP + name + ": started " + start;
printMessage(msg, out, event.getPriority());
log(msg);
}
}

+ 247
- 247
src/main/org/apache/tools/ant/taskdefs/HostInfo.java View File

@@ -1,247 +1,247 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
/**
* Sets properties to the host provided, or localhost if no information is
* provided. The default properties are NAME, FQDN, ADDR4, ADDR6;
*
* @since Ant 1.8
* @ant.task category="utility"
*/
public class HostInfo extends Task {
private static final String DEF_REM_ADDR6 = "::";
private static final String DEF_REM_ADDR4 = "0.0.0.0";
private static final String DEF_LOCAL_ADDR6 = "::1";
private static final String DEF_LOCAL_ADDR4 = "127.0.0.1";
private static final String DEF_LOCAL_NAME = "localhost";
private static final String DEF_DOMAIN = "localdomain";
private static final String DOMAIN = "DOMAIN";
private static final String NAME = "NAME";
private static final String ADDR4 = "ADDR4";
private static final String ADDR6 = "ADDR6";
private String prefix = "";
private String host;
private InetAddress nameAddr;
private InetAddress best6;
private InetAddress best4;
private List inetAddrs;
/**
* Set a prefix for the properties. If the prefix does not end with a "."
* one is automatically added.
*
* @param aPrefix
* the prefix to use.
* @since Ant 1.8
*/
public void setPrefix(String aPrefix) {
prefix = aPrefix;
if (!prefix.endsWith(".")) {
prefix += ".";
}
}
/**
* Set the host to be retrieved.
*
* @param aHost
* the name or the address of the host, data for the local host
* will be retrieved if ommited.
* @since Ant 1.8
*/
public void setHost(String aHost) {
host = aHost;
}
/**
* set the properties.
*
* @throws BuildException
* on error.
*/
public void execute() throws BuildException {
if (host == null || "".equals(host)) {
executeLocal();
} else {
executeRemote();
}
}
private void executeLocal() {
try {
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
inetAddrs = new LinkedList();
while (interfaces.hasMoreElements()) {
NetworkInterface currentif = (NetworkInterface) interfaces
.nextElement();
Enumeration addrs = currentif.getInetAddresses();
while (addrs.hasMoreElements())
{
inetAddrs.add(addrs.nextElement());
}
}
selectAddresses();
if (nameAddr != null) {
setDomainAndName(nameAddr.getCanonicalHostName());
} else {
setProperty(DOMAIN, DEF_DOMAIN);
setProperty(NAME, DEF_LOCAL_NAME);
}
if (best4 != null) {
setProperty(ADDR4, best4.getHostAddress());
} else {
setProperty(ADDR4, DEF_LOCAL_ADDR4);
}
if (best6 != null) {
setProperty(ADDR6, best6.getHostAddress());
} else {
setProperty(ADDR6, DEF_LOCAL_ADDR6);
}
} catch (Exception e) {
log("Error retrieving local host information", e, Project.MSG_WARN);
setProperty(DOMAIN, DEF_DOMAIN);
setProperty(NAME, DEF_LOCAL_NAME);
setProperty(ADDR4, DEF_LOCAL_ADDR4);
setProperty(ADDR6, DEF_LOCAL_ADDR6);
}
}
private void selectAddresses() {
Iterator i = inetAddrs.iterator();
while (i.hasNext()) {
InetAddress current = (InetAddress) i.next();
if (!current.isMulticastAddress()) {
if (current instanceof Inet4Address) {
best4 = selectBestAddress(best4, current);
} else if (current instanceof Inet6Address) {
best6 = selectBestAddress(best6, current);
}
}
}
nameAddr = selectBestAddress(best6, best4);
}
private InetAddress selectBestAddress(InetAddress bestSoFar,
InetAddress current) {
InetAddress best = bestSoFar;
if (best == null) {
// none selected so far, so this one is better.
best = current;
} else {
if (current.isLoopbackAddress()) {
// definitely not better than the previously selected address.
} else if (current.isLinkLocalAddress()) {
// link local considered better than loopback
if (best.isLoopbackAddress()) {
best = current;
}
} else if (current.isSiteLocalAddress()) {
// site local considered better than link local (and loopback)
if (best.isLoopbackAddress() || best.isLinkLocalAddress()) {
best = current;
}
} else {
// current is a global address, and therefore best (at least
// equally well)
best = current;
}
}
return best;
}
private void executeRemote() {
try {
inetAddrs = Arrays.asList(InetAddress.getAllByName(host));
selectAddresses();
if (nameAddr != null) {
setDomainAndName(nameAddr.getCanonicalHostName());
} else {
setDomainAndName(host);
}
if (best4 != null) {
setProperty(ADDR4, best4.getHostAddress());
} else {
setProperty(ADDR4, DEF_REM_ADDR4);
}
if (best6 != null) {
setProperty(ADDR6, best6.getHostAddress());
} else {
setProperty(ADDR6, DEF_REM_ADDR6);
}
} catch (Exception e) {
log("Error retrieving remote host information for host:" + host
+ ".", e, Project.MSG_WARN);
setDomainAndName(host);
setProperty(ADDR4, DEF_REM_ADDR4);
setProperty(ADDR6, DEF_REM_ADDR6);
}
}
private void setDomainAndName(String fqdn)
{
int idx = fqdn.indexOf('.');
if (idx > 0) {
setProperty(NAME, fqdn.substring(0, idx));
setProperty(DOMAIN, fqdn.substring(idx+1));
} else {
setProperty(NAME, fqdn);
setProperty(DOMAIN, DEF_DOMAIN);
}
}
private void setProperty(String name, String value) {
getProject().setNewProperty(prefix + name, value);
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
/**
* Sets properties to the host provided, or localhost if no information is
* provided. The default properties are NAME, FQDN, ADDR4, ADDR6;
*
* @since Ant 1.8
* @ant.task category="utility"
*/
public class HostInfo extends Task {
private static final String DEF_REM_ADDR6 = "::";
private static final String DEF_REM_ADDR4 = "0.0.0.0";
private static final String DEF_LOCAL_ADDR6 = "::1";
private static final String DEF_LOCAL_ADDR4 = "127.0.0.1";
private static final String DEF_LOCAL_NAME = "localhost";
private static final String DEF_DOMAIN = "localdomain";
private static final String DOMAIN = "DOMAIN";
private static final String NAME = "NAME";
private static final String ADDR4 = "ADDR4";
private static final String ADDR6 = "ADDR6";
private String prefix = "";
private String host;
private InetAddress nameAddr;
private InetAddress best6;
private InetAddress best4;
private List inetAddrs;
/**
* Set a prefix for the properties. If the prefix does not end with a "."
* one is automatically added.
*
* @param aPrefix
* the prefix to use.
* @since Ant 1.8
*/
public void setPrefix(String aPrefix) {
prefix = aPrefix;
if (!prefix.endsWith(".")) {
prefix += ".";
}
}
/**
* Set the host to be retrieved.
*
* @param aHost
* the name or the address of the host, data for the local host
* will be retrieved if ommited.
* @since Ant 1.8
*/
public void setHost(String aHost) {
host = aHost;
}
/**
* set the properties.
*
* @throws BuildException
* on error.
*/
public void execute() throws BuildException {
if (host == null || "".equals(host)) {
executeLocal();
} else {
executeRemote();
}
}
private void executeLocal() {
try {
Enumeration interfaces = NetworkInterface.getNetworkInterfaces();
inetAddrs = new LinkedList();
while (interfaces.hasMoreElements()) {
NetworkInterface currentif = (NetworkInterface) interfaces
.nextElement();
Enumeration addrs = currentif.getInetAddresses();
while (addrs.hasMoreElements())
{
inetAddrs.add(addrs.nextElement());
}
}
selectAddresses();
if (nameAddr != null) {
setDomainAndName(nameAddr.getCanonicalHostName());
} else {
setProperty(DOMAIN, DEF_DOMAIN);
setProperty(NAME, DEF_LOCAL_NAME);
}
if (best4 != null) {
setProperty(ADDR4, best4.getHostAddress());
} else {
setProperty(ADDR4, DEF_LOCAL_ADDR4);
}
if (best6 != null) {
setProperty(ADDR6, best6.getHostAddress());
} else {
setProperty(ADDR6, DEF_LOCAL_ADDR6);
}
} catch (Exception e) {
log("Error retrieving local host information", e, Project.MSG_WARN);
setProperty(DOMAIN, DEF_DOMAIN);
setProperty(NAME, DEF_LOCAL_NAME);
setProperty(ADDR4, DEF_LOCAL_ADDR4);
setProperty(ADDR6, DEF_LOCAL_ADDR6);
}
}
private void selectAddresses() {
Iterator i = inetAddrs.iterator();
while (i.hasNext()) {
InetAddress current = (InetAddress) i.next();
if (!current.isMulticastAddress()) {
if (current instanceof Inet4Address) {
best4 = selectBestAddress(best4, current);
} else if (current instanceof Inet6Address) {
best6 = selectBestAddress(best6, current);
}
}
}
nameAddr = selectBestAddress(best6, best4);
}
private InetAddress selectBestAddress(InetAddress bestSoFar,
InetAddress current) {
InetAddress best = bestSoFar;
if (best == null) {
// none selected so far, so this one is better.
best = current;
} else {
if (current.isLoopbackAddress()) {
// definitely not better than the previously selected address.
} else if (current.isLinkLocalAddress()) {
// link local considered better than loopback
if (best.isLoopbackAddress()) {
best = current;
}
} else if (current.isSiteLocalAddress()) {
// site local considered better than link local (and loopback)
if (best.isLoopbackAddress() || best.isLinkLocalAddress()) {
best = current;
}
} else {
// current is a global address, and therefore best (at least
// equally well)
best = current;
}
}
return best;
}
private void executeRemote() {
try {
inetAddrs = Arrays.asList(InetAddress.getAllByName(host));
selectAddresses();
if (nameAddr != null) {
setDomainAndName(nameAddr.getCanonicalHostName());
} else {
setDomainAndName(host);
}
if (best4 != null) {
setProperty(ADDR4, best4.getHostAddress());
} else {
setProperty(ADDR4, DEF_REM_ADDR4);
}
if (best6 != null) {
setProperty(ADDR6, best6.getHostAddress());
} else {
setProperty(ADDR6, DEF_REM_ADDR6);
}
} catch (Exception e) {
log("Error retrieving remote host information for host:" + host
+ ".", e, Project.MSG_WARN);
setDomainAndName(host);
setProperty(ADDR4, DEF_REM_ADDR4);
setProperty(ADDR6, DEF_REM_ADDR6);
}
}
private void setDomainAndName(String fqdn)
{
int idx = fqdn.indexOf('.');
if (idx > 0) {
setProperty(NAME, fqdn.substring(0, idx));
setProperty(DOMAIN, fqdn.substring(idx+1));
} else {
setProperty(NAME, fqdn);
setProperty(DOMAIN, DEF_DOMAIN);
}
}
private void setProperty(String name, String value) {
getProject().setNewProperty(prefix + name, value);
}
}

+ 88
- 88
src/main/org/apache/tools/ant/taskdefs/Retry.java View File

@@ -1,89 +1,89 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.TaskContainer;
import org.apache.tools.ant.util.StringUtils;
/**
* Retries the nested task a set number of times
* @since Ant 1.7.1
*/
public class Retry extends Task implements TaskContainer {
/**
* task to execute n times
*/
private Task nestedTask;
/**
* set retryCount to 1 by default
*/
private int retryCount = 1;
/**
* set the task
* @param t the task to retry.
*/
public synchronized void addTask(Task t) {
if (nestedTask != null) {
throw new BuildException(
"The retry task container accepts a single nested task"
+ " (which may be a sequential task container)");
}
nestedTask = t;
}
/**
* set the number of times to retry the task
* @param n the number to use.
*/
public void setRetryCount(int n) {
retryCount = n;
}
/**
* perform the work
* @throws BuildException if there is an error.
*/
public void execute() throws BuildException {
StringBuffer errorMessages = new StringBuffer();
for (int i = 0; i <= retryCount; i++) {
try {
nestedTask.perform();
break;
} catch (Exception e) {
errorMessages.append(e.getMessage());
if (i >= retryCount) {
StringBuffer exceptionMessage = new StringBuffer();
exceptionMessage.append("Task [").append(nestedTask.getTaskName());
exceptionMessage.append("] failed after [").append(retryCount);
exceptionMessage.append("] attempts; giving up.").append(StringUtils.LINE_SEP);
exceptionMessage.append("Error messages:").append(StringUtils.LINE_SEP);
exceptionMessage.append(errorMessages);
throw new BuildException(exceptionMessage.toString(), getLocation());
}
log("Attempt [" + i + "]: error occurred; retrying...", e, Project.MSG_INFO);
errorMessages.append(StringUtils.LINE_SEP);
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.TaskContainer;
import org.apache.tools.ant.util.StringUtils;
/**
* Retries the nested task a set number of times
* @since Ant 1.7.1
*/
public class Retry extends Task implements TaskContainer {
/**
* task to execute n times
*/
private Task nestedTask;
/**
* set retryCount to 1 by default
*/
private int retryCount = 1;
/**
* set the task
* @param t the task to retry.
*/
public synchronized void addTask(Task t) {
if (nestedTask != null) {
throw new BuildException(
"The retry task container accepts a single nested task"
+ " (which may be a sequential task container)");
}
nestedTask = t;
}
/**
* set the number of times to retry the task
* @param n the number to use.
*/
public void setRetryCount(int n) {
retryCount = n;
}
/**
* perform the work
* @throws BuildException if there is an error.
*/
public void execute() throws BuildException {
StringBuffer errorMessages = new StringBuffer();
for (int i = 0; i <= retryCount; i++) {
try {
nestedTask.perform();
break;
} catch (Exception e) {
errorMessages.append(e.getMessage());
if (i >= retryCount) {
StringBuffer exceptionMessage = new StringBuffer();
exceptionMessage.append("Task [").append(nestedTask.getTaskName());
exceptionMessage.append("] failed after [").append(retryCount);
exceptionMessage.append("] attempts; giving up.").append(StringUtils.LINE_SEP);
exceptionMessage.append("Error messages:").append(StringUtils.LINE_SEP);
exceptionMessage.append(errorMessages);
throw new BuildException(exceptionMessage.toString(), getLocation());
}
log("Attempt [" + i + "]: error occurred; retrying...", e, Project.MSG_INFO);
errorMessages.append(StringUtils.LINE_SEP);
}
}
}
}

+ 101
- 101
src/main/org/apache/tools/ant/taskdefs/condition/HasFreeSpace.java View File

@@ -1,101 +1,101 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.util.ReflectWrapper;
import org.apache.tools.ant.util.StringUtils;
/**
* &lt;hasfreespace&gt;
* <p>Condition returns true if selected partition
* has the requested space, false otherwise.</p>
* @since Ant 1.7
*/
public class HasFreeSpace implements Condition {
private String partition;
private String needed;
/**
* Evaluate the condition.
* @return true if there enough free space.
* @throws BuildException if there is a problem.
*/
public boolean eval() throws BuildException {
validate();
try {
if (JavaEnvUtils.isAtLeastJavaVersion("1.6")) {
//reflection to avoid bootstrap/build problems
File fs = new File(partition);
ReflectWrapper w = new ReflectWrapper(fs);
long free = ((Long) w.invoke("getFreeSpace")).longValue();
return free >= StringUtils.parseHumanSizes(needed);
} else {
throw new BuildException("HasFreeSpace condition not supported on Java5 or less.");
}
} catch (Exception e) {
throw new BuildException(e);
}
}
private void validate() throws BuildException {
if (null == partition) {
throw new BuildException("Please set the partition attribute.");
}
if (null == needed) {
throw new BuildException("Please set the needed attribute.");
}
}
/**
* The partition/device to check
* @return the partition.
*/
public String getPartition() {
return partition;
}
/**
* Set the partition name.
* @param partition the name to use.
*/
public void setPartition(String partition) {
this.partition = partition;
}
/**
* The amount of free space required
* @return the amount required
*/
public String getNeeded() {
return needed;
}
/**
* Set the amount of space required.
* @param needed the amount required.
*/
public void setNeeded(String needed) {
this.needed = needed;
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.util.ReflectWrapper;
import org.apache.tools.ant.util.StringUtils;
/**
* &lt;hasfreespace&gt;
* <p>Condition returns true if selected partition
* has the requested space, false otherwise.</p>
* @since Ant 1.7
*/
public class HasFreeSpace implements Condition {
private String partition;
private String needed;
/**
* Evaluate the condition.
* @return true if there enough free space.
* @throws BuildException if there is a problem.
*/
public boolean eval() throws BuildException {
validate();
try {
if (JavaEnvUtils.isAtLeastJavaVersion("1.6")) {
//reflection to avoid bootstrap/build problems
File fs = new File(partition);
ReflectWrapper w = new ReflectWrapper(fs);
long free = ((Long) w.invoke("getFreeSpace")).longValue();
return free >= StringUtils.parseHumanSizes(needed);
} else {
throw new BuildException("HasFreeSpace condition not supported on Java5 or less.");
}
} catch (Exception e) {
throw new BuildException(e);
}
}
private void validate() throws BuildException {
if (null == partition) {
throw new BuildException("Please set the partition attribute.");
}
if (null == needed) {
throw new BuildException("Please set the needed attribute.");
}
}
/**
* The partition/device to check
* @return the partition.
*/
public String getPartition() {
return partition;
}
/**
* Set the partition name.
* @param partition the name to use.
*/
public void setPartition(String partition) {
this.partition = partition;
}
/**
* The amount of free space required
* @return the amount required
*/
public String getNeeded() {
return needed;
}
/**
* Set the amount of space required.
* @param needed the amount required.
*/
public void setNeeded(String needed) {
this.needed = needed;
}
}

+ 165
- 165
src/main/org/apache/tools/ant/taskdefs/condition/ResourceContains.java View File

@@ -1,165 +1,165 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.FileResource;
import org.apache.tools.ant.util.FileUtils;
/**
* &lt;resourcecontains&gt;
* Is a string contained in a resource (file currently)?
* @since Ant 1.7.1
*/
public class ResourceContains implements Condition {
private Project project;
private String substring;
private Resource resource;
private String refid;
private boolean casesensitive = true;
/**
* Set this condition's Project.
* @param project Project
*/
public void setProject(Project project) {
this.project = project;
}
/**
* Get this condition's Project.
* @return Project
*/
public Project getProject() {
return project;
}
/**
* Sets the resource to search
* @param r the value to use.
*/
public void setResource(String r) {
this.resource = new FileResource(new File(r));
}
/**
* Sets the refid to search; should indicate a resource directly
* or by way of a single-element ResourceCollection.
* @param refid the value to use.
*/
public void setRefid(String refid) {
this.refid = refid;
}
private void resolveRefid() {
try {
if (getProject() == null) {
throw new BuildException("Cannot retrieve refid; project unset");
}
Object o = getProject().getReference(refid);
if (!(o instanceof Resource)) {
if (o instanceof ResourceCollection) {
ResourceCollection rc = (ResourceCollection) o;
if (rc.size() == 1) {
o = rc.iterator().next();
}
} else {
throw new BuildException(
"Illegal value at '" + refid + "': " + String.valueOf(o));
}
}
this.resource = (Resource) o;
} finally {
refid = null;
}
}
/**
* Sets the substring to look for
* @param substring the value to use.
*/
public void setSubstring(String substring) {
this.substring = substring;
}
/**
* Sets case sensitivity attribute.
* @param casesensitive the value to use.
*/
public void setCasesensitive(boolean casesensitive) {
this.casesensitive = casesensitive;
}
private void validate() {
if (resource != null && refid != null) {
throw new BuildException("Cannot set both resource and refid");
}
if (resource == null && refid != null) {
resolveRefid();
}
if (resource == null || substring == null) {
throw new BuildException("both resource and substring are required "
+ "in <resourcecontains>");
}
}
/**
* Evaluates the condition.
* @return true if the substring is contained in the resource
* @throws BuildException if there is a problem.
*/
public synchronized boolean eval() throws BuildException {
validate();
if (substring.length() == 0) {
if (getProject() != null) {
getProject().log("Substring is empty; returning true",
Project.MSG_VERBOSE);
}
return true;
}
if (resource.getSize() == 0) {
return false;
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
String contents = FileUtils.safeReadFully(reader);
String sub = substring;
if (!casesensitive) {
contents = contents.toLowerCase();
sub = sub.toLowerCase();
}
return contents.indexOf(sub) >= 0;
} catch (IOException e) {
throw new BuildException("There was a problem accessing resource : " + resource);
} finally {
FileUtils.close(reader);
}
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.condition;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.Resource;
import org.apache.tools.ant.types.ResourceCollection;
import org.apache.tools.ant.types.resources.FileResource;
import org.apache.tools.ant.util.FileUtils;
/**
* &lt;resourcecontains&gt;
* Is a string contained in a resource (file currently)?
* @since Ant 1.7.1
*/
public class ResourceContains implements Condition {
private Project project;
private String substring;
private Resource resource;
private String refid;
private boolean casesensitive = true;
/**
* Set this condition's Project.
* @param project Project
*/
public void setProject(Project project) {
this.project = project;
}
/**
* Get this condition's Project.
* @return Project
*/
public Project getProject() {
return project;
}
/**
* Sets the resource to search
* @param r the value to use.
*/
public void setResource(String r) {
this.resource = new FileResource(new File(r));
}
/**
* Sets the refid to search; should indicate a resource directly
* or by way of a single-element ResourceCollection.
* @param refid the value to use.
*/
public void setRefid(String refid) {
this.refid = refid;
}
private void resolveRefid() {
try {
if (getProject() == null) {
throw new BuildException("Cannot retrieve refid; project unset");
}
Object o = getProject().getReference(refid);
if (!(o instanceof Resource)) {
if (o instanceof ResourceCollection) {
ResourceCollection rc = (ResourceCollection) o;
if (rc.size() == 1) {
o = rc.iterator().next();
}
} else {
throw new BuildException(
"Illegal value at '" + refid + "': " + String.valueOf(o));
}
}
this.resource = (Resource) o;
} finally {
refid = null;
}
}
/**
* Sets the substring to look for
* @param substring the value to use.
*/
public void setSubstring(String substring) {
this.substring = substring;
}
/**
* Sets case sensitivity attribute.
* @param casesensitive the value to use.
*/
public void setCasesensitive(boolean casesensitive) {
this.casesensitive = casesensitive;
}
private void validate() {
if (resource != null && refid != null) {
throw new BuildException("Cannot set both resource and refid");
}
if (resource == null && refid != null) {
resolveRefid();
}
if (resource == null || substring == null) {
throw new BuildException("both resource and substring are required "
+ "in <resourcecontains>");
}
}
/**
* Evaluates the condition.
* @return true if the substring is contained in the resource
* @throws BuildException if there is a problem.
*/
public synchronized boolean eval() throws BuildException {
validate();
if (substring.length() == 0) {
if (getProject() != null) {
getProject().log("Substring is empty; returning true",
Project.MSG_VERBOSE);
}
return true;
}
if (resource.getSize() == 0) {
return false;
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
String contents = FileUtils.safeReadFully(reader);
String sub = substring;
if (!casesensitive) {
contents = contents.toLowerCase();
sub = sub.toLowerCase();
}
return contents.indexOf(sub) >= 0;
} catch (IOException e) {
throw new BuildException("There was a problem accessing resource : " + resource);
} finally {
FileUtils.close(reader);
}
}
}

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

@@ -1,425 +1,425 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.junit;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Vector;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.util.FileUtils;
/**
* <p>Collects all failing test <i>cases</i> and creates a new JUnit test class containing
* a suite() method which calls these failed tests.</p>
* <p>Having classes <i>A</i> ... <i>D</i> with each several testcases you could earn a new
* test class like
* <pre>
* // generated on: 2007.08.06 09:42:34,555
* import junit.framework.*;
* public class FailedTests extends TestCase {
* public FailedTests(String testname) {
* super(testname);
* }
* public static Test suite() {
* TestSuite suite = new TestSuite();
* suite.addTest( new B("test04") );
* suite.addTest( new org.D("test10") );
* return suite;
* }
* }
* </pre>
*
* Because each running test case gets its own formatter, we collect
* the failing test cases in a static list. Because we dont have a finalizer
* method in the formatters "lifecycle", we register this formatter as
* BuildListener and generate the new java source on taskFinished event.
*
* @since Ant 1.8.0
*/
public class FailureRecorder extends ProjectComponent implements JUnitResultFormatter, BuildListener {
/**
* This is the name of a magic System property ({@value}). The value of this
* <b>System</b> property should point to the location where to store the
* generated class (without suffix).
* Default location and name is defined in DEFAULT_CLASS_LOCATION.
* @see #DEFAULT_CLASS_LOCATION
*/
public static final String MAGIC_PROPERTY_CLASS_LOCATION
= "ant.junit.failureCollector";
/** Default location and name for the generated JUnit class file. {@value} */
public static final String DEFAULT_CLASS_LOCATION
= System.getProperty("java.io.tmpdir") + "FailedTests";
/** Prefix for logging. {@value} */
private static final String LOG_PREFIX = " [junit]";
/** Class names of failed tests without duplicates. */
private static SortedSet/*<TestInfos>*/ failedTests = new TreeSet();
/** A writer for writing the generated source to. */
private PrintWriter writer;
/**
* Location and name of the generated JUnit class.
* Lazy instantiated via getLocationName().
*/
private static String locationName;
/**
* Returns the (lazy evaluated) location for the collector class.
* Order for evaluation: System property > Ant property > default value
* @return location for the collector class
* @see #MAGIC_PROPERTY_CLASS_LOCATION
* @see #DEFAULT_CLASS_LOCATION
*/
private String getLocationName() {
if (locationName == null) {
String syspropValue = System.getProperty(MAGIC_PROPERTY_CLASS_LOCATION);
String antpropValue = getProject().getProperty(MAGIC_PROPERTY_CLASS_LOCATION);
if (syspropValue != null) {
locationName = syspropValue;
verbose("System property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' set, so use "
+ "its value '" + syspropValue + "' as location for collector class.");
} else if (antpropValue != null) {
locationName = antpropValue;
verbose("Ant property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' set, so use "
+ "its value '" + antpropValue + "' as location for collector class.");
} else {
locationName = DEFAULT_CLASS_LOCATION;
verbose("System property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' not set, so use "
+ "value as location for collector class: '"
+ DEFAULT_CLASS_LOCATION + "'");
}
File locationFile = new File(locationName);
if (!locationFile.isAbsolute()) {
File f = new File(getProject().getBaseDir(), locationName);
locationName = f.getAbsolutePath();
verbose("Location file is relative (" + locationFile + ")"
+ " use absolute path instead (" + locationName + ")");
}
}
return locationName;
}
/**
* This method is called by the Ant runtime by reflection. We use the project reference for
* registration of this class as BuildListener.
*
* @param project
* project reference
*/
public void setProject(Project project) {
// store project reference for logging
super.setProject(project);
// check if already registered
boolean alreadyRegistered = false;
Vector allListeners = project.getBuildListeners();
for (int i = 0; i < allListeners.size(); i++) {
Object listener = allListeners.get(i);
if (listener instanceof FailureRecorder) {
alreadyRegistered = true;
continue;
}
}
// register if needed
if (!alreadyRegistered) {
verbose("Register FailureRecorder (@" + this.hashCode() + ") as BuildListener");
project.addBuildListener(this);
}
}
// ===== JUnitResultFormatter =====
/**
* Not used
* {@inheritDoc}
*/
public void endTestSuite(JUnitTest suite) throws BuildException {
}
/**
* Add the failed test to the list.
* @param test the test that errored.
* @param throwable the reason it errored.
* @see junit.framework.TestListener#addError(junit.framework.Test, java.lang.Throwable)
*/
public void addError(Test test, Throwable throwable) {
failedTests.add(new TestInfos(test));
}
// CheckStyle:LineLengthCheck OFF - @see is long
/**
* Add the failed test to the list.
* @param test the test that failed.
* @param error the assertion that failed.
* @see junit.framework.TestListener#addFailure(junit.framework.Test, junit.framework.AssertionFailedError)
*/
// CheckStyle:LineLengthCheck ON
public void addFailure(Test test, AssertionFailedError error) {
failedTests.add(new TestInfos(test));
}
/**
* Not used
* {@inheritDoc}
*/
public void setOutput(OutputStream out) {
// unused, close output file so it can be deleted before the VM exits
if (out != System.out) {
FileUtils.close(out);
}
}
/**
* Not used
* {@inheritDoc}
*/
public void setSystemError(String err) {
}
/**
* Not used
* {@inheritDoc}
*/
public void setSystemOutput(String out) {
}
/**
* Not used
* {@inheritDoc}
*/
public void startTestSuite(JUnitTest suite) throws BuildException {
}
/**
* Not used
* {@inheritDoc}
*/
public void endTest(Test test) {
}
/**
* Not used
* {@inheritDoc}
*/
public void startTest(Test test) {
}
// ===== "Templates" for generating the JUnit class =====
private void writeJavaClass() {
try {
File sourceFile = new File((getLocationName() + ".java"));
verbose("Write collector class to '" + sourceFile.getAbsolutePath() + "'");
sourceFile.delete();
writer = new PrintWriter(new FileOutputStream(sourceFile));
createClassHeader();
createSuiteMethod();
createClassFooter();
FileUtils.close(writer);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void createClassHeader() {
String className = getLocationName().replace('\\', '/');
if (className.indexOf('/') > -1) {
className = className.substring(className.lastIndexOf('/') + 1);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss,SSS");
writer.print("// generated on: ");
writer.println(sdf.format(new Date()));
writer.println("import junit.framework.*;");
writer.print("public class ");
writer.print(className);
// If this class does not extend TC, Ant doesnt run these
writer.println(" extends TestCase {");
// standard String-constructor
writer.print(" public ");
writer.print(className);
writer.println("(String testname) {");
writer.println(" super(testname);");
writer.println(" }");
}
private void createSuiteMethod() {
writer.println(" public static Test suite() {");
writer.println(" TestSuite suite = new TestSuite();");
for (Iterator iter = failedTests.iterator(); iter.hasNext();) {
TestInfos testInfos = (TestInfos) iter.next();
writer.print(" suite.addTest(");
writer.print(testInfos);
writer.println(");");
}
writer.println(" return suite;");
writer.println(" }");
}
private void createClassFooter() {
writer.println("}");
}
// ===== Helper classes and methods =====
/**
* Logging facade in INFO-mode.
* @param message Log-message
*/
public void log(String message) {
getProject().log(LOG_PREFIX + " " + message, Project.MSG_INFO);
}
/**
* Logging facade in VERBOSE-mode.
* @param message Log-message
*/
public void verbose(String message) {
getProject().log(LOG_PREFIX + " " + message, Project.MSG_VERBOSE);
}
/**
* TestInfos holds information about a given test for later use.
*/
public class TestInfos implements Comparable {
/** The class name of the test. */
private String className;
/** The method name of the testcase. */
private String methodName;
/**
* This constructor extracts the needed information from the given test.
* @param test Test to analyze
*/
public TestInfos(Test test) {
className = test.getClass().getName();
methodName = test.toString();
methodName = methodName.substring(0, methodName.indexOf('('));
}
/**
* This String-Representation can directly be used for instantiation of
* the JUnit testcase.
* @return the string representation.
* @see java.lang.Object#toString()
* @see FailureRecorder#createSuiteMethod()
*/
public String toString() {
return "new " + className + "(\"" + methodName + "\")";
}
/**
* The SortedMap needs comparable elements.
* @param other the object to compare to.
* @return the result of the comparison.
* @see java.lang.Comparable#compareTo(T)
* @see SortedSet#comparator()
*/
public int compareTo(Object other) {
if (other instanceof TestInfos) {
TestInfos otherInfos = (TestInfos) other;
return toString().compareTo(otherInfos.toString());
} else {
return -1;
}
}
}
// ===== BuildListener =====
/**
* Not used
* {@inheritDoc}
*/
public void buildFinished(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void buildStarted(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void messageLogged(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void targetFinished(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void targetStarted(BuildEvent event) {
}
/**
* The task outside of this JUnitResultFormatter is the <junit> task. So all tests passed
* and we could create the new java class.
* @param event not used
* @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
*/
public void taskFinished(BuildEvent event) {
if (!failedTests.isEmpty()) {
writeJavaClass();
}
}
/**
* Not used
* {@inheritDoc}
*/
public void taskStarted(BuildEvent event) {
}
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.taskdefs.optional.junit;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.Vector;
import junit.framework.AssertionFailedError;
import junit.framework.Test;
import org.apache.tools.ant.BuildEvent;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.BuildListener;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
import org.apache.tools.ant.util.FileUtils;
/**
* <p>Collects all failing test <i>cases</i> and creates a new JUnit test class containing
* a suite() method which calls these failed tests.</p>
* <p>Having classes <i>A</i> ... <i>D</i> with each several testcases you could earn a new
* test class like
* <pre>
* // generated on: 2007.08.06 09:42:34,555
* import junit.framework.*;
* public class FailedTests extends TestCase {
* public FailedTests(String testname) {
* super(testname);
* }
* public static Test suite() {
* TestSuite suite = new TestSuite();
* suite.addTest( new B("test04") );
* suite.addTest( new org.D("test10") );
* return suite;
* }
* }
* </pre>
*
* Because each running test case gets its own formatter, we collect
* the failing test cases in a static list. Because we dont have a finalizer
* method in the formatters "lifecycle", we register this formatter as
* BuildListener and generate the new java source on taskFinished event.
*
* @since Ant 1.8.0
*/
public class FailureRecorder extends ProjectComponent implements JUnitResultFormatter, BuildListener {
/**
* This is the name of a magic System property ({@value}). The value of this
* <b>System</b> property should point to the location where to store the
* generated class (without suffix).
* Default location and name is defined in DEFAULT_CLASS_LOCATION.
* @see #DEFAULT_CLASS_LOCATION
*/
public static final String MAGIC_PROPERTY_CLASS_LOCATION
= "ant.junit.failureCollector";
/** Default location and name for the generated JUnit class file. {@value} */
public static final String DEFAULT_CLASS_LOCATION
= System.getProperty("java.io.tmpdir") + "FailedTests";
/** Prefix for logging. {@value} */
private static final String LOG_PREFIX = " [junit]";
/** Class names of failed tests without duplicates. */
private static SortedSet/*<TestInfos>*/ failedTests = new TreeSet();
/** A writer for writing the generated source to. */
private PrintWriter writer;
/**
* Location and name of the generated JUnit class.
* Lazy instantiated via getLocationName().
*/
private static String locationName;
/**
* Returns the (lazy evaluated) location for the collector class.
* Order for evaluation: System property > Ant property > default value
* @return location for the collector class
* @see #MAGIC_PROPERTY_CLASS_LOCATION
* @see #DEFAULT_CLASS_LOCATION
*/
private String getLocationName() {
if (locationName == null) {
String syspropValue = System.getProperty(MAGIC_PROPERTY_CLASS_LOCATION);
String antpropValue = getProject().getProperty(MAGIC_PROPERTY_CLASS_LOCATION);
if (syspropValue != null) {
locationName = syspropValue;
verbose("System property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' set, so use "
+ "its value '" + syspropValue + "' as location for collector class.");
} else if (antpropValue != null) {
locationName = antpropValue;
verbose("Ant property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' set, so use "
+ "its value '" + antpropValue + "' as location for collector class.");
} else {
locationName = DEFAULT_CLASS_LOCATION;
verbose("System property '" + MAGIC_PROPERTY_CLASS_LOCATION + "' not set, so use "
+ "value as location for collector class: '"
+ DEFAULT_CLASS_LOCATION + "'");
}
File locationFile = new File(locationName);
if (!locationFile.isAbsolute()) {
File f = new File(getProject().getBaseDir(), locationName);
locationName = f.getAbsolutePath();
verbose("Location file is relative (" + locationFile + ")"
+ " use absolute path instead (" + locationName + ")");
}
}
return locationName;
}
/**
* This method is called by the Ant runtime by reflection. We use the project reference for
* registration of this class as BuildListener.
*
* @param project
* project reference
*/
public void setProject(Project project) {
// store project reference for logging
super.setProject(project);
// check if already registered
boolean alreadyRegistered = false;
Vector allListeners = project.getBuildListeners();
for (int i = 0; i < allListeners.size(); i++) {
Object listener = allListeners.get(i);
if (listener instanceof FailureRecorder) {
alreadyRegistered = true;
continue;
}
}
// register if needed
if (!alreadyRegistered) {
verbose("Register FailureRecorder (@" + this.hashCode() + ") as BuildListener");
project.addBuildListener(this);
}
}
// ===== JUnitResultFormatter =====
/**
* Not used
* {@inheritDoc}
*/
public void endTestSuite(JUnitTest suite) throws BuildException {
}
/**
* Add the failed test to the list.
* @param test the test that errored.
* @param throwable the reason it errored.
* @see junit.framework.TestListener#addError(junit.framework.Test, java.lang.Throwable)
*/
public void addError(Test test, Throwable throwable) {
failedTests.add(new TestInfos(test));
}
// CheckStyle:LineLengthCheck OFF - @see is long
/**
* Add the failed test to the list.
* @param test the test that failed.
* @param error the assertion that failed.
* @see junit.framework.TestListener#addFailure(junit.framework.Test, junit.framework.AssertionFailedError)
*/
// CheckStyle:LineLengthCheck ON
public void addFailure(Test test, AssertionFailedError error) {
failedTests.add(new TestInfos(test));
}
/**
* Not used
* {@inheritDoc}
*/
public void setOutput(OutputStream out) {
// unused, close output file so it can be deleted before the VM exits
if (out != System.out) {
FileUtils.close(out);
}
}
/**
* Not used
* {@inheritDoc}
*/
public void setSystemError(String err) {
}
/**
* Not used
* {@inheritDoc}
*/
public void setSystemOutput(String out) {
}
/**
* Not used
* {@inheritDoc}
*/
public void startTestSuite(JUnitTest suite) throws BuildException {
}
/**
* Not used
* {@inheritDoc}
*/
public void endTest(Test test) {
}
/**
* Not used
* {@inheritDoc}
*/
public void startTest(Test test) {
}
// ===== "Templates" for generating the JUnit class =====
private void writeJavaClass() {
try {
File sourceFile = new File((getLocationName() + ".java"));
verbose("Write collector class to '" + sourceFile.getAbsolutePath() + "'");
sourceFile.delete();
writer = new PrintWriter(new FileOutputStream(sourceFile));
createClassHeader();
createSuiteMethod();
createClassFooter();
FileUtils.close(writer);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
private void createClassHeader() {
String className = getLocationName().replace('\\', '/');
if (className.indexOf('/') > -1) {
className = className.substring(className.lastIndexOf('/') + 1);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss,SSS");
writer.print("// generated on: ");
writer.println(sdf.format(new Date()));
writer.println("import junit.framework.*;");
writer.print("public class ");
writer.print(className);
// If this class does not extend TC, Ant doesnt run these
writer.println(" extends TestCase {");
// standard String-constructor
writer.print(" public ");
writer.print(className);
writer.println("(String testname) {");
writer.println(" super(testname);");
writer.println(" }");
}
private void createSuiteMethod() {
writer.println(" public static Test suite() {");
writer.println(" TestSuite suite = new TestSuite();");
for (Iterator iter = failedTests.iterator(); iter.hasNext();) {
TestInfos testInfos = (TestInfos) iter.next();
writer.print(" suite.addTest(");
writer.print(testInfos);
writer.println(");");
}
writer.println(" return suite;");
writer.println(" }");
}
private void createClassFooter() {
writer.println("}");
}
// ===== Helper classes and methods =====
/**
* Logging facade in INFO-mode.
* @param message Log-message
*/
public void log(String message) {
getProject().log(LOG_PREFIX + " " + message, Project.MSG_INFO);
}
/**
* Logging facade in VERBOSE-mode.
* @param message Log-message
*/
public void verbose(String message) {
getProject().log(LOG_PREFIX + " " + message, Project.MSG_VERBOSE);
}
/**
* TestInfos holds information about a given test for later use.
*/
public class TestInfos implements Comparable {
/** The class name of the test. */
private String className;
/** The method name of the testcase. */
private String methodName;
/**
* This constructor extracts the needed information from the given test.
* @param test Test to analyze
*/
public TestInfos(Test test) {
className = test.getClass().getName();
methodName = test.toString();
methodName = methodName.substring(0, methodName.indexOf('('));
}
/**
* This String-Representation can directly be used for instantiation of
* the JUnit testcase.
* @return the string representation.
* @see java.lang.Object#toString()
* @see FailureRecorder#createSuiteMethod()
*/
public String toString() {
return "new " + className + "(\"" + methodName + "\")";
}
/**
* The SortedMap needs comparable elements.
* @param other the object to compare to.
* @return the result of the comparison.
* @see java.lang.Comparable#compareTo(T)
* @see SortedSet#comparator()
*/
public int compareTo(Object other) {
if (other instanceof TestInfos) {
TestInfos otherInfos = (TestInfos) other;
return toString().compareTo(otherInfos.toString());
} else {
return -1;
}
}
}
// ===== BuildListener =====
/**
* Not used
* {@inheritDoc}
*/
public void buildFinished(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void buildStarted(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void messageLogged(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void targetFinished(BuildEvent event) {
}
/**
* Not used
* {@inheritDoc}
*/
public void targetStarted(BuildEvent event) {
}
/**
* The task outside of this JUnitResultFormatter is the <junit> task. So all tests passed
* and we could create the new java class.
* @param event not used
* @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
*/
public void taskFinished(BuildEvent event) {
if (!failedTests.isEmpty()) {
writeJavaClass();
}
}
/**
* Not used
* {@inheritDoc}
*/
public void taskStarted(BuildEvent event) {
}
}

+ 36
- 36
src/main/org/apache/tools/ant/types/resources/FileProvider.java View File

@@ -1,36 +1,36 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.types.resources;
import java.io.File;
/**
* This is an interface that resources that can provide a file should implement.
* This is a refactoring of {@link FileResource}, to allow other resources
* to act as sources of files (and to make components that only support
* file-based resources from only support FileResource resources.
* @since Ant 1.8
*/
public interface FileProvider {
/**
* Get the file represented by this Resource.
* @return the file.
*/
File getFile();
}
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.types.resources;
import java.io.File;
/**
* This is an interface that resources that can provide a file should implement.
* This is a refactoring of {@link FileResource}, to allow other resources
* to act as sources of files (and to make components that only support
* file-based resources from only support FileResource resources.
* @since Ant 1.8
*/
public interface FileProvider {
/**
* Get the file represented by this Resource.
* @return the file.
*/
File getFile();
}

+ 77
- 77
src/tests/antunit/core/location/location.xml View File

@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,79 +15,79 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="location-test" basedir="." default="all"
xmlns:au="antlib:org.apache.ant.antunit">
<property name="ant.build.dir" location="../../../../../build"/>
<property name="working.dir"
location="${ant.build.dir}/ant-unit/location-dir"/>
<property name="classes.dir" location="${working.dir}/classes"/>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
<target name="setUp">
<mkdir dir="${classes.dir}"/>
<javac srcdir="src" destdir="${classes.dir}" debug="yes"/>
<taskdef name="echo-location" classname="task.EchoLocation"
classpath="${classes.dir}"/>
</target>
<target name="define">
<taskdef name="echoloc"
classname="task.EchoLocation">
<classpath>
<pathelement location="${classes.dir}" />
<pathelement path="${java.class.path}"/>
</classpath>
</taskdef>
</target>
<target name="macrodef" depends="define">
<macrodef name="echoloc2" backtrace="false">
<sequential>
<echoloc/>
</sequential>
</macrodef>
</target>
<target name="presetdef" depends="define">
<presetdef name="echoloc3">
<echoloc/>
</presetdef>
</target>
<target name="tearDown">
<delete dir="${working.dir}"/>
</target>
<target name="test-plain-task">
<echo id="echo">Hello</echo>
<au:assertLogContains text="Hello"/>
</target>
<target name="test-standalone-type">
<!-- TODO -->
</target>
<target name="test-condition-task">
<!-- TODO -->
</target>
<target name="test-macrodef-wrapped-task" depends="macrodef">
<echo id="echo3">Hello</echo>
<echoloc2/>
<au:assertLogContains text="Line: "/>
</target>
<target name="test-presetdef-wrapped-task" depends="presetdef">
<echo id="echo4">Hello</echo>
<echoloc3/>
<au:assertLogContains text="Line: "/>
</target>
</project>
<project name="location-test" basedir="." default="all"
xmlns:au="antlib:org.apache.ant.antunit">
<property name="ant.build.dir" location="../../../../../build"/>
<property name="working.dir"
location="${ant.build.dir}/ant-unit/location-dir"/>
<property name="classes.dir" location="${working.dir}/classes"/>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
<target name="setUp">
<mkdir dir="${classes.dir}"/>
<javac srcdir="src" destdir="${classes.dir}" debug="yes"/>
<taskdef name="echo-location" classname="task.EchoLocation"
classpath="${classes.dir}"/>
</target>
<target name="define">
<taskdef name="echoloc"
classname="task.EchoLocation">
<classpath>
<pathelement location="${classes.dir}" />
<pathelement path="${java.class.path}"/>
</classpath>
</taskdef>
</target>
<target name="macrodef" depends="define">
<macrodef name="echoloc2" backtrace="false">
<sequential>
<echoloc/>
</sequential>
</macrodef>
</target>
<target name="presetdef" depends="define">
<presetdef name="echoloc3">
<echoloc/>
</presetdef>
</target>
<target name="tearDown">
<delete dir="${working.dir}"/>
</target>
<target name="test-plain-task">
<echo id="echo">Hello</echo>
<au:assertLogContains text="Hello"/>
</target>
<target name="test-standalone-type">
<!-- TODO -->
</target>
<target name="test-condition-task">
<!-- TODO -->
</target>
<target name="test-macrodef-wrapped-task" depends="macrodef">
<echo id="echo3">Hello</echo>
<echoloc2/>
<au:assertLogContains text="Line: "/>
</target>
<target name="test-presetdef-wrapped-task" depends="presetdef">
<echo id="echo4">Hello</echo>
<echoloc3/>
<au:assertLogContains text="Line: "/>
</target>
</project>

+ 25
- 25
src/tests/antunit/core/location/src/task/EchoLocation.java View File

@@ -1,26 +1,26 @@
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
public class EchoLocation extends Task {
public void execute() {
log("Line: " + getLocation().getLineNumber(), Project.MSG_INFO);
}
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package task;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
public class EchoLocation extends Task {
public void execute() {
log("Line: " + getLocation().getLineNumber(), Project.MSG_INFO);
}
}

+ 54
- 54
src/tests/antunit/taskdefs/condition/antversion-test.xml View File

@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,56 +15,56 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="antversion-test" default="all" basedir="." xmlns:au="antlib:org.apache.ant.antunit">
<target name="test-atleast">
<au:assertTrue message="Expected antversion of ${ant.version} to be at least 1.7.0">
<!-- AntVersion was introduced like AntUnit in 1.7 - so this must be true -->
<antversion atleast="1.7.0"/>
</au:assertTrue>
</target>
<target name="test-exactly">
<antversion property="ant.actual.version"/>
<au:assertTrue message="Expected antversion of ${ant.actual.version}">
<antversion exactly="${ant.actual.version}"/>
</au:assertTrue>
</target>
<target name="test-atleast-fail">
<property name="version" value="1.8.9"/>
<au:assertFalse>
<antversion atleast="1.9.0"/>
</au:assertFalse>
</target>
<target name="test-task">
<antversion property="antversion"/>
<au:assertPropertySet name="antversion" message="Property 'antversion' should be set."/>
<echo>AntVersion=${antversion}</echo>
</target>
<target name="test-property-conditional1">
<antversion property="antversion" atleast="2.0.0"/>
<au:assertTrue message="Property 'antversion' should not be set because this is not Ant 2.0.0+.">
<not>
<isset property="antversion"/>
</not>
</au:assertTrue>
</target>
<target name="test-property-conditional2">
<antversion property="antversion" atleast="1.7.0"/>
<au:assertTrue message="Property 'antversion' should be set because we should have Ant 1.7.0+ (${ant.version}).">
<isset property="antversion"/>
</au:assertTrue>
</target>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>
<project name="antversion-test" default="all" basedir="." xmlns:au="antlib:org.apache.ant.antunit">
<target name="test-atleast">
<au:assertTrue message="Expected antversion of ${ant.version} to be at least 1.7.0">
<!-- AntVersion was introduced like AntUnit in 1.7 - so this must be true -->
<antversion atleast="1.7.0"/>
</au:assertTrue>
</target>
<target name="test-exactly">
<antversion property="ant.actual.version"/>
<au:assertTrue message="Expected antversion of ${ant.actual.version}">
<antversion exactly="${ant.actual.version}"/>
</au:assertTrue>
</target>
<target name="test-atleast-fail">
<property name="version" value="1.8.9"/>
<au:assertFalse>
<antversion atleast="1.9.0"/>
</au:assertFalse>
</target>
<target name="test-task">
<antversion property="antversion"/>
<au:assertPropertySet name="antversion" message="Property 'antversion' should be set."/>
<echo>AntVersion=${antversion}</echo>
</target>
<target name="test-property-conditional1">
<antversion property="antversion" atleast="2.0.0"/>
<au:assertTrue message="Property 'antversion' should not be set because this is not Ant 2.0.0+.">
<not>
<isset property="antversion"/>
</not>
</au:assertTrue>
</target>
<target name="test-property-conditional2">
<antversion property="antversion" atleast="1.7.0"/>
<au:assertTrue message="Property 'antversion' should be set because we should have Ant 1.7.0+ (${ant.version}).">
<isset property="antversion"/>
</au:assertTrue>
</target>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>

+ 40
- 40
src/tests/antunit/taskdefs/condition/hasfreespace-test.xml View File

@@ -1,4 +1,4 @@
<?xml version="1.0"?>
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
@@ -15,43 +15,43 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="hasfreespace-test" default="all" basedir="." xmlns:au="antlib:org.apache.ant.antunit">
<available property="jdk6.available" classname="java.util.ServiceLoader"/>
<property name="partition" value="${user.home}" />
<target name="test-not-enough-space-human" if="jdk6.available">
<au:assertFalse>
<hasfreespace partition="${partition}" needed="1P"/>
</au:assertFalse>
</target>
<target name="test-enough-space-human" if="jdk6.available">
<au:assertTrue>
<hasfreespace partition="${partition}" needed="1K"/>
</au:assertTrue>
</target>
<target name="test-not-enough-space" if="jdk6.available">
<property name="long.max-value" value="9223372036854775807"/>
<au:assertFalse>
<hasfreespace partition="${partition}" needed="${long.max-value}"/>
</au:assertFalse>
</target>
<target name="test-enough-space" if="jdk6.available">
<au:assertTrue>
<hasfreespace partition="${partition}" needed="1"/>
</au:assertTrue>
</target>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
<project name="hasfreespace-test" default="all" basedir="." xmlns:au="antlib:org.apache.ant.antunit">
<available property="jdk6.available" classname="java.util.ServiceLoader"/>
<property name="partition" value="${user.home}" />
<target name="test-not-enough-space-human" if="jdk6.available">
<au:assertFalse>
<hasfreespace partition="${partition}" needed="1P"/>
</au:assertFalse>
</target>
<target name="test-enough-space-human" if="jdk6.available">
<au:assertTrue>
<hasfreespace partition="${partition}" needed="1K"/>
</au:assertTrue>
</target>
<target name="test-not-enough-space" if="jdk6.available">
<property name="long.max-value" value="9223372036854775807"/>
<au:assertFalse>
<hasfreespace partition="${partition}" needed="${long.max-value}"/>
</au:assertFalse>
</target>
<target name="test-enough-space" if="jdk6.available">
<au:assertTrue>
<hasfreespace partition="${partition}" needed="1"/>
</au:assertTrue>
</target>
<target name="all">
<au:antunit>
<fileset file="${ant.file}"/>
<au:plainlistener/>
</au:antunit>
</target>
</project>

+ 87
- 87
src/tests/antunit/taskdefs/echoxml-test.xml View File

@@ -1,87 +1,87 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<!-- note relies on antunit 1.1 -->
<import file="../antunit-base.xml"/>
<target name="setUp">
<property name="file" location="${output}/echoed.xml"/>
<mkdir dir="${output}"/>
<echoxml file="${file}">
<project>
<property name="foo" value="bar" />
<fail message="$$$${foo}=$${foo}">
<condition>
<istrue value="${mustfail}" />
</condition>
</fail>
</project>
</echoxml>
</target>
<target name="testPass">
<ant antfile="${file}"/>
</target>
<target name="testFail">
<au:expectfailure expectedmessage="${foo}=bar" message="Should have thrown an exception">
<ant antfile="${file}">
<property name="mustfail" value="true" />
</ant>
</au:expectfailure>
</target>
<target name="testEmpty">
<au:expectfailure expectedmessage="No nested XML specified" message="Should have thrown an exception">
<echoxml />
</au:expectfailure>
</target>
<!-- comment this and the next targets if you don't have the svn
trunk of antunit -->
<target name="test-ns-all">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="all">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertResourceContains resource="${file}" value="antlib:a"/>
</target>
<target name="test-ns-elementsOnly">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="elementsOnly">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertResourceContains resource="${file}" value="antlib:a"/>
</target>
<target name="test-ns-ignore">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="ignore">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertFalse message="Didn't expecte ${file} to contain antlib:a">
<resourcecontains resource="${file}" substring="antlib:a"/>
</au:assertFalse>
</target>
</project>
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<!-- note relies on antunit 1.1 -->
<import file="../antunit-base.xml"/>
<target name="setUp">
<property name="file" location="${output}/echoed.xml"/>
<mkdir dir="${output}"/>
<echoxml file="${file}">
<project>
<property name="foo" value="bar" />
<fail message="$$$${foo}=$${foo}">
<condition>
<istrue value="${mustfail}" />
</condition>
</fail>
</project>
</echoxml>
</target>
<target name="testPass">
<ant antfile="${file}"/>
</target>
<target name="testFail">
<au:expectfailure expectedmessage="${foo}=bar" message="Should have thrown an exception">
<ant antfile="${file}">
<property name="mustfail" value="true" />
</ant>
</au:expectfailure>
</target>
<target name="testEmpty">
<au:expectfailure expectedmessage="No nested XML specified" message="Should have thrown an exception">
<echoxml />
</au:expectfailure>
</target>
<!-- comment this and the next targets if you don't have the svn
trunk of antunit -->
<target name="test-ns-all">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="all">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertResourceContains resource="${file}" value="antlib:a"/>
</target>
<target name="test-ns-elementsOnly">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="elementsOnly">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertResourceContains resource="${file}" value="antlib:a"/>
</target>
<target name="test-ns-ignore">
<echoxml file="${file}" xmlns:a="antlib:a"
namespacepolicy="ignore">
<a:something a:foo="bar"/>
</echoxml>
<au:assertResourceContains resource="${file}" value="a:something"/>
<au:assertFalse message="Didn't expecte ${file} to contain antlib:a">
<resourcecontains resource="${file}" substring="antlib:a"/>
</au:assertFalse>
</target>
</project>

+ 46
- 46
src/tests/antunit/taskdefs/gzip-test.xml View File

@@ -1,46 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<!-- note relies on antunit 1.1 -->
<import file="../antunit-base.xml" />
<target name="setUp">
<mkdir dir="${output}" />
<mkdir dir="${output}/empty" />
<touch file="${output}/fileone" />
<touch file="${output}/filetwo" />
</target>
<target name="testFailNone">
<au:expectfailure expectedmessage="No resource selected, gzip needs exactly one resource." message="Should have thrown an exception">
<gzip destfile="${output}/file.gz">
<fileset dir="${output}/empty" />
</gzip>
</au:expectfailure>
</target>
<target name="testFailTwo">
<au:expectfailure expectedmessage="gzip cannot handle multiple resources at once. (2 resources were selected.)" message="Should have thrown an exception">
<gzip destfile="${output}/file.gz">
<fileset dir="${output}" />
</gzip>
</au:expectfailure>
</target>
</project>
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<!-- note relies on antunit 1.1 -->
<import file="../antunit-base.xml" />
<target name="setUp">
<mkdir dir="${output}" />
<mkdir dir="${output}/empty" />
<touch file="${output}/fileone" />
<touch file="${output}/filetwo" />
</target>
<target name="testFailNone">
<au:expectfailure expectedmessage="No resource selected, gzip needs exactly one resource." message="Should have thrown an exception">
<gzip destfile="${output}/file.gz">
<fileset dir="${output}/empty" />
</gzip>
</au:expectfailure>
</target>
<target name="testFailTwo">
<au:expectfailure expectedmessage="gzip cannot handle multiple resources at once. (2 resources were selected.)" message="Should have thrown an exception">
<gzip destfile="${output}/file.gz">
<fileset dir="${output}" />
</gzip>
</au:expectfailure>
</target>
</project>

+ 94
- 94
src/tests/antunit/taskdefs/hostinfo-test.xml View File

@@ -1,94 +1,94 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="hostinfo-test" default="antunit"
xmlns:au="antlib:org.apache.ant.antunit">
<import file="../antunit-base.xml" />
<property name="undef-name" value="nonexistenthost.nonexistentdomain" />
<property name="undef-hostname" value="nonexistenthost" />
<property name="undef-domainname" value="nonexistentdomain" />
<property name="undef-ip4" value="0.0.0.0" />
<property name="undef-ip6" value="::" />
<property name="apache-hostname" value="www.apache.org" />
<property name="apache-domain" value="apache.org" />
<property name="apache-realhost" value="eos" />
<property name="apache-ip4" value="140.211.11.130" />
<property name="xs4all-hostname" value="www.xs4all.nl" />
<property name="xs4all-domain" value="xs4all.nl" />
<property name="xs4all-realhost" value="www" />
<property name="xs4all-ip4" value="194.109.6.92" />
<target name="setUp">
</target>
<target name="testLocal" depends="setUp">
<hostinfo prefix="local" />
<!-- Do not know what to expect here, machine dependent -->
</target>
<target name="testApache" depends="setUp">
<hostinfo prefix="apache" host="${apache-hostname}"/>
<au:assertTrue>
<and>
<equals arg1="${apache.NAME}" arg2="${apache-realhost}" />
<equals arg1="${apache.DOMAIN}" arg2="${apache-domain}" />
<equals arg1="${apache.ADDR4}" arg2="${apache-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testApacheNoPrefix" depends="setUp">
<hostinfo host="${apache-hostname}"/>
<au:assertTrue>
<and>
<equals arg1="${NAME}" arg2="${apache-realhost}" />
<equals arg1="${DOMAIN}" arg2="${apache-domain}" />
<equals arg1="${ADDR4}" arg2="${apache-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testReverse" depends="setUp">
<hostinfo prefix="reverse" host="${xs4all-ip4}"/>
<au:assertTrue>
<and>
<equals arg1="${reverse.NAME}" arg2="${xs4all-realhost}" />
<equals arg1="${reverse.DOMAIN}" arg2="${xs4all-domain}" />
<equals arg1="${reverse.ADDR4}" arg2="${xs4all-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testUndef" depends="setUp">
<hostinfo prefix="undef" host="${undef-name}"/>
<au:assertTrue>
<and>
<equals arg1="${undef.NAME}" arg2="${undef-hostname}" />
<equals arg1="${undef.DOMAIN}" arg2="${undef-domainname}" />
<equals arg1="${undef.ADDR4}" arg2="${undef-ip4}" />
<equals arg1="${undef.ADDR6}" arg2="${undef-ip6}" />
</and>
</au:assertTrue>
</target>
</project>
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="hostinfo-test" default="antunit"
xmlns:au="antlib:org.apache.ant.antunit">
<import file="../antunit-base.xml" />
<property name="undef-name" value="nonexistenthost.nonexistentdomain" />
<property name="undef-hostname" value="nonexistenthost" />
<property name="undef-domainname" value="nonexistentdomain" />
<property name="undef-ip4" value="0.0.0.0" />
<property name="undef-ip6" value="::" />
<property name="apache-hostname" value="www.apache.org" />
<property name="apache-domain" value="apache.org" />
<property name="apache-realhost" value="eos" />
<property name="apache-ip4" value="140.211.11.130" />
<property name="xs4all-hostname" value="www.xs4all.nl" />
<property name="xs4all-domain" value="xs4all.nl" />
<property name="xs4all-realhost" value="www" />
<property name="xs4all-ip4" value="194.109.6.92" />
<target name="setUp">
</target>
<target name="testLocal" depends="setUp">
<hostinfo prefix="local" />
<!-- Do not know what to expect here, machine dependent -->
</target>
<target name="testApache" depends="setUp">
<hostinfo prefix="apache" host="${apache-hostname}"/>
<au:assertTrue>
<and>
<equals arg1="${apache.NAME}" arg2="${apache-realhost}" />
<equals arg1="${apache.DOMAIN}" arg2="${apache-domain}" />
<equals arg1="${apache.ADDR4}" arg2="${apache-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testApacheNoPrefix" depends="setUp">
<hostinfo host="${apache-hostname}"/>
<au:assertTrue>
<and>
<equals arg1="${NAME}" arg2="${apache-realhost}" />
<equals arg1="${DOMAIN}" arg2="${apache-domain}" />
<equals arg1="${ADDR4}" arg2="${apache-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testReverse" depends="setUp">
<hostinfo prefix="reverse" host="${xs4all-ip4}"/>
<au:assertTrue>
<and>
<equals arg1="${reverse.NAME}" arg2="${xs4all-realhost}" />
<equals arg1="${reverse.DOMAIN}" arg2="${xs4all-domain}" />
<equals arg1="${reverse.ADDR4}" arg2="${xs4all-ip4}" />
</and>
</au:assertTrue>
</target>
<target name="testUndef" depends="setUp">
<hostinfo prefix="undef" host="${undef-name}"/>
<au:assertTrue>
<and>
<equals arg1="${undef.NAME}" arg2="${undef-hostname}" />
<equals arg1="${undef.DOMAIN}" arg2="${undef-domainname}" />
<equals arg1="${undef.ADDR4}" arg2="${undef-ip4}" />
<equals arg1="${undef.ADDR6}" arg2="${undef-ip6}" />
</and>
</au:assertTrue>
</target>
</project>

+ 41
- 41
src/tests/antunit/taskdefs/loadresource-test.xml View File

@@ -1,41 +1,41 @@
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<import file="../antunit-base.xml" />
<target name="test-resourceString">
<loadresource property="p">
<string value="one"/>
</loadresource >
<au:assertPropertyEquals name="p" value="one"/>
</target>
<target name="test-resourceSizeZero" description="Bug 42319">
<loadresource property="p">
<string value=""/>
</loadresource >
<au:assertTrue>
<not>
<isset property="p"/>
</not>
</au:assertTrue>
<au:assertLogContains text="Do not set property p as its length is 0."/>
</target>
</project>
<?xml version="1.0"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project default="antunit" xmlns:au="antlib:org.apache.ant.antunit">
<import file="../antunit-base.xml" />
<target name="test-resourceString">
<loadresource property="p">
<string value="one"/>
</loadresource >
<au:assertPropertyEquals name="p" value="one"/>
</target>
<target name="test-resourceSizeZero" description="Bug 42319">
<loadresource property="p">
<string value=""/>
</loadresource >
<au:assertTrue>
<not>
<isset property="p"/>
</not>
</au:assertTrue>
<au:assertLogContains text="Do not set property p as its length is 0."/>
</target>
</project>

+ 53
- 53
src/tests/antunit/types/resources/files-test.xml View File

@@ -1,53 +1,53 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="files-test" default="antunit"
xmlns:au="antlib:org.apache.ant.antunit">
<target name="antunit">
<au:antunit>
<au:plainlistener />
<file file="${ant.file}" />
</au:antunit>
</target>
<target name="setUp">
<property name="out" value="out"/>
</target>
<target name="tearDown">
<delete dir="${out}"/>
</target>
<target name="testEmptyReference" description="Bug43048">
<files id="foo"/>
<mkdir dir="${out}"/>
<copy todir="${out}">
<!-- threw a java.lang.NullPointerException -->
<files refid="foo"/>
</copy>
</target>
<target name="testEmptyFiles" description="Bug43048">
<mkdir dir="${out}"/>
<copy todir="${out}">
<files/>
</copy>
</target>
</project>
<?xml version="1.0" encoding="utf-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<project name="files-test" default="antunit"
xmlns:au="antlib:org.apache.ant.antunit">
<target name="antunit">
<au:antunit>
<au:plainlistener />
<file file="${ant.file}" />
</au:antunit>
</target>
<target name="setUp">
<property name="out" value="out"/>
</target>
<target name="tearDown">
<delete dir="${out}"/>
</target>
<target name="testEmptyReference" description="Bug43048">
<files id="foo"/>
<mkdir dir="${out}"/>
<copy todir="${out}">
<!-- threw a java.lang.NullPointerException -->
<files refid="foo"/>
</copy>
</target>
<target name="testEmptyFiles" description="Bug43048">
<mkdir dir="${out}"/>
<copy todir="${out}">
<files/>
</copy>
</target>
</project>

Loading…
Cancel
Save