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}