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.Test; 19d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.runner.RunWith; 20d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.runners.JUnit4; 21d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport org.junit.Rule; 22d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 23d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.FileSystems; 24d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Files; 25d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Path; 26d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.Paths; 27d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchEvent; 28d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchKey; 29d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.nio.file.WatchService; 30d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.ArrayList; 31d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Arrays; 32d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.HashMap; 33d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Iterator; 34d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.List; 35d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.Map; 36d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport java.util.concurrent.TimeUnit; 37d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 38d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertEquals; 39d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertFalse; 40d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertNotNull; 41d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertNull; 42d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.assertTrue; 43d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static junit.framework.TestCase.fail; 44d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 45d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE; 46d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE; 47d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakimport static java.nio.file.StandardWatchEventKinds.ENTRY_MODIFY; 48d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 49d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak@RunWith(JUnit4.class) 50d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniakpublic class WatchServiceTest { 51d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak private static final WatchEvent.Kind<?>[] ALL_EVENTS_KINDS = 52d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak {ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY}; 53d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 54d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Rule 55d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public final FilesSetup filesSetup = new FilesSetup(); 56d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 57d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak static class WatchEventResult { 58d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final WatchEvent.Kind<Path> expectedKind; 59d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final int expectedCount; 60d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak final boolean testCount; 61d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 62d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public WatchEventResult(WatchEvent.Kind<Path> expectedKind) { 63d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedKind = expectedKind; 64d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedCount = 0; 65d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.testCount = false; 66d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 67d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 68d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public WatchEventResult(WatchEvent.Kind<Path> expectedKind, 69d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak int expectedCount) { 70d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedKind = expectedKind; 71d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.expectedCount = expectedCount; 72d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak this.testCount = true; 73d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 74d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 75d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 764020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak private static void checkWatchServiceEventMultipleKeys(WatchService watchService, 774020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Map<WatchKey, List<WatchEventResult>> expectedResults, 78d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak boolean expectedResetResult) throws InterruptedException { 79d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 804020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak // Make a deep copy 814020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak HashMap<WatchKey, ArrayList<WatchEventResult>> expectedResultsCopy 824020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak = new HashMap<>(); 834020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak for (Map.Entry<WatchKey, List<WatchEventResult>> entry : expectedResults.entrySet()) { 844020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expectedResultsCopy.put(entry.getKey(), new ArrayList<>(entry.getValue())); 854020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak } 864020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak 874020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak while (!expectedResultsCopy.isEmpty()) { 88d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey watchKey = watchService.poll(2, TimeUnit.SECONDS); 894020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak assertNotNull(watchKey); 904020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak 914020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak List<WatchEventResult> expectedEvents = expectedResultsCopy.get(watchKey); 924020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak assertNotNull(expectedEvents); 93d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 944020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Iterator<WatchEventResult> expectedEventsIterator = expectedEvents.iterator(); 95d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (WatchEvent<?> event : watchKey.pollEvents()) { 96d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchEventResult expectedEventResult = expectedEventsIterator.next(); 97d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNotNull(expectedEventResult); 98d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 99d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedEventResult.expectedKind, event.kind()); 100d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak if (expectedEventResult.testCount) { 101d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedEventResult.expectedCount, event.count()); 102d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 1034020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expectedEventsIterator.remove(); 104d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 105d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertEquals(expectedResetResult, watchKey.reset()); 1064020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak if (!expectedEventsIterator.hasNext()) { 1074020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expectedResultsCopy.remove(watchKey); 1084020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak } 109d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 110d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 111d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 1124020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak private static void checkWatchServiceEvent(WatchService watchService, 1134020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak WatchKey expectedWatchKey, 1144020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak List<WatchEventResult> expectedEvents, 1154020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak boolean expectedResetResult) throws InterruptedException { 1164020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Map<WatchKey, List<WatchEventResult>> expected = new HashMap<>(); 1174020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expected.put(expectedWatchKey, expectedEvents); 1184020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEventMultipleKeys(watchService, expected, expectedResetResult); 1194020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak } 1204020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak 121d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 122d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_singleFile() throws Exception { 123d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 124d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 125d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 126d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 127d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 128d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 129d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 130d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 131d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 1324020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 13300e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1)), true); 13400e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak assertNull(watchService.poll()); 1354020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak 136d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_MODIFY 137d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 1384020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 13900e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_MODIFY)), true); 14000e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak 14100e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak // http:///b/35346596 14200e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak // Sometimes we receive a second, latent EVENT_MODIFY that happens shortly 14300e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak // after the first one. This will intercept it and make sure it won't 14400e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak // mess with ENTRY_DELETE later. 14500e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak Thread.sleep(500); 14600e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak WatchKey doubleModifyKey = watchService.poll(); 14700e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak if (doubleModifyKey != null) { 14800e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak List<WatchEvent<?>> event = doubleModifyKey.pollEvents(); 14900e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak assertEquals(ENTRY_MODIFY, event.get(0).kind()); 15000e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak doubleModifyKey.reset(); 15100e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak } 1524020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak assertNull(watchService.poll()); 15300e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak 154d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE 155d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 1564020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 15700e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_DELETE, 1)), true); 15800e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak 15900e74329e97b38ed7c17c61ad47a04f537ff2522Przemyslaw Szczepaniak // Assert no more events 160d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 161d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 162d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 163d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 164d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 165d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_EventMask() throws Exception { 166d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 167d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchEvent.Kind<?>[] events = {ENTRY_DELETE}; 168d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 169d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 170d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 171d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 172d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, events); 173d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 174d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 175d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 176d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_MODIFY (masked) 177d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 178d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE (masked) 179d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 180d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 1814020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 182d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_DELETE, 1)), true); 183d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 184d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 185d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 186d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 187d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 188d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_singleDirectory() throws Exception { 189d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 190d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dirInDir = Paths.get(filesSetup.getTestDir(), "directory/dir"); 191d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 192d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dirInDir)); 193d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 194d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 195d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 196d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 197d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(dirInDir); 198d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 199d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Shouldn't emit EVENT_MODIFY 200d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dirInDirInDir = Paths.get(filesSetup.getTestDir(), "directory/dir/dir"); 201d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(dirInDirInDir); 202d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dirInDirInDir); 203d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 204d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_DELETE 205d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dirInDir); 206d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 2074020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 208d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 209d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 210d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 211d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 212d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 213d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 214d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 215d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 216d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 217d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_cancel() throws Exception { 218d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 219d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 220d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 221d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 222d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 223d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 224d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 225d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE 226d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 227d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 228d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Canceling the key may prevent the EVENT_CREATE from being picked-up... 229d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // TODO: Fix this (b/35190858). 230d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Thread.sleep(500); 231d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 232d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Cancel the key 233d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak directoryKey1.cancel(); 234d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(directoryKey1.isValid()); 235d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 236d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Shouldn't emit EVENT_MODIFY and EVENT_DELETE 237d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.write(file, "hello1".getBytes()); 238d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 239d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 2404020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 241d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1)), false); 242d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 243d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 244d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 245d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 246d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 247d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_removeTarget() throws Exception { 248d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService = FileSystems.getDefault().newWatchService(); 249d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path file = Paths.get(filesSetup.getTestDir(), "directory/file"); 250d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory = Paths.get(filesSetup.getTestDir(), "directory"); 251d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(file)); 252d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory); 253d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory.register(watchService, ALL_EVENTS_KINDS); 254d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 255d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE x1 256d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(file); 257d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(file); 258d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 259d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // Delete underlying target. 260d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertTrue(directoryKey1.isValid()); 261d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(directory); 262d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 263d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // We need to give some time to watch service thread to catch up with the 264d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // deletion 265d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak while (directoryKey1.isValid()) { 266d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Thread.sleep(500); 267d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 268d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 2694020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService, directoryKey1, 270d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 271d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), false); 272d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService.poll()); 273d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 274d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService.close(); 275d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 276d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 277d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 278d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_multipleKeys() throws Exception { 279d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService1 = FileSystems.getDefault().newWatchService(); 280d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 281d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory1 = Paths.get(filesSetup.getTestDir(), "directory1"); 282d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory2 = Paths.get(filesSetup.getTestDir(), "directory2"); 283d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 284d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir1file1 = Paths.get(filesSetup.getTestDir(), "directory1/file1"); 285d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir1file1)); 286d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir2file1 = Paths.get(filesSetup.getTestDir(), "directory2/file1"); 287d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir2file1)); 288d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 289d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory1); 290d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory2); 291d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory1.register(watchService1, ALL_EVENTS_KINDS); 292d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey2 = directory2.register(watchService1, ALL_EVENTS_KINDS); 293d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 294d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE/DELETE for all 295d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path[] allFiles = new Path[]{dir1file1, dir2file1}; 296d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (Path path : allFiles) { 297d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(path); 298d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(path); 299d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 300d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 3014020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Map<WatchKey, List<WatchEventResult>> expected = new HashMap<>(); 3024020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expected.put(directoryKey1, 3034020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Arrays.asList( 3044020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak new WatchEventResult(ENTRY_CREATE, 1), 3054020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1))); 3064020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak expected.put(directoryKey2, 3074020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak Arrays.asList( 3084020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak new WatchEventResult(ENTRY_CREATE, 1), 3094020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1))); 3104020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak 3114020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEventMultipleKeys(watchService1, expected, true); 312d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService1.poll()); 313d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService1.close(); 314d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 315d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 316d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak @Test 317d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak public void test_multipleServices() throws Exception { 318d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService1 = FileSystems.getDefault().newWatchService(); 319d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchService watchService2 = FileSystems.getDefault().newWatchService(); 320d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 321d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory1 = Paths.get(filesSetup.getTestDir(), "directory1"); 322d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path directory2 = Paths.get(filesSetup.getTestDir(), "directory2"); 323d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 324d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir1file1 = Paths.get(filesSetup.getTestDir(), "directory1/file1"); 325d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir1file1)); 326d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path dir2file1 = Paths.get(filesSetup.getTestDir(), "directory2/file1"); 327d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertFalse(Files.exists(dir2file1)); 328d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 329d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory1); 330d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createDirectories(directory2); 331d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 332d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // 2 services listening for distinct directories 333d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey1 = directory1.register(watchService1, ALL_EVENTS_KINDS); 334d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey2 = directory2.register(watchService2, ALL_EVENTS_KINDS); 335d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // emit EVENT_CREATE/DELETE for all 336d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Path[] allFiles = new Path[]{dir1file1, dir2file1}; 337d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak for (Path path : allFiles) { 338d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(path); 339d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(path); 340d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 341d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 3424020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService1, directoryKey1, 343d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 344d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 3454020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService2, directoryKey2, 346d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 347d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 348d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 349d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak // 2 services listening for a same directory 350d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak WatchKey directoryKey3 = directory1.register(watchService2, ALL_EVENTS_KINDS); 351d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak { 352d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.createFile(dir1file1); 353d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Files.delete(dir1file1); 354d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 3554020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService1, directoryKey1, 356d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 357d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 3584020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak checkWatchServiceEvent(watchService2, directoryKey3, 359d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak Arrays.asList(new WatchEventResult(ENTRY_CREATE, 1), 360d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak new WatchEventResult(ENTRY_DELETE, 1)), true); 361d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 362d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 363d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak 364d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService1.poll()); 365d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService1.close(); 366d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak assertNull(watchService2.poll()); 367d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak watchService2.close(); 368d37b519cc3f4db065e0d3f9abe5ef81d3872a801Przemyslaw Szczepaniak } 3694020529bfb9273967ff2ca3fbae6de58c2a81166Przemyslaw Szczepaniak} 370