From 56b061206a52ee729ea08759dc27da50ad515e47 Mon Sep 17 00:00:00 2001 From: Markus Kreusch Date: Mon, 25 Jan 2016 00:03:22 +0100 Subject: [PATCH] Deleting temporary directories created in tests on shutdown * Deleting using a shutdown hook (other approaches didn't work) --- .../test/TempFilesRemovedOnShutdown.java | 73 +++++++++++++++++++ .../invariants/FileSystemFactories.java | 2 +- .../FilesystemSetupUtils.java | 6 +- 3 files changed, 78 insertions(+), 3 deletions(-) create mode 100644 main/commons-test/src/main/java/org/cryptomator/common/test/TempFilesRemovedOnShutdown.java diff --git a/main/commons-test/src/main/java/org/cryptomator/common/test/TempFilesRemovedOnShutdown.java b/main/commons-test/src/main/java/org/cryptomator/common/test/TempFilesRemovedOnShutdown.java new file mode 100644 index 000000000..3b567bdbf --- /dev/null +++ b/main/commons-test/src/main/java/org/cryptomator/common/test/TempFilesRemovedOnShutdown.java @@ -0,0 +1,73 @@ +package org.cryptomator.common.test; + +import static java.nio.file.Files.walkFileTree; +import static java.util.Collections.synchronizedSet; + +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.FileVisitor; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.HashSet; +import java.util.Set; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class TempFilesRemovedOnShutdown { + + private static final Logger LOG = LoggerFactory.getLogger(TempFilesRemovedOnShutdown.class); + + private static final Set PATHS_TO_REMOVE_ON_SHUTDOWN = synchronizedSet(new HashSet<>()); + private static final Thread ON_SHUTDOWN_DELETER = new Thread(TempFilesRemovedOnShutdown::removeAll); + + static { + Runtime.getRuntime().addShutdownHook(ON_SHUTDOWN_DELETER); + } + + public static Path createTempDirectory(String prefix) throws IOException { + Path path = Files.createTempDirectory(prefix); + PATHS_TO_REMOVE_ON_SHUTDOWN.add(path); + return path; + } + + private static void removeAll() { + PATHS_TO_REMOVE_ON_SHUTDOWN.forEach(TempFilesRemovedOnShutdown::remove); + } + + private static void remove(Path path) { + try { + tryRemove(path); + } catch (Throwable e) { + LOG.debug("Failed to remove " + path, e); + } + } + + private static void tryRemove(Path path) throws IOException { + walkFileTree(path, new FileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + } + +} diff --git a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java index 7dd4cc36e..9c28edcad 100644 --- a/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java +++ b/main/filesystem-invariants-tests/src/test/java/org/cryptomator/filesystem/invariants/FileSystemFactories.java @@ -1,6 +1,6 @@ package org.cryptomator.filesystem.invariants; -import static java.nio.file.Files.createTempDirectory; +import static org.cryptomator.common.test.TempFilesRemovedOnShutdown.createTempDirectory; import java.io.IOException; import java.io.UncheckedIOException; diff --git a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/integrationtests/FilesystemSetupUtils.java b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/integrationtests/FilesystemSetupUtils.java index db8f544b4..2bb7889a8 100644 --- a/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/integrationtests/FilesystemSetupUtils.java +++ b/main/filesystem-nio/src/test/java/org/cryptomator/filesystem/nio/integrationtests/FilesystemSetupUtils.java @@ -1,5 +1,7 @@ package org.cryptomator.filesystem.nio.integrationtests; +import static org.cryptomator.common.test.TempFilesRemovedOnShutdown.createTempDirectory; + import java.io.IOException; import java.io.OutputStream; import java.io.UncheckedIOException; @@ -15,7 +17,7 @@ class FilesystemSetupUtils { public static Path emptyFilesystem() { try { - return Files.createTempDirectory("test-filesystem"); + return createTempDirectory("test-filesystem"); } catch (IOException e) { throw new UncheckedIOException(e); } @@ -23,7 +25,7 @@ class FilesystemSetupUtils { public static Path testFilesystem(Entry firstEntry, Entry... entries) { try { - Path root = Files.createTempDirectory("test-filesystem"); + Path root = createTempDirectory("test-filesystem"); firstEntry.create(root); for (Entry entry : entries) { entry.create(root);