diff --git a/src/etc/testcases/taskdefs/optional/depend/depend.xml b/src/etc/testcases/taskdefs/optional/depend/depend.xml
index 7a77e516f..ed27bf9dd 100644
--- a/src/etc/testcases/taskdefs/optional/depend/depend.xml
+++ b/src/etc/testcases/taskdefs/optional/depend/depend.xml
@@ -4,13 +4,15 @@
+
+
This buildfile is used as part of Ant's test suite.
-
+
@@ -32,6 +34,12 @@
+
+
+
+
+
+
@@ -96,4 +104,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java b/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java
new file mode 100644
index 000000000..a352716a4
--- /dev/null
+++ b/src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java
@@ -0,0 +1,7 @@
+package test;
+
+public class Outer {
+ static class Inner {
+ }
+}
+
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
index b70e10637..0a8b1b64d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/depend/Depend.java
@@ -79,6 +79,11 @@ import org.apache.tools.ant.types.Reference;
* @author Conor MacNeill
*/
public class Depend extends MatchingTask {
+ /** Tolerance on time checks to take into account inner to outer class dependencies when
+ * the classes are written at slightly different times
+ */
+ static private final int TIME_TOLERANCE = 100;
+
/**
* A class (struct) user to manage information about a class
*
@@ -484,9 +489,14 @@ public class Depend extends MatchingTask {
public void execute() throws BuildException {
try {
long start = System.currentTimeMillis();
+ if (srcPath == null) {
+ throw new BuildException("srcdir attribute must be set",
+ location);
+ }
+
String[] srcPathList = srcPath.list();
if (srcPathList.length == 0) {
- throw new BuildException("srcdir attribute must be set!",
+ throw new BuildException("srcdir attribute must be non-empty",
location);
}
@@ -559,7 +569,8 @@ public class Depend extends MatchingTask {
Hashtable dependencies = (Hashtable)classpathDependencies.get(className);
for (Enumeration e2 = dependencies.elements(); e2.hasMoreElements(); ) {
File classpathFile = (File)e2.nextElement();
- if (classpathFile.lastModified() > info.absoluteFile.lastModified()) {
+ if (classpathFile.lastModified()
+ > (info.absoluteFile.lastModified() + TIME_TOLERANCE)) {
log("Class " + className +
" is out of date with respect to " + classpathFile, Project.MSG_DEBUG);
outOfDateClasses.put(className, className);
@@ -607,7 +618,8 @@ public class Depend extends MatchingTask {
// there was no class file. add this class to the list
outOfDateClasses.put(className, className);
} else {
- if (srcFile.lastModified() > info.absoluteFile.lastModified()) {
+ if (srcFile.lastModified()
+ > (info.absoluteFile.lastModified() + TIME_TOLERANCE)) {
outOfDateClasses.put(className, className);
}
}
diff --git a/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java b/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
index ac4c012d4..e314aa1ab 100644
--- a/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
+++ b/src/testcases/org/apache/tools/ant/taskdefs/optional/depend/DependTest.java
@@ -92,13 +92,7 @@ public class DependTest extends BuildFileTest {
public void testDirect() {
Project project = getProject();
executeTarget("testdirect");
- FileSet resultFileSet = (FileSet)project.getReference(RESULT_FILESET);
- DirectoryScanner scanner = resultFileSet.getDirectoryScanner(project);
- String[] scannedFiles = scanner.getIncludedFiles();
- Hashtable files = new Hashtable();
- for (int i = 0; i < scannedFiles.length; ++i) {
- files.put(scannedFiles[i], scannedFiles[i]);
- }
+ Hashtable files = getResultFiles();
assertEquals("Depend did not leave correct number of files", 2,
files.size());
assertTrue("Result did not contain A.class",
@@ -113,13 +107,7 @@ public class DependTest extends BuildFileTest {
public void testClosure() {
Project project = getProject();
executeTarget("testclosure");
- FileSet resultFileSet = (FileSet)project.getReference(RESULT_FILESET);
- DirectoryScanner scanner = resultFileSet.getDirectoryScanner(project);
- String[] scannedFiles = scanner.getIncludedFiles();
- Hashtable files = new Hashtable();
- for (int i = 0; i < scannedFiles.length; ++i) {
- files.put(scannedFiles[i], scannedFiles[i]);
- }
+ Hashtable files = getResultFiles();
assertEquals("Depend did not leave correct number of files", 1,
files.size());
assertTrue("Result did not contain D.class",
@@ -132,15 +120,8 @@ public class DependTest extends BuildFileTest {
public void testInner() {
Project project = getProject();
executeTarget("testinner");
- FileSet resultFileSet = (FileSet)project.getReference(RESULT_FILESET);
- DirectoryScanner scanner = resultFileSet.getDirectoryScanner(project);
- String[] scannedFiles = scanner.getIncludedFiles();
- Hashtable files = new Hashtable();
- for (int i = 0; i < scannedFiles.length; ++i) {
- files.put(scannedFiles[i], scannedFiles[i]);
- }
assertEquals("Depend did not leave correct number of files", 0,
- files.size());
+ getResultFiles().size());
}
/**
@@ -150,6 +131,27 @@ public class DependTest extends BuildFileTest {
public void testInnerInner() {
Project project = getProject();
executeTarget("testinnerinner");
+ assertEquals("Depend did not leave correct number of files", 0,
+ getResultFiles().size());
+ }
+
+ /**
+ * Test that an exception is thrown when there is no source
+ */
+ public void testNoSource() {
+ expectBuildExceptionContaining("testnosource",
+ "No source specified", "srcdir attribute must be set");
+ }
+
+ /**
+ * Test that an exception is thrown when the source attribute is empty
+ */
+ public void testEmptySource() {
+ expectBuildExceptionContaining("testemptysource",
+ "No source specified", "srcdir attribute must be non-empty");
+ }
+
+ private Hashtable getResultFiles() {
FileSet resultFileSet = (FileSet)project.getReference(RESULT_FILESET);
DirectoryScanner scanner = resultFileSet.getDirectoryScanner(project);
String[] scannedFiles = scanner.getIncludedFiles();
@@ -157,7 +159,18 @@ public class DependTest extends BuildFileTest {
for (int i = 0; i < scannedFiles.length; ++i) {
files.put(scannedFiles[i], scannedFiles[i]);
}
- assertEquals("Depend did not leave correct number of files", 0,
- files.size());
+ return files;
+ }
+
+
+ /**
+ * Test mutual dependency between inner and outer do not cause both to be
+ * deleted
+ */
+ public void testInnerClosure() {
+ Project project = getProject();
+ executeTarget("testinnerclosure");
+ assertEquals("Depend did not leave correct number of files", 2,
+ getResultFiles().size());
}
}