(no commit message)
[utils] / support / test / org / wamblee / test / FileSystemUtils.java
diff --git a/support/test/org/wamblee/test/FileSystemUtils.java b/support/test/org/wamblee/test/FileSystemUtils.java
new file mode 100644 (file)
index 0000000..e030957
--- /dev/null
@@ -0,0 +1,189 @@
+/*
+ * Copyright 2006 the original author or authors.
+ * 
+ * Licensed 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.wamblee.test;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.security.CodeSource;
+
+import junit.framework.TestCase;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * File system utilities.
+ */
+public final class FileSystemUtils {
+
+    private static final Log LOG = LogFactory.getLog(FileSystemUtils.class);
+
+    /**
+     * Test output directory relative to the sub project.
+     */
+    private static final String TEST_OUTPUT_DIR = "resources/testoutput";
+
+    /*
+     * Disabled.
+     * 
+     */
+    private FileSystemUtils() {
+        // Empty
+    }
+
+    /**
+     * Deletes a directory recursively. The test case will fail if the directory
+     * does not exist or if deletion fails.
+     * 
+     * @param aDir
+     *            Directory to delete.
+     */
+    public static void deleteDirRecursively(String aDir) {
+        deleteDirRecursively(new File(aDir));
+    }
+
+    /**
+     * Deletes a directory recursively. See {@link #deleteDirRecursively}.
+     * 
+     * @param aDir
+     *            Directory.
+     */
+    public static void deleteDirRecursively(File aDir) {
+        TestCase.assertTrue(aDir.isDirectory());
+
+        for (File file: aDir.listFiles()) {
+            if (file.isDirectory()) {
+                deleteDirRecursively(file);
+            } else {
+                delete(file);
+            }
+        }
+
+        delete(aDir);
+    }
+
+    /**
+     * Deletes a file or directory. The test case will fail if the file or
+     * directory does not exist or if deletion fails. Deletion of a non-empty
+     * directory will always fail.
+     * 
+     * @param aFile
+     *            File or directory to delete.
+     */
+    public static void delete(File aFile) {
+        TestCase.assertTrue(aFile.delete());
+    }
+
+    /**
+     * Gets a path relative to a sub project. This utility should be used to
+     * easily access file paths within a subproject without requiring any
+     * specific Eclipse configuration.
+     * 
+     * @param aRelativePath
+     *            Relative path.
+     * @param aTestClass
+     *            Test class.
+     */
+    public static File getPath(String aRelativePath, Class aTestClass) {
+        CodeSource source = aTestClass.getProtectionDomain().getCodeSource();
+        if (source == null) {
+            LOG.warn("Could not obtain path for '" + aRelativePath
+                    + "' for class " + aTestClass
+                    + ", using relative path as is");
+            return new File(aRelativePath);
+        }
+        URL location = source.getLocation();
+        String protocol = location.getProtocol();
+        if (!protocol.equals("file")) {
+            return new File(aRelativePath);
+        }
+
+        String path = location.getPath();
+        try {
+            path = URLDecoder.decode(location.getPath(), "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            // ignore it.. just don't decode
+        }
+
+        return new File(new File(path).getParentFile(), aRelativePath);
+    }
+
+    /**
+     * Ensures that a directory hierarchy exists (recursively if needed). If it
+     * is not possible to create the directory, then the test case will fail.
+     * 
+     * @param aDir
+     *            Directory to create.
+     */
+    public static void createDir(File aDir) {
+        if (aDir.exists() && !aDir.isDirectory()) {
+            TestCase.fail("'" + aDir
+                    + "' already exists and is not a directory");
+        }
+        if (aDir.exists()) {
+            return;
+        }
+        createDir(aDir.getParentFile());
+        TestCase.assertTrue("Could not create '" + aDir + "'", aDir.mkdir());
+    }
+
+    /**
+     * Gets the test output directory for a specific test class.
+     * 
+     * @param aTestClass
+     *            Test class.
+     * @return Test output directory.
+     */
+    public static File getTestOutputDir(Class aTestClass) {
+        File file = getPath(TEST_OUTPUT_DIR, aTestClass);
+        String packageName = aTestClass.getPackage().getName();
+        String packagePath = packageName.replaceAll("\\.", "/");
+        return new File(file, packagePath);
+    }
+
+    /**
+     * Creates a directory hierarchy for the output directory of a test class if
+     * needed.
+     * 
+     * @param aTestClass
+     *            Test class
+     * @return Test directory.
+     */
+    public static File createTestOutputDir(Class aTestClass) {
+        File file = getTestOutputDir(aTestClass);
+        createDir(file);
+        return file;
+    }
+
+    /**
+     * Gets a test output file name. This returns a File object representing the
+     * output file and ensures that the directory where the file will be created
+     * already exists.
+     * 
+     * @param aName
+     *            Name of the file.
+     * @param aTestClass
+     *            Test class.
+     * @return File.
+     */
+    public static File getTestOutputFile(String aName, Class aTestClass) {
+        File file = new File(getTestOutputDir(aTestClass), aName);
+        createDir(file.getParentFile());
+        return file;
+    }
+}