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