package com.twitter.common.io;
import java.io.File;
import java.io.IOException;
import com.google.common.io.Files;
import com.google.common.testing.TearDown;
import com.google.common.testing.junit4.JUnitAsserts;
import com.google.common.testing.junit4.TearDownTestCase;
import org.junit.Before;
import org.junit.Test;
import com.twitter.common.base.ExceptionalClosure;
import com.twitter.common.base.ExceptionalFunction;
import com.twitter.common.base.Function;
import com.twitter.common.io.FileUtils.Temporary;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
/**
* @author John Sirois
*/
public class FileUtilsTest extends TearDownTestCase {
private Temporary temporary;
@Before
public void setUp() {
final File tmpDir = FileUtils.createTempDir();
addTearDown(new TearDown() {
@Override public void tearDown() throws Exception {
org.apache.commons.io.FileUtils.deleteDirectory(tmpDir);
}
});
assertEmptyDir(tmpDir);
temporary = new Temporary(tmpDir);
}
@Test
public void testCreateDir() {
File tmpDir = temporary.createDir();
assertEmptyDir(tmpDir);
}
@Test
public void testCreateFile() throws IOException {
File tmpFile = temporary.createFile(".jake");
assertEmptyFile(tmpFile);
JUnitAsserts.assertMatchesRegex(".+\\.jake$", tmpFile.getName());
}
@Test
public void testDoWithDir() {
assertEquals("42", temporary.doWithDir(new Function<File, String>() {
@Override public String apply(File dir) {
assertEmptyDir(dir);
return "42";
}
}));
}
static class MarkerException extends Exception {}
@Test(expected = MarkerException.class)
public void testDoWithDir_bubbles() throws MarkerException {
temporary.doWithDir(new ExceptionalClosure<File, MarkerException>() {
@Override public void execute (File dir) throws MarkerException {
throw new MarkerException();
}
});
}
@Test
public void testDoWithFile() throws IOException {
assertEquals("37", temporary.doWithFile(new ExceptionalFunction<File, String, IOException>() {
@Override public String apply(File file) throws IOException {
assertEmptyFile(file);
return "37";
}
}));
}
@Test(expected = MarkerException.class)
public void testDoWithFile_bubbles() throws MarkerException, IOException {
temporary.doWithFile(new ExceptionalClosure<File, MarkerException>() {
@Override public void execute(File dir) throws MarkerException {
throw new MarkerException();
}
});
}
private void assertEmptyDir(File dir) {
assertNotNull(dir);
assertTrue(dir.exists());
assertTrue(dir.isDirectory());
assertEquals(0, dir.list().length);
}
private void assertEmptyFile(File file) throws IOException {
assertNotNull(file);
assertTrue(file.exists());
assertTrue(file.isFile());
assertEquals(0, Files.toByteArray(file).length);
}
}