1/* 2 * Copyright (c) 2008, 2016, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* @test 25 * @bug 4313887 26 * @summary Sanity test for JDK-specific sensitivity level watch event modifier 27 * @modules jdk.unsupported 28 * @library .. 29 * @run main/timeout=240 SensitivityModifier 30 * @key randomness 31 */ 32 33import java.nio.file.*; 34import static java.nio.file.StandardWatchEventKinds.*; 35import java.io.OutputStream; 36import java.io.IOException; 37import java.util.Random; 38import java.util.concurrent.TimeUnit; 39import com.sun.nio.file.SensitivityWatchEventModifier; 40 41public class SensitivityModifier { 42 43 static final Random rand = new Random(); 44 45 static void register(Path[] dirs, WatchService watcher) throws IOException { 46 SensitivityWatchEventModifier[] sensitivtives = 47 SensitivityWatchEventModifier.values(); 48 for (int i=0; i<dirs.length; i++) { 49 SensitivityWatchEventModifier sensivity = 50 sensitivtives[ rand.nextInt(sensitivtives.length) ]; 51 Path dir = dirs[i]; 52 dir.register(watcher, new WatchEvent.Kind<?>[]{ ENTRY_MODIFY }, sensivity); 53 } 54 } 55 56 @SuppressWarnings("unchecked") 57 static void doTest(Path top) throws Exception { 58 FileSystem fs = top.getFileSystem(); 59 try (WatchService watcher = fs.newWatchService()) { 60 61 // create directories and files 62 int nDirs = 5 + rand.nextInt(20); 63 int nFiles = 50 + rand.nextInt(50); 64 Path[] dirs = new Path[nDirs]; 65 Path[] files = new Path[nFiles]; 66 for (int i=0; i<nDirs; i++) { 67 dirs[i] = Files.createDirectory(top.resolve("dir" + i)); 68 } 69 for (int i=0; i<nFiles; i++) { 70 Path dir = dirs[rand.nextInt(nDirs)]; 71 files[i] = Files.createFile(dir.resolve("file" + i)); 72 } 73 74 // register the directories (random sensitivity) 75 register(dirs, watcher); 76 77 // sleep a bit here to ensure that modification to the first file 78 // can be detected by polling implementations (ie: last modified time 79 // may not change otherwise). 80 try { Thread.sleep(1000); } catch (InterruptedException e) { } 81 82 // modify files and check that events are received 83 for (int i=0; i<10; i++) { 84 Path file = files[rand.nextInt(nFiles)]; 85 System.out.println("Modify: " + file); 86 try (OutputStream out = Files.newOutputStream(file)) { 87 out.write(new byte[100]); 88 } 89 90 System.out.println("Waiting for event(s)..."); 91 boolean eventReceived = false; 92 WatchKey key = watcher.take(); 93 do { 94 for (WatchEvent<?> event: key.pollEvents()) { 95 if (event.kind() != ENTRY_MODIFY) 96 throw new RuntimeException("Unexpected event: " + event); 97 Path name = ((WatchEvent<Path>)event).context(); 98 if (name.equals(file.getFileName())) { 99 eventReceived = true; 100 break; 101 } 102 } 103 key.reset(); 104 key = watcher.poll(1, TimeUnit.SECONDS); 105 } while (key != null); 106 107 // we should have received at least one ENTRY_MODIFY event 108 if (eventReceived) { 109 System.out.println("Event OK"); 110 } else { 111 throw new RuntimeException("No ENTRY_MODIFY event received for " + file); 112 } 113 114 // re-register the directories to force changing their sensitivity 115 // level 116 register(dirs, watcher); 117 } 118 } 119 } 120 121 public static void main(String[] args) throws Exception { 122 Path dir = TestUtil.createTemporaryDirectory(); 123 try { 124 doTest(dir); 125 } finally { 126 TestUtil.removeAll(dir); 127 } 128 } 129} 130