8173910: (fs) java/nio/file/FileSystem/Basic.java should conditionally check FileStores
Summary: On Unix platforms, spawn a 'df' process and skip FileStore check if it hangs
Reviewed-by: alanb
--- a/jdk/test/java/nio/file/FileSystem/Basic.java Wed Jul 05 22:48:37 2017 +0200
+++ b/jdk/test/java/nio/file/FileSystem/Basic.java Tue Feb 07 11:01:04 2017 -0800
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -30,11 +30,18 @@
*/
import java.io.File;
-import java.nio.file.*;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.FileStore;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.ProviderNotFoundException;
import java.util.HashMap;
+import java.util.concurrent.TimeUnit;
import jdk.testlibrary.FileUtils;
/**
@@ -47,6 +54,44 @@
throw new RuntimeException(msg);
}
+ static void checkFileStores(String os, FileSystem fs) throws IOException {
+ boolean checkFileStores = true;
+ if (!os.equals("Windows")) {
+ // try to check whether 'df' hangs
+ System.out.println("\n--- Begin df output ---");
+ System.out.flush();
+ Process proc = new ProcessBuilder("df").inheritIO().start();
+ try {
+ proc.waitFor(90, TimeUnit.SECONDS);
+ } catch (InterruptedException ignored) {
+ }
+ System.out.println("--- End df output ---\n");
+ System.out.flush();
+ try {
+ int exitValue = proc.exitValue();
+ if (exitValue != 0) {
+ System.err.printf("df process exited with %d != 0%n",
+ exitValue);
+ checkFileStores = false;
+ }
+ } catch (IllegalThreadStateException ignored) {
+ System.err.println("df command apparently hung");
+ checkFileStores = false;
+ }
+ }
+
+ // sanity check method
+ if (checkFileStores) {
+ System.out.println("\n--- Begin FileStores ---");
+ for (FileStore store: fs.getFileStores()) {
+ System.out.println(store);
+ }
+ System.out.println("--- EndFileStores ---\n");
+ } else {
+ System.err.println("Skipping FileStore check due to df failure");
+ }
+ }
+
static void checkSupported(FileSystem fs, String... views) {
for (String view: views) {
check(fs.supportedFileAttributeViews().contains(view),
@@ -70,7 +115,9 @@
}
}
- public static void main(String[] args) throws IOException, URISyntaxException {
+ public static void main(String[] args)
+ throws IOException, URISyntaxException {
+ String os = System.getProperty("os.name");
FileSystem fs = FileSystems.getDefault();
// close should throw UOE
@@ -85,15 +132,11 @@
check(fs.provider().getScheme().equals("file"),
"should use 'file' scheme");
- // santity check method - need to re-visit this in future as I/O errors
- // are possible
- for (FileStore store: fs.getFileStores()) {
- System.out.println(store);
- }
+ // sanity check FileStores
+ checkFileStores(os, fs);
// sanity check supportedFileAttributeViews
checkSupported(fs, "basic");
- String os = System.getProperty("os.name");
if (os.equals("SunOS"))
checkSupported(fs, "posix", "unix", "owner", "acl", "user");
if (os.equals("Linux"))