]> source.dussan.org Git - aspectj.git/commitdiff
no longer leaving temp files/directories
authorwisberg <wisberg>
Fri, 31 Jan 2003 18:39:48 +0000 (18:39 +0000)
committerwisberg <wisberg>
Fri, 31 Jan 2003 18:39:48 +0000 (18:39 +0000)
util/testsrc/org/aspectj/util/FileUtilTest.java

index e528867dac4d18351fb5a012ab4fdc3cecf9254b..c9e1eea67ac27b7ae74999ec388c9db317919eeb 100644 (file)
@@ -13,7 +13,6 @@
 
 package org.aspectj.util;
 
-import java.io.EOFException;
 import java.io.File;
 import java.io.FilenameFilter;
 import java.io.IOException;
@@ -35,23 +34,168 @@ import junit.textui.TestRunner;
  */
 public class FileUtilTest extends TestCase {
     public static final String[] NONE = new String[0];
+    public static boolean log = true;
 
-    boolean log = false;
+    public static void main(String[] args) {
+        TestRunner.main(new String[] {"org.aspectj.util.FileUtilTest"});
+    }
+    
+    public static void assertSame(String prefix, String[] lhs, String[] rhs) { // XXX cheap diff
+        String srcPaths = LangUtil.arrayAsList(lhs).toString();
+        String destPaths = LangUtil.arrayAsList(rhs).toString();
+        if (!srcPaths.equals(destPaths)) {
+            log("expected: " + srcPaths);
+            log("  actual: " + destPaths);
+            assertTrue(prefix + " expected=" + srcPaths
+                + " != actual=" + destPaths, false);
+        }        
+    }
+
+    /** 
+     * Verify that dir contains files with names, 
+     * and return the names of other files in dir.
+     * @return the contents of dir after excluding files 
+     *           or NONE if none
+     * @throws AssertionFailedError if any names are not in dir
+     */
+    public static String[] dirContains(File dir, final String[] filenames) {
+        final ArrayList sought 
+            = new ArrayList(LangUtil.arrayAsList(filenames));
+        FilenameFilter filter = new FilenameFilter() {
+            public boolean accept(File d, String name) {
+                return !sought.remove(name);
+            }
+        };
+        // remove any found from sought and return remainder
+        String[] found = dir.list(filter);
+        if (0 < sought.size()) {
+            assertTrue("found "+ LangUtil.arrayAsList(dir.list()).toString()
+                + " expected " + sought, false);
+        }        
+        return (found.length == 0 ? NONE : found);
+    }
+    /** @return sorted String[] of all paths to all files/dirs under dir */
+    public static String[] dirPaths(File dir) {
+        return dirPaths(dir, new String[0]);
+    }
+
+       /** 
+     * Get a sorted String[] of all paths to all files/dirs under dir.
+     * Files with names starting with "." are ignored,
+     * as are directory paths containing "CVS".
+     * The directory prefix of the path is stripped.
+     * Thus, given directory:
+     * <pre>path/to
+     *   .cvsignore
+     *   CVS/
+     *     Root
+     *     Repository
+     *   Base.java
+     *   com/
+     *     parc/
+     *       messages.properties
+     *   org/
+     *     aspectj/
+     *       Version.java
+     * </pre>
+     * a call
+     * <pre>
+     *   dirPaths(new File("path/to"), new String[0]);
+     * </pre>
+     * returns
+     * <pre>
+     *   { "Base.java", "com/parc/messages.properties", 
+     *     "org/aspectj/Version.java" }
+     * </pre>
+     * while the call
+     * <pre>
+     *   dirPaths(new File("path/to"), new String[] { ".java"});
+     * </pre>
+     * returns
+     * <pre>
+     *   { "Base.java", "org/aspectj/Version.java" }
+     * </pre>
+     * @param dir the File path to the directory to inspect    
+     * @param suffixes if not empty, require files returned to have this suffix
+     * @return sorted String[] of all paths to all files under dir 
+     *           ending with one of the listed suffixes 
+     *           but not starting with "."
+     */
+    public static String[] dirPaths(File dir, String[] suffixes) {
+        ArrayList result = new ArrayList();
+        doDirPaths(dir, result);
+        // if suffixes required, remove those without suffixes
+        if (!LangUtil.isEmpty(suffixes)) {
+            for (ListIterator iter = result.listIterator(); iter.hasNext();) {
+                String path = iter.next().toString();
+                boolean hasSuffix = false;
+                for (int i = 0; !hasSuffix && (i < suffixes.length); i++) {
+                                       hasSuffix = path.endsWith(suffixes[i]);
+                               }
+                if (!hasSuffix) {
+                    iter.remove();
+                }                              
+                       }
+        }
+        Collections.sort(result);
+        // trim prefix
+        final String prefix = dir.getPath();
+        final int len = prefix.length() + 1; // plus directory separator
+        String[] ra = (String[]) result.toArray(new String[0]);
+        for (int i = 0; i < ra.length; i++) {
+            // assertTrue(ra[i].startsWith(prefix));                   
+            assertTrue(ra[i], ra[i].length() > len);            
+            ra[i] = ra[i].substring(len);
+               }
+        return ra;
+    }
+
+       /**
+     * @param dir the File to read - ignored if null, not a directory,
+     *             or has "CVS" in its path
+     * @param useSuffix if true, then use dir as suffix to path
+     */
+    private static void doDirPaths(File dir, ArrayList paths) {
+        if ((null == dir) || !dir.canRead() 
+            || (-1 != dir.getPath().indexOf("CVS"))) {
+            return;
+        }
+        File[] files = dir.listFiles();
+        for (int i = 0; i < files.length; i++) {
+            String path = files[i].getPath();
+            if (!files[i].getName().startsWith(".")) {
+                if (files[i].isFile()) {
+                    paths.add(path);
+                } else if (files[i].isDirectory()) {
+                    doDirPaths(files[i], paths);
+                } else {
+                    log("not file or dir: "
+                        + dir + "/" + path);
+                }
+            }
+               }
+    }
+
+    /** Print s if logging is enabled */
+    private static void log(String s) {
+        if (log) {
+            System.err.println(s);
+        }
+    }
 
     /** List of File files or directories to delete when exiting */
     final ArrayList tempFiles;
+    
     public FileUtilTest(String s) {
         super(s);
         tempFiles = new ArrayList();
     }
        
-       public static void main(String[] args) {
-        TestRunner.main(new String[] {"org.aspectj.util.FileUtilUT"});
-       }
-    
     public void tearDown() {
         for (ListIterator iter = tempFiles.listIterator(); iter.hasNext();) {
                        File dir = (File) iter.next();
+            log("removing " + dir);
                        FileUtil.deleteContents(dir);
             dir.delete();
             iter.remove();
@@ -122,21 +266,30 @@ public class FileUtilTest extends TestCase {
             }
         }
     }
-    public void testDirCopySubdirs() throws IOException { // XXX dir diff
+    
+    public void testDirCopySubdirs() throws IOException {
         File srcDir = new File("src");
         File destDir = FileUtil.getTempDir("testDirCopySubdirs");
+        tempFiles.add(destDir);
         FileUtil.copyDir(srcDir, destDir);
-        FileUtil.deleteContents(destDir);
-        destDir.delete();
+        assertSame("testDirCopySubdirs", dirPaths(srcDir), dirPaths(destDir));
     }
 
-    public void testDirCopySubdirsSuffix() throws IOException { // XXX dir diff
+    public void testDirCopySubdirsSuffix() throws IOException {
         File srcDir = new File("src");
         File destDir = FileUtil.getTempDir("testDirCopySubdirsSuffix");
+        tempFiles.add(destDir);
         FileUtil.copyDir(srcDir, destDir, ".java", ".aj");
 
-        FileUtil.deleteContents(destDir);
-        destDir.delete();
+        String[] sources = dirPaths(srcDir, new String[] { ".java" });
+        for (int i = 0; i < sources.length; i++) {
+                       sources[i] = sources[i].substring(0, sources[i].length()-4);
+               }
+        String[] sinks = dirPaths(destDir, new String[] { ".aj" });
+        for (int i = 0; i < sinks.length; i++) {
+            sinks[i] = sinks[i].substring(0, sinks[i].length()-2);
+        }
+        assertSame("testDirCopySubdirs", sources, sinks);
     }
         
     public void testGetURL() {
@@ -185,9 +338,9 @@ public class FileUtilTest extends TestCase {
         boolean delete  = true;
         checkGetTempDir("parent", null, pass, delete);
         checkGetTempDir(null, "child", pass, delete);
-        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete));
-        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete));
-        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete));
+        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete).getParentFile());
+        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete).getParentFile());
+        tempFiles.add(checkGetTempDir("parent", "child", pass, !delete).getParentFile());
     }
 
     File checkGetTempDir(String parent, String child, boolean ok, boolean delete) {
@@ -198,6 +351,7 @@ public class FileUtilTest extends TestCase {
         assertTrue("dir: " + dir, ok == (dir.canWrite() && dir.isDirectory()));
         if (delete) {
             dir.delete();
+            parentDir.delete();
         }
         return dir;
     }
@@ -207,7 +361,7 @@ public class FileUtilTest extends TestCase {
         for (int i = 0; i < 1000; i++) {
             String s = FileUtil.randomFileString();
             if (results.contains(s)) {
-                System.err.println("warning: got duplicate at iteration " + i);
+                log("warning: got duplicate at iteration " + i);
             }
             results.add(s);
 //                     System.err.print(" " + s);
@@ -220,9 +374,11 @@ public class FileUtilTest extends TestCase {
     public void testNormalizedPath() {
         File tempFile = null;
         try {
-            tempFile = File.createTempFile("FileUtilTest", "tmp");
+            tempFile = File.createTempFile("FileUtilTest_testNormalizedPath", "tmp");
+            tempFiles.add(tempFile);
         } catch (IOException e) {
-            System.err.println("aborting test - unable to create temp file");
+            log("aborting test - unable to create temp file");
+            return;
         }
         File parentDir = tempFile.getParentFile();
         String tempFilePath = FileUtil.normalizedPath(tempFile, parentDir);
@@ -231,7 +387,7 @@ public class FileUtilTest extends TestCase {
 
     public void testFileToClassName() {
 
-        File basedir = new File("/base/dir");
+        File basedir = new File("/base/dir"); // never created
         File classFile = new File(basedir, "foo/Bar.class");
         assertEquals("foo.Bar", FileUtil.fileToClassName(basedir, classFile));
 
@@ -248,7 +404,9 @@ public class FileUtilTest extends TestCase {
      }
 
     public void testDeleteContents() {
-        File f = new File("testdata/foo");
+        File tempDir = FileUtil.getTempDir("testDeleteContents");
+        tempFiles.add(tempDir);
+        File f = new File(tempDir, "foo");
         f.mkdirs();
         File g = new File(f, "bar");
         g.mkdirs();
@@ -262,9 +420,10 @@ public class FileUtilTest extends TestCase {
     }
     
     public void testLineSeek() {
-        String path = "testdata/testLineSeek";
-        File file = new File(path);
-        path = file.getPath();
+        File tempDir = FileUtil.getTempDir("testLineSeek");
+        tempFiles.add(tempDir);
+        File file = new File(tempDir, "testLineSeek");
+        String path = file.getPath();
         String contents = "0123456789" + LangUtil.EOL;
         contents += contents;
         FileUtil.writeAsString(file, contents);
@@ -291,7 +450,9 @@ public class FileUtilTest extends TestCase {
     }
      public void testLineSeekMore() {
         final int MAX = 3; // 1..10
-        final String prefix = new File("testdata/testLineSeek").getPath();
+        File tempDir = FileUtil.getTempDir("testLineSeekMore");
+        tempFiles.add(tempDir);
+        final String prefix = new File(tempDir, "testLineSeek").getPath();
         // setup files 0..MAX with 2*MAX lines
         String[] sources = new String[MAX];
         StringBuffer sb = new StringBuffer();
@@ -339,8 +500,8 @@ public class FileUtilTest extends TestCase {
         String[] destFiles = new String[] { "three.java", "four.java", "five.java" };
         String[] allFiles = new String[] 
             { "one.java", "two.java", "three.java", "four.java", "five.java" };
-        File srcDir = makeDir("FileUtilUT_srcDir", srcFiles);    
-        File destDir = makeDir("FileUtilUT_destDir", destFiles);
+        File srcDir = makeTempDir("FileUtilUT_srcDir", srcFiles);    
+        File destDir = makeTempDir("FileUtilUT_destDir", destFiles);
         assertTrue(null != srcDir);
         assertTrue(null != destDir);
         assertTrue(NONE == dirContains(srcDir, srcFiles));
@@ -351,11 +512,6 @@ public class FileUtilTest extends TestCase {
         FileUtil.copyDir(srcDir, destDir);
         String[] resultTwo = dirContains(destDir, allFiles);
 
-        FileUtil.deleteContents(srcDir);
-        FileUtil.deleteContents(destDir);
-        srcDir.delete();
-        destDir.delete();
-
         assertTrue(NONE == resultOne);
         assertTrue(NONE == resultTwo);
     }
@@ -365,25 +521,18 @@ public class FileUtilTest extends TestCase {
         String[] destFiles = new String[] { "three.java", "four.java", "five.java" };
         String[] allFiles = new String[] 
             { "one.aj", "two.aj", "three.aj", "three.java", "four.java", "five.java" };
-        File srcDir = makeDir("FileUtilUT_srcDir", srcFiles);    
-        File destDir = makeDir("FileUtilUT_destDir", destFiles);
+        File srcDir = makeTempDir("FileUtilUT_srcDir", srcFiles);    
+        File destDir = makeTempDir("FileUtilUT_destDir", destFiles);
         assertTrue(null != srcDir);
         assertTrue(null != destDir);
         assertTrue(NONE == dirContains(srcDir, srcFiles));
         assertTrue(NONE == dirContains(destDir, destFiles));
         
         FileUtil.copyDir(srcDir, destDir, ".java", ".aj");
-        String[] resultOne = dirContains(destDir, allFiles);
         FileUtil.copyDir(srcDir, destDir, ".java", ".aj");
-        String[] resultTwo = dirContains(destDir, allFiles);
 
-        FileUtil.deleteContents(srcDir);
-        FileUtil.deleteContents(destDir);
-        srcDir.delete();
-        destDir.delete();
-
-        assertTrue(NONE == resultOne);
-        assertTrue(NONE == resultTwo);
+        assertTrue(NONE == dirContains(destDir, allFiles));
+        assertTrue(NONE == dirContains(destDir, allFiles));
     }
     
     public void testDirCopySubdirsSuffixRoundTrip() throws IOException { 
@@ -399,43 +548,22 @@ public class FileUtilTest extends TestCase {
         FileUtil.deleteContents(two);
         two.delete();
     }
-    
-    /** 
-     * Verify that dir contains files, 
-     * and return the names of other files in dir.
-     * @return the contents of dir after excluding files 
-     *           or NONE if none
-     * @throws AssertionFailedError if any files are not in dir
+   
+    /**
+     * Create temp dir at loc containing temp files files.
+     * Result is registered for deletion on cleanup.
      */
-    String[] dirContains(File dir, final String[] files) {
-        final ArrayList toFind = new ArrayList(Arrays.asList(files));
-        FilenameFilter filter = new FilenameFilter() {
-            public boolean accept(File d, String name) {
-                return !toFind.remove(name);
-            }
-        };
-        String[] result = dir.list(filter);
-        if (0 < toFind.size()) {
-            assertTrue(""+toFind, false);
-        }        
-        return (result.length == 0 ? NONE : result);
-    }
-    
-    File makeDir(String loc, String[] files) throws IOException {
+    File makeTempDir(String loc, String[] filenames) throws IOException {
         File d = new File(loc);
         d.mkdirs();
         assertTrue(d.exists());
+        tempFiles.add(d);
         assertTrue(d.canWrite());
-        for (int i = 0; i < files.length; i++) {
-                       File f = new File(d, files[i]);
-            assertTrue(files[i], f.createNewFile());
+        for (int i = 0; i < filenames.length; i++) {
+                       File f = new File(d, filenames[i]);
+            assertTrue(filenames[i], f.createNewFile());
                }
         return d;
     }
 
-    private void log(String s) {
-        if (log) {
-            System.err.println(s);
-        }
-    }
 }