fm.last.commons.test.file.TemporaryFolder Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of lastcommons-test Show documentation
Show all versions of lastcommons-test Show documentation
Last.fm common test utilities
/*
* Copyright 2012 Last.fm
*
* 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 fm.last.commons.test.file;
import java.io.File;
import java.io.IOException;
import org.junit.Rule;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
/**
* Why we have our own version of this class: http://stackoverflow.com/questions/7738881/junit-rule-lifecycle-interaction-with-before
*
* The TemporaryFolder Rule allows creation of files and folders that are guaranteed to be deleted when the test method
* finishes (whether it passes or fails):
*
*
* public static class HasTempFolder {
* @Rule
* public TemporaryFolder folder = new TemporaryFolder();
*
* @Test
* public void testUsingTempFolder() throws IOException {
* File createdFile = folder.newFile("myfile.txt");
* File createdFolder = folder.newFolder("subfolder");
* // ...
* }
* }
*
*/
public class TemporaryFolder implements MethodRule {
private File folder;
@Override
public final Statement apply(final Statement base, FrameworkMethod method, Object target) {
Throwable caught;
try {
create();
caught = null;
} catch (Throwable e) {
caught = e;
}
final Throwable toRethrow = caught;
return new Statement() {
@Override
public void evaluate() throws Throwable {
if (toRethrow != null) {
throw toRethrow;
}
try {
base.evaluate();
} finally {
delete();
}
}
};
}
// testing purposes only
/**
* for testing purposes only. Do not use.
*/
public void create() throws IOException {
folder = File.createTempFile("junit", "");
folder.delete();
folder.mkdir();
}
/**
* Returns a new fresh file with the given name under the temporary folder.
*/
public File newFile(String fileName) throws IOException {
File file = new File(folder, fileName);
file.createNewFile();
return file;
}
/**
* Returns a new fresh folder with the given name under the temporary folder.
*/
public File newFolder(String folderName) {
File file = new File(folder, folderName);
file.mkdir();
return file;
}
/**
* @return the location of this temporary folder.
*/
public File getRoot() {
return folder;
}
/**
* Delete all files and folders under the temporary folder. Usually not called directly, since it is automatically
* applied by the {@link Rule}
*/
public void delete() {
recursiveDelete(folder);
}
private void recursiveDelete(File file) {
File[] files = file.listFiles();
if (files != null) {
for (File each : files) {
recursiveDelete(each);
}
}
file.delete();
}
}