提交 10eb42ed 编写于 作者: A alanb

8023139: java/nio/file/WatchService/SensitivityModifier.java failing intermittently (win8)

Reviewed-by: alanb
Contributed-by: yiming.wang@oracle.com
上级 55b1de80
...@@ -54,60 +54,66 @@ public class SensitivityModifier { ...@@ -54,60 +54,66 @@ public class SensitivityModifier {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
static void doTest(Path top) throws Exception { static void doTest(Path top) throws Exception {
FileSystem fs = top.getFileSystem(); FileSystem fs = top.getFileSystem();
WatchService watcher = fs.newWatchService(); try (WatchService watcher = fs.newWatchService()) {
// create directories and files // create directories and files
int nDirs = 5 + rand.nextInt(20); int nDirs = 5 + rand.nextInt(20);
int nFiles = 50 + rand.nextInt(50); int nFiles = 50 + rand.nextInt(50);
Path[] dirs = new Path[nDirs]; Path[] dirs = new Path[nDirs];
Path[] files = new Path[nFiles]; Path[] files = new Path[nFiles];
for (int i=0; i<nDirs; i++) { for (int i=0; i<nDirs; i++) {
dirs[i] = Files.createDirectory(top.resolve("dir" + i)); dirs[i] = Files.createDirectory(top.resolve("dir" + i));
} }
for (int i=0; i<nFiles; i++) { for (int i=0; i<nFiles; i++) {
Path dir = dirs[rand.nextInt(nDirs)]; Path dir = dirs[rand.nextInt(nDirs)];
files[i] = Files.createFile(dir.resolve("file" + i)); files[i] = Files.createFile(dir.resolve("file" + i));
} }
// register the directories (random sensitivity)
register(dirs, watcher);
// register the directories (random sensitivity) // sleep a bit here to ensure that modification to the first file
register(dirs, watcher); // can be detected by polling implementations (ie: last modified time
// may not change otherwise).
try { Thread.sleep(1000); } catch (InterruptedException e) { }
// sleep a bit here to ensure that modification to the first file // modify files and check that events are received
// can be detected by polling implementations (ie: last modified time for (int i=0; i<10; i++) {
// may not change otherwise). Path file = files[rand.nextInt(nFiles)];
try { Thread.sleep(1000); } catch (InterruptedException e) { } System.out.println("Modify: " + file);
try (OutputStream out = Files.newOutputStream(file)) {
out.write(new byte[100]);
}
// modify files and check that events are received System.out.println("Waiting for event(s)...");
for (int i=0; i<10; i++) { boolean eventReceived = false;
Path file = files[rand.nextInt(nFiles)]; WatchKey key = watcher.take();
System.out.println("Modify: " + file); do {
try (OutputStream out = Files.newOutputStream(file)) { for (WatchEvent<?> event: key.pollEvents()) {
out.write(new byte[100]); if (event.kind() != ENTRY_MODIFY)
} throw new RuntimeException("Unexpected event: " + event);
System.out.println("Waiting for event..."); Path name = ((WatchEvent<Path>)event).context();
WatchKey key = watcher.take(); if (name.equals(file.getFileName())) {
WatchEvent<?> event = key.pollEvents().iterator().next(); eventReceived = true;
if (event.kind() != ENTRY_MODIFY) break;
throw new RuntimeException("Unexpected event: " + event); }
Path name = ((WatchEvent<Path>)event).context(); }
if (!name.equals(file.getFileName())) key.reset();
throw new RuntimeException("Unexpected context: " + name); key = watcher.poll(1, TimeUnit.SECONDS);
System.out.println("Event OK"); } while (key != null && !eventReceived);
// drain events (to avoid interference) // we should have received at least one ENTRY_MODIFY event
do { if (eventReceived) {
key.pollEvents(); System.out.println("Event OK");
key.reset(); } else {
key = watcher.poll(1, TimeUnit.SECONDS); throw new RuntimeException("No ENTRY_MODIFY event received for " + file);
} while (key != null); }
// re-register the directories to force changing their sensitivity // re-register the directories to force changing their sensitivity
// level // level
register(dirs, watcher); register(dirs, watcher);
}
} }
// done
watcher.close();
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册