/* * 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.IOException; import java.io.InputStream; 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; import sun.security.krb5.internal.crypto.b; /** * 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; } public static String read(InputStream aIs) throws IOException { try { StringBuffer buffer = new StringBuffer(); int c; while ((c = aIs.read()) != -1) { buffer.append((char)c); } return buffer.toString(); } finally { aIs.close(); } } }