From 3c96ebf5a37f8c1ba7e102bad6a696153c499e80 Mon Sep 17 00:00:00 2001 From: Conor MacNeill Date: Tue, 9 Apr 2002 02:37:54 +0000 Subject: [PATCH] task does not handle case where an inner and outer class are written at different times since they have a mutual dependency. I have introduced a 100 millisecond tolerance to catch this situation PR: 7529 git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272303 13f79535-47bb-0310-9956-ffa450edef68 --- .../taskdefs/optional/depend/depend.xml | 35 ++++++++++- .../optional/depend/src4/test/Outer.java | 7 +++ .../ant/taskdefs/optional/depend/Depend.java | 18 +++++- .../taskdefs/optional/depend/DependTest.java | 61 +++++++++++-------- 4 files changed, 93 insertions(+), 28 deletions(-) create mode 100644 src/etc/testcases/taskdefs/optional/depend/src4/test/Outer.java 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()); } }