Index: base/files/file_path_watcher_browsertest.cc |
diff --git a/base/files/file_path_watcher_browsertest.cc b/base/files/file_path_watcher_browsertest.cc |
index b9daeccc44a571bcfb0e1429ac74eb24d49177bf..ef0988013f9389a17ce0780120db4faa6832e6bb 100644 |
--- a/base/files/file_path_watcher_browsertest.cc |
+++ b/base/files/file_path_watcher_browsertest.cc |
@@ -129,9 +129,10 @@ class TestDelegate : public TestDelegateBase { |
void SetupWatchCallback(const FilePath& target, |
FilePathWatcher* watcher, |
TestDelegateBase* delegate, |
+ bool recursive_watch, |
bool* result, |
base::WaitableEvent* completion) { |
- *result = watcher->Watch(target, |
+ *result = watcher->Watch(target, recursive_watch, |
base::Bind(&TestDelegateBase::OnFileChanged, |
delegate->AsWeakPtr())); |
completion->Signal(); |
@@ -191,7 +192,8 @@ class FilePathWatcherTest : public testing::Test { |
bool SetupWatch(const FilePath& target, |
FilePathWatcher* watcher, |
- TestDelegateBase* delegate) WARN_UNUSED_RESULT; |
+ TestDelegateBase* delegate, |
+ bool recursive_watch) WARN_UNUSED_RESULT; |
bool WaitForEvents() WARN_UNUSED_RESULT { |
collector_->Reset(); |
@@ -211,13 +213,15 @@ class FilePathWatcherTest : public testing::Test { |
bool FilePathWatcherTest::SetupWatch(const FilePath& target, |
FilePathWatcher* watcher, |
- TestDelegateBase* delegate) { |
+ TestDelegateBase* delegate, |
+ bool recursive_watch) { |
base::WaitableEvent completion(false, false); |
bool result; |
file_thread_.message_loop_proxy()->PostTask( |
FROM_HERE, |
base::Bind(SetupWatchCallback, |
- target, watcher, delegate, &result, &completion)); |
+ target, watcher, delegate, recursive_watch, &result, |
+ &completion)); |
completion.Wait(); |
return result; |
} |
@@ -226,7 +230,7 @@ bool FilePathWatcherTest::SetupWatch(const FilePath& target, |
TEST_F(FilePathWatcherTest, NewFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
ASSERT_TRUE(WaitForEvents()); |
@@ -239,7 +243,7 @@ TEST_F(FilePathWatcherTest, ModifiedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the file is modified. |
ASSERT_TRUE(WriteFile(test_file(), "new content")); |
@@ -254,7 +258,7 @@ TEST_F(FilePathWatcherTest, MovedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the file is modified. |
ASSERT_TRUE(file_util::Move(source_file, test_file())); |
@@ -267,7 +271,7 @@ TEST_F(FilePathWatcherTest, DeletedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the file is deleted. |
file_util::Delete(test_file(), false); |
@@ -304,7 +308,7 @@ TEST_F(FilePathWatcherTest, DeleteDuringNotify) { |
FilePathWatcher* watcher = new FilePathWatcher; |
// Takes ownership of watcher. |
scoped_ptr<Deleter> deleter(new Deleter(watcher, &loop_)); |
- ASSERT_TRUE(SetupWatch(test_file(), watcher, deleter.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), watcher, deleter.get(), false)); |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
ASSERT_TRUE(WaitForEvents()); |
@@ -326,7 +330,7 @@ TEST_F(FilePathWatcherTest, DeleteDuringNotify) { |
TEST_F(FilePathWatcherTest, MAYBE_DestroyWithPendingNotification) { |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
FilePathWatcher* watcher = new FilePathWatcher; |
- ASSERT_TRUE(SetupWatch(test_file(), watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), watcher, delegate.get(), false)); |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
file_thread_.message_loop_proxy()->DeleteSoon(FROM_HERE, watcher); |
DeleteDelegateOnFileThread(delegate.release()); |
@@ -336,8 +340,8 @@ TEST_F(FilePathWatcherTest, MultipleWatchersSingleFile) { |
FilePathWatcher watcher1, watcher2; |
scoped_ptr<TestDelegate> delegate1(new TestDelegate(collector())); |
scoped_ptr<TestDelegate> delegate2(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher1, delegate1.get())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher2, delegate2.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher1, delegate1.get(), false)); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher2, delegate2.get(), false)); |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
ASSERT_TRUE(WaitForEvents()); |
@@ -352,7 +356,7 @@ TEST_F(FilePathWatcherTest, NonExistentDirectory) { |
FilePath dir(temp_dir_.path().AppendASCII("dir")); |
FilePath file(dir.AppendASCII("file")); |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
@@ -385,7 +389,7 @@ TEST_F(FilePathWatcherTest, DirectoryChain) { |
FilePathWatcher watcher; |
FilePath file(path.AppendASCII("file")); |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
FilePath sub_path(temp_dir_.path()); |
for (std::vector<std::string>::const_iterator d(dir_names.begin()); |
@@ -415,7 +419,7 @@ TEST_F(FilePathWatcherTest, DisappearingDirectory) { |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
ASSERT_TRUE(WriteFile(file, "content")); |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::Delete(dir, true)); |
ASSERT_TRUE(WaitForEvents()); |
@@ -427,7 +431,7 @@ TEST_F(FilePathWatcherTest, DeleteAndRecreate) { |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::Delete(test_file(), false)); |
VLOG(1) << "Waiting for file deletion"; |
@@ -445,7 +449,7 @@ TEST_F(FilePathWatcherTest, WatchDirectory) { |
FilePath file1(dir.AppendASCII("file1")); |
FilePath file2(dir.AppendASCII("file2")); |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
VLOG(1) << "Waiting for directory creation"; |
@@ -480,9 +484,10 @@ TEST_F(FilePathWatcherTest, MoveParent) { |
FilePath subdir(dir.AppendASCII("subdir")); |
FilePath file(subdir.AppendASCII("file")); |
scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(file, &file_watcher, file_delegate.get())); |
+ ASSERT_TRUE(SetupWatch(file, &file_watcher, file_delegate.get(), false)); |
scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(subdir, &subdir_watcher, subdir_delegate.get())); |
+ ASSERT_TRUE(SetupWatch(subdir, &subdir_watcher, subdir_delegate.get(), |
+ false)); |
// Setup a directory hierarchy. |
ASSERT_TRUE(file_util::CreateDirectory(subdir)); |
@@ -498,6 +503,62 @@ TEST_F(FilePathWatcherTest, MoveParent) { |
DeleteDelegateOnFileThread(subdir_delegate.release()); |
} |
+#if defined(OS_WIN) |
+TEST_F(FilePathWatcherTest, RecursiveWatch) { |
+ FilePathWatcher watcher; |
+ FilePath dir(temp_dir_.path().AppendASCII("dir")); |
+ scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
+ ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), true)); |
+ |
+ // Main directory("dir") creation. |
+ ASSERT_TRUE(file_util::CreateDirectory(dir)); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Create "$dir/file1". |
+ FilePath file1(dir.AppendASCII("file1")); |
+ ASSERT_TRUE(WriteFile(file1, "content")); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Create "$dir/subdir". |
+ FilePath subdir(dir.AppendASCII("subdir")); |
+ ASSERT_TRUE(file_util::CreateDirectory(subdir)); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Create "$dir/subdir/subdir_file1". |
+ FilePath subdir_file1(subdir.AppendASCII("subdir_file1")); |
+ ASSERT_TRUE(WriteFile(subdir_file1, "content")); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Create "$dir/subdir/subdir_child_dir". |
+ FilePath subdir_child_dir(subdir.AppendASCII("subdir_child_dir")); |
+ ASSERT_TRUE(file_util::CreateDirectory(subdir_child_dir)); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Create "$dir/subdir/subdir_child_dir/child_dir_file1". |
+ FilePath child_dir_file1(subdir_child_dir.AppendASCII("child_dir_file1")); |
+ ASSERT_TRUE(WriteFile(child_dir_file1, "content v2")); |
+ ASSERT_TRUE(WaitForEvents()); |
Mattias Nissler (ping if slow)
2012/12/04 09:27:35
Can you also test whether file modifications get d
kmadhusu
2012/12/04 18:47:05
Done. Added a block to write into child_dir_file1
|
+ |
+ // Delete "$dir/subdir/subdir_file1". |
+ ASSERT_TRUE(file_util::Delete(subdir_file1, false)); |
+ ASSERT_TRUE(WaitForEvents()); |
+ |
+ // Delete "$dir/subdir/subdir_child_dir/child_dir_file1". |
+ ASSERT_TRUE(file_util::Delete(child_dir_file1, false)); |
+ ASSERT_TRUE(WaitForEvents()); |
+ DeleteDelegateOnFileThread(delegate.release()); |
+} |
+#else |
+TEST_F(FilePathWatcherTest, RecursiveWatch) { |
+ FilePathWatcher watcher; |
+ FilePath dir(temp_dir_.path().AppendASCII("dir")); |
+ scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
+ // Non-Windows implementaion does not support recursive watching. |
+ ASSERT_FALSE(SetupWatch(dir, &watcher, delegate.get(), true)); |
+ DeleteDelegateOnFileThread(delegate.release()); |
+} |
+#endif |
+ |
TEST_F(FilePathWatcherTest, MoveChild) { |
FilePathWatcher file_watcher; |
FilePathWatcher subdir_watcher; |
@@ -513,9 +574,10 @@ TEST_F(FilePathWatcherTest, MoveChild) { |
ASSERT_TRUE(WriteFile(source_file, "content")); |
scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(dest_file, &file_watcher, file_delegate.get())); |
+ ASSERT_TRUE(SetupWatch(dest_file, &file_watcher, file_delegate.get(), false)); |
scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(dest_subdir, &subdir_watcher, subdir_delegate.get())); |
+ ASSERT_TRUE(SetupWatch(dest_subdir, &subdir_watcher, subdir_delegate.get(), |
+ false)); |
// Move the directory into place, s.t. the watched file appears. |
ASSERT_TRUE(file_util::Move(source_dir, dest_dir)); |
@@ -533,7 +595,7 @@ TEST_F(FilePathWatcherTest, FileAttributesChanged) { |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the file is modified. |
ASSERT_TRUE(file_util::MakeFileUnreadable(test_file())); |
@@ -550,7 +612,7 @@ TEST_F(FilePathWatcherTest, CreateLink) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
// Note that we are watching the symlink |
- ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the link is created. |
// Note that test_file() doesn't have to exist. |
@@ -567,7 +629,7 @@ TEST_F(FilePathWatcherTest, DeleteLink) { |
ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the link is deleted. |
ASSERT_TRUE(file_util::Delete(test_link(), false)); |
@@ -583,7 +645,7 @@ TEST_F(FilePathWatcherTest, ModifiedLinkedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
// Note that we are watching the symlink. |
- ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the file is modified. |
ASSERT_TRUE(WriteFile(test_file(), "new content")); |
@@ -598,7 +660,7 @@ TEST_F(FilePathWatcherTest, CreateTargetLinkedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
// Note that we are watching the symlink. |
- ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the target file is created. |
ASSERT_TRUE(WriteFile(test_file(), "content")); |
@@ -614,7 +676,7 @@ TEST_F(FilePathWatcherTest, DeleteTargetLinkedFile) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
// Note that we are watching the symlink. |
- ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
// Now make sure we get notified if the target file is deleted. |
ASSERT_TRUE(file_util::Delete(test_file(), false)); |
@@ -635,7 +697,7 @@ TEST_F(FilePathWatcherTest, LinkedDirectoryPart1) { |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
ASSERT_TRUE(WriteFile(file, "content")); |
// Note that we are watching dir.lnk/file which doesn't exist yet. |
- ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
VLOG(1) << "Waiting for link creation"; |
@@ -664,7 +726,7 @@ TEST_F(FilePathWatcherTest, LinkedDirectoryPart2) { |
// neither dir nor dir/file exist yet. |
ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
// Note that we are watching dir.lnk/file. |
- ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
ASSERT_TRUE(WriteFile(file, "content")); |
@@ -693,7 +755,7 @@ TEST_F(FilePathWatcherTest, LinkedDirectoryPart3) { |
ASSERT_TRUE(file_util::CreateDirectory(dir)); |
ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
// Note that we are watching dir.lnk/file but the file doesn't exist yet. |
- ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
ASSERT_TRUE(WriteFile(file, "content")); |
VLOG(1) << "Waiting for file creation"; |
@@ -820,7 +882,7 @@ TEST_F(FilePathWatcherTest, DirAttributesChanged) { |
FilePathWatcher watcher; |
scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
- ASSERT_TRUE(SetupWatch(test_file, &watcher, delegate.get())); |
+ ASSERT_TRUE(SetupWatch(test_file, &watcher, delegate.get(), false)); |
// We should not get notified in this case as it hasn't affected our ability |
// to access the file. |