WatchServiceTest.java revision d37b519cc3f4db065e0d3f9abe5ef81d3872a801
1d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak/* 2d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * Copyright (C) 2017 The Android Open Source Project 3d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * 4d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * Licensed under the Apache License, Version 2.0 (the "License"); 5d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * you may not use this file except in compliance with the License. 6d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * You may obtain a copy of the License at 7d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * 8d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * http://www.apache.org/licenses/LICENSE-2.0 9d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * 10d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * Unless required by applicable law or agreed to in writing, software 11d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * distributed under the License is distributed on an "AS IS" BASIS, 12d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * See the License for the specific language governing permissions and 14d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak * limitations under the License 15d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak */ 16d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakpackage libcore.java.nio.file; 17d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 18d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.Assert; 19d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.Test; 20d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.runner.RunWith; 21d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.runners.JUnit4; 22d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.After; 23d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.Before; 24d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.Rule; 25d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 26d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.io.IOException; 27d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.FileStore; 28d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.FileSystems; 29d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Files; 30d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Path; 31d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Paths; 32d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchEvent; 33d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchKey; 34d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchService; 35d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.ArrayList; 36d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Arrays; 37d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.HashMap; 38d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Iterator; 39d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.List; 40d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Map; 41d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.concurrent.TimeUnit; 42d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 43d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertEquals; 44d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertFalse; 45d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertNotNull; 46d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertNull; 47d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertTrue; 48d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.fail; 49d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 50d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; 51d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; 52d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 53d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 54d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak@RunWith(JUnit4.class) 55d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakpublic class WatchServiceTest { 56d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak private static final WatchEvent.Kind<?>[] ALL_EVENTS_KINDS = 57d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak {ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY}; 58d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 59d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Rule 60d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public final FilesSetup filesSetup = new FilesSetup(); 61d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 62d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak static class WatchEventResult { 63d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final WatchEvent.Kind<Path> expectedKind; 64d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final int expectedCount; 65d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final boolean testCount; 66d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 67d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public WatchEventResult(WatchEvent.Kind<Path> expectedKind) { 68d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedKind = expectedKind; 69d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedCount = 0; 70d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.testCount = false; 71d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 72d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 73d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public WatchEventResult(WatchEvent.Kind<Path> expectedKind, 74d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak int expectedCount) { 75d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedKind = expectedKind; 76d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedCount = expectedCount; 77d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.testCount = true; 78d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 79d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 80d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 81d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak static public void assertWatchServiceEvent(WatchService watchService, 82d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey expectedWatchKey, 83d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak List<WatchEventResult> expectedEvents, 84d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak boolean expectedResetResult) throws InterruptedException { 85d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Iterator<WatchEventResult> expectedEventsIterator = expectedEvents.iterator(); 86d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 87d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak while (expectedEventsIterator.hasNext()) { 88d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey watchKey = watchService.poll(2, TimeUnit.SECONDS); 89d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedWatchKey, watchKey); 90d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 91d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (WatchEvent<?> event : watchKey.pollEvents()) { 92d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchEventResult expectedEventResult = expectedEventsIterator.next(); 93d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNotNull(expectedEventResult); 94d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 95d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedEventResult.expectedKind, event.kind()); 96d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak if (expectedEventResult.testCount) { 97d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedEventResult.expectedCount, event.count()); 98d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 99d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 100d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 101d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedResetResult, watchKey.reset()); 102d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 103d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 104d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 105d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 106d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_singleFile() throws Exception { 107d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 108d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 109d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 110d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 111d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 112d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 113d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 114d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 115d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 116d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_MODIFY 117d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 118d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE 119d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 120d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 121d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Don't assert count of ENTRY_MODIFY, it's very flaky, sometime it triggers 122d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // two events, sometime one.... 123d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService, directoryKey1, 124d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 125d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_MODIFY), 126d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 127d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 128d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 129d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 130d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 131d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 132d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_EventMask() throws Exception { 133d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 134d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchEvent.Kind<?>[] events = {ENTRY_DELETE}; 135d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 136d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 137d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 138d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 139d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, events); 140d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 141d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 142d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 143d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_MODIFY (masked) 144d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 145d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE (masked) 146d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 147d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 148d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService, directoryKey1, 149d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_DELETE, 1)), true); 150d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 151d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 152d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 153d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 154d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 155d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_singleDirectory() throws Exception { 156d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 157d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dirInDir = Paths.get(filesSetup.getTestDir(), "directory/dir"); 158d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 159d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dirInDir)); 160d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 161d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 162d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 163d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 164d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(dirInDir); 165d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 166d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Shouldn't emit EVENT_MODIFY 167d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dirInDirInDir = Paths.get(filesSetup.getTestDir(), "directory/dir/dir"); 168d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(dirInDirInDir); 169d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dirInDirInDir); 170d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 171d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE 172d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dirInDir); 173d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 174d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService, directoryKey1, 175d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 176d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 177d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 178d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 179d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 180d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 181d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 182d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 183d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 184d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_cancel() throws Exception { 185d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 186d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 187d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 188d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 189d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 190d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 191d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 192d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 193d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 194d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 195d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Canceling the key may prevent the EVENT_CREATE from being picked-up... 196d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // TODO: Fix this (b/35190858). 197d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Thread.sleep(500); 198d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 199d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Cancel the key 200d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak directoryKey1.cancel(); 201d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(directoryKey1.isValid()); 202d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 203d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Shouldn't emit EVENT_MODIFY and EVENT_DELETE 204d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 205d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 206d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 207d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService, directoryKey1, 208d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1)), false); 209d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 210d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 211d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 212d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 213d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 214d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_removeTarget() throws Exception { 215d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 216d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 217d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 218d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 219d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 220d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 221d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 222d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE x1 223d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 224d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 225d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 226d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Delete underlying target. 227d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertTrue(directoryKey1.isValid()); 228d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(directory); 229d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 230d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // We need to give some time to watch service thread to catch up with the 231d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // deletion 232d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak while (directoryKey1.isValid()) { 233d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Thread.sleep(500); 234d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 235d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 236d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService, directoryKey1, 237d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 238d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), false); 239d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 240d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 241d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 242d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 243d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 244d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 245d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_multipleKeys() throws Exception { 246d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService1 = FileSystems.getDefault().newWatchService(); 247d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 248d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory1 = Paths.get(filesSetup.getTestDir(), "directory1"); 249d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory2 = Paths.get(filesSetup.getTestDir(), "directory2"); 250d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 251d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir1file1 = Paths.get(filesSetup.getTestDir(), "directory1/file1"); 252d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir1file1)); 253d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir2file1 = Paths.get(filesSetup.getTestDir(), "directory2/file1"); 254d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir2file1)); 255d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 256d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory1); 257d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory2); 258d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory1.register(watchService1, ALL_EVENTS_KINDS); 259d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey2 = directory2.register(watchService1, ALL_EVENTS_KINDS); 260d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 261d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE/DELETE for all 262d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path[] allFiles = new Path[]{dir1file1, dir2file1}; 263d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (Path path : allFiles) { 264d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(path); 265d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(path); 266d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 267d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 268d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService1, directoryKey1, 269d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 270d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 271d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService1, directoryKey2, 272d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 273d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 274d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 275d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService1.poll()); 276d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService1.close(); 277d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 278d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 279d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 280d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_multipleServices() throws Exception { 281d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService1 = FileSystems.getDefault().newWatchService(); 282d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService2 = FileSystems.getDefault().newWatchService(); 283d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 284d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory1 = Paths.get(filesSetup.getTestDir(), "directory1"); 285d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory2 = Paths.get(filesSetup.getTestDir(), "directory2"); 286d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 287d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir1file1 = Paths.get(filesSetup.getTestDir(), "directory1/file1"); 288d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir1file1)); 289d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir2file1 = Paths.get(filesSetup.getTestDir(), "directory2/file1"); 290d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir2file1)); 291d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 292d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory1); 293d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory2); 294d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 295d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // 2 services listening for distinct directories 296d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory1.register(watchService1, ALL_EVENTS_KINDS); 297d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey2 = directory2.register(watchService2, ALL_EVENTS_KINDS); 298d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE/DELETE for all 299d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path[] allFiles = new Path[]{dir1file1, dir2file1}; 300d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (Path path : allFiles) { 301d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(path); 302d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(path); 303d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 304d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 305d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService1, directoryKey1, 306d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 307d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 308d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService2, directoryKey2, 309d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 310d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 311d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 312d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // 2 services listening for a same directory 313d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey3 = directory1.register(watchService2, ALL_EVENTS_KINDS); 314d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak { 315d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(dir1file1); 316d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dir1file1); 317d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 318d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService1, directoryKey1, 319d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 320d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 321d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertWatchServiceEvent(watchService2, directoryKey3, 322d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 323d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 324d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 325d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 326d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 327d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService1.poll()); 328d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService1.close(); 329d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService2.poll()); 330d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService2.close(); 331d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 332d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak}