package com.equalexperts.logging; import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.UUID; public class TempFileFixture implements TestRule { private final List<Path> tempFiles = new ArrayList<>(); @Override public Statement apply(Statement base, Description description) { return statement(base, () -> tempFiles.stream() .filter(Files::exists) .map(Path::toFile) .forEach(File::delete)); } public Path createTempFile(String suffix) { try { return register(Files.createTempFile("", suffix)); } catch (IOException e) { throw new UncheckedIOException(e); } } public Path createTempDirectory() { try { return register(Files.createTempDirectory(null)); } catch (IOException e) { throw new UncheckedIOException(e); } } public Path createTempFileThatDoesNotExist(String suffix) { Path result = Paths.get(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString() + suffix); return register(result); } public Path createTempDirectoryThatDoesNotExist() { Path result = Paths.get(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString()); return register(result); } public Path register(Path path) { path.toFile().deleteOnExit(); tempFiles.add(path); return path; } /* Code to make creating Statements Java 8-friendly even though Statement is an abstract class */ @FunctionalInterface private interface StatementClosure { void evaluate() throws Throwable; } private static Statement statement(Statement base, StatementClosure closure) { return new Statement() { @Override public void evaluate() throws Throwable { base.evaluate(); closure.evaluate(); } }; } }