aboutsummaryrefslogtreecommitdiff
path: root/test/lib/testlibrary/jdk/testlibrary/FileUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/lib/testlibrary/jdk/testlibrary/FileUtils.java')
-rw-r--r--test/lib/testlibrary/jdk/testlibrary/FileUtils.java37
1 files changed, 37 insertions, 0 deletions
diff --git a/test/lib/testlibrary/jdk/testlibrary/FileUtils.java b/test/lib/testlibrary/jdk/testlibrary/FileUtils.java
index 7882262274..b9f3088040 100644
--- a/test/lib/testlibrary/jdk/testlibrary/FileUtils.java
+++ b/test/lib/testlibrary/jdk/testlibrary/FileUtils.java
@@ -33,6 +33,7 @@ import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.TimeUnit;
/**
@@ -190,5 +191,41 @@ public final class FileUtils {
}
return excs;
}
+
+ /**
+ * Checks whether all file systems are accessible. This is performed
+ * by checking free disk space on all mounted file systems via a
+ * separate, spawned process. File systems are considered to be
+ * accessible if this process completes successfully before a given
+ * fixed duration has elapsed.
+ *
+ * @implNote On Unix this executes the {@code df} command in a separate
+ * process and on Windows always returns {@code true}.
+ */
+ public static boolean areFileSystemsAccessible() throws IOException {
+ boolean areFileSystemsAccessible = true;
+ if (!isWindows) {
+ // try to check whether 'df' hangs
+ System.out.println("\n--- df output ---");
+ System.out.flush();
+ Process proc = new ProcessBuilder("df").inheritIO().start();
+ try {
+ proc.waitFor(90, TimeUnit.SECONDS);
+ } catch (InterruptedException ignored) {
+ }
+ try {
+ int exitValue = proc.exitValue();
+ if (exitValue != 0) {
+ System.err.printf("df process exited with %d != 0%n",
+ exitValue);
+ areFileSystemsAccessible = false;
+ }
+ } catch (IllegalThreadStateException ignored) {
+ System.err.println("df command apparently hung");
+ areFileSystemsAccessible = false;
+ }
+ }
+ return areFileSystemsAccessible;
+ }
}