/*
* Copyright (C) 2012 The Android Open Source Project
*
* 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 com.android.testutils;
import static org.junit.Assert.assertTrue;
import com.google.common.io.Files;
import junit.framework.TestCase;
import java.io.File;
import java.io.IOException;
/**
* Utility methods to deal with loading the test data.
*/
public class TestUtils {
/**
* returns a File for the subfolder of the test resource data.
*
* This is basically "src/test/resources/testData/$name".
*
* Note that this folder is relative to the root project which is where gradle
* sets the current working dir when running the tests.
*
* If you need a full folder path, use {@link #getCanonicalRoot(String...)}.
*
* @param names the names of the subfolders.
*
* @return a File
*/
public static File getRoot(String... names) {
File root = null;
for (String name : names) {
if (root == null) {
root = new File("src/test/resources/testData/" + name);
} else {
root = new File(root, name);
}
// Hack: The sdk-common tests are not configured properly; running tests
// works correctly from Gradle but not from within the IDE. The following
// hack works around this quirk:
if (!root.isDirectory() && !root.getPath().contains("sdk-common")) {
File r = new File("sdk-common", root.getPath()).getAbsoluteFile();
if (r.isDirectory()) {
root = r;
}
}
TestCase.assertTrue("Test folder '" + name + "' does not exist! "
+ "(Tip: Check unit test launch config pwd)",
root.isDirectory());
}
return root;
}
/**
* returns a File for the subfolder of the test resource data.
*
* The full path is canonized.
* This is basically ".../src/test/resources/testData/$name".
*
* @param names the names of the subfolders.
*
* @return a File
*/
public static File getCanonicalRoot(String... names) throws IOException {
File root = getRoot(names);
return root.getCanonicalFile();
}
public static void deleteFile(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File f : files) {
deleteFile(f);
}
}
} else if (dir.isFile()) {
assertTrue(dir.getPath(), dir.delete());
}
}
public static File createTempDirDeletedOnExit() {
final File tempDir = Files.createTempDir();
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
deleteFile(tempDir);
}
});
return tempDir;
}
}