Chromium Code Reviews| 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 640582398c71d9aab9bc6c96ec7f22e5a574c63f..febbe02535022dfdc6cd9204cdb1b03fd2f344ba 100644 |
| --- a/base/files/file_path_watcher_browsertest.cc |
| +++ b/base/files/file_path_watcher_browsertest.cc |
| @@ -123,16 +123,18 @@ class TestDelegate : public FilePathWatcher::Delegate { |
| void SetupWatchDelegate(const FilePath& target, |
| FilePathWatcher* watcher, |
| FilePathWatcher::Delegate* delegate, |
| + bool recursive_watch, |
| bool* result, |
| base::WaitableEvent* completion) { |
| - *result = watcher->Watch(target, delegate); |
| + *result = watcher->Watch(target, recursive_watch, delegate); |
|
Mattias Nissler (ping if slow)
2012/11/22 08:51:34
this doesn't compile.
kmadhusu
2012/12/03 20:11:36
Fixed.
|
| completion->Signal(); |
| } |
| void SetupWatchCallback(const FilePath& target, |
| FilePathWatcher* watcher, |
| + bool recursive_watch, |
| const FilePathWatcher::Callback& callback) { |
| - ASSERT_TRUE(watcher->Watch(target, callback)); |
| + ASSERT_TRUE(watcher->Watch(target, recursive_watch, callback)); |
| } |
| void QuitLoopWatchCallback(MessageLoop* loop, |
| @@ -185,13 +187,15 @@ class FilePathWatcherTest : public testing::Test { |
| bool SetupWatch(const FilePath& target, |
| FilePathWatcher* watcher, |
| - FilePathWatcher::Delegate* delegate) WARN_UNUSED_RESULT { |
| + FilePathWatcher::Delegate* delegate, |
| + bool recursive_watch) WARN_UNUSED_RESULT { |
| base::WaitableEvent completion(false, false); |
| bool result; |
| file_thread_.message_loop_proxy()->PostTask( |
| FROM_HERE, |
| base::Bind(SetupWatchDelegate, target, watcher, |
| - make_scoped_refptr(delegate), &result, &completion)); |
| + make_scoped_refptr(delegate), recursive_watch, &result, |
| + &completion)); |
| completion.Wait(); |
| return result; |
| } |
| @@ -214,7 +218,7 @@ class FilePathWatcherTest : public testing::Test { |
| TEST_F(FilePathWatcherTest, NewFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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()); |
| @@ -226,7 +230,7 @@ TEST_F(FilePathWatcherTest, ModifiedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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")); |
| @@ -240,7 +244,7 @@ TEST_F(FilePathWatcherTest, MovedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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())); |
| @@ -252,7 +256,7 @@ TEST_F(FilePathWatcherTest, DeletedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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); |
| @@ -274,7 +278,7 @@ TEST_F(FilePathWatcherTest, Callback) { |
| // has been installed. |
| file_thread_.message_loop_proxy()->PostTaskAndReply( |
| FROM_HERE, |
| - base::Bind(SetupWatchCallback, test_file(), watcher, callback), |
| + base::Bind(SetupWatchCallback, test_file(), watcher, false, callback), |
| base::Bind(&MessageLoop::Quit, base::Unretained(&loop_))); |
| loop_.Run(); |
| @@ -325,7 +329,7 @@ TEST_F(FilePathWatcherTest, DeleteDuringNotify) { |
| FilePathWatcher* watcher = new FilePathWatcher; |
| // Takes ownership of watcher. |
| scoped_refptr<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()); |
| @@ -346,7 +350,7 @@ TEST_F(FilePathWatcherTest, DeleteDuringNotify) { |
| TEST_F(FilePathWatcherTest, MAYBE_DestroyWithPendingNotification) { |
| scoped_refptr<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); |
| } |
| @@ -355,8 +359,8 @@ TEST_F(FilePathWatcherTest, MultipleWatchersSingleFile) { |
| FilePathWatcher watcher1, watcher2; |
| scoped_refptr<TestDelegate> delegate1(new TestDelegate(collector())); |
| scoped_refptr<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()); |
| @@ -369,7 +373,7 @@ TEST_F(FilePathWatcherTest, NonExistentDirectory) { |
| FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| FilePath file(dir.AppendASCII("file")); |
| scoped_refptr<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)); |
| @@ -401,7 +405,7 @@ TEST_F(FilePathWatcherTest, DirectoryChain) { |
| FilePathWatcher watcher; |
| FilePath file(path.AppendASCII("file")); |
| scoped_refptr<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()); |
| @@ -430,7 +434,7 @@ TEST_F(FilePathWatcherTest, DisappearingDirectory) { |
| ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| ASSERT_TRUE(WriteFile(file, "content")); |
| scoped_refptr<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()); |
| @@ -441,7 +445,7 @@ TEST_F(FilePathWatcherTest, DeleteAndRecreate) { |
| ASSERT_TRUE(WriteFile(test_file(), "content")); |
| FilePathWatcher watcher; |
| scoped_refptr<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"; |
| @@ -458,7 +462,7 @@ TEST_F(FilePathWatcherTest, WatchDirectory) { |
| FilePath file1(dir.AppendASCII("file1")); |
| FilePath file2(dir.AppendASCII("file2")); |
| scoped_refptr<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"; |
| @@ -484,6 +488,55 @@ TEST_F(FilePathWatcherTest, WatchDirectory) { |
| ASSERT_TRUE(WaitForEvents()); |
| } |
| +TEST_F(FilePathWatcherTest, RecursiveWatch) { |
| + FilePathWatcher watcher; |
| + FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| + scoped_refptr<TestDelegate> delegate(new TestDelegate(collector())); |
| +#if defined(OS_WIN) |
| + ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), true)); |
| +#else |
| + // Non-Windows implementaion does not support recursive watching. |
| + ASSERT_FALSE(SetupWatch(dir, &watcher, delegate.get(), true)); |
| + return; |
| +#endif |
| + // 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()); |
| + |
| + // 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()); |
| +} |
| + |
| TEST_F(FilePathWatcherTest, MoveParent) { |
| FilePathWatcher file_watcher; |
| FilePathWatcher subdir_watcher; |
| @@ -492,9 +545,10 @@ TEST_F(FilePathWatcherTest, MoveParent) { |
| FilePath subdir(dir.AppendASCII("subdir")); |
| FilePath file(subdir.AppendASCII("file")); |
| scoped_refptr<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_refptr<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)); |
| @@ -523,9 +577,10 @@ TEST_F(FilePathWatcherTest, MoveChild) { |
| ASSERT_TRUE(WriteFile(source_file, "content")); |
| scoped_refptr<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_refptr<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)); |
| @@ -541,7 +596,7 @@ TEST_F(FilePathWatcherTest, FileAttributesChanged) { |
| ASSERT_TRUE(WriteFile(test_file(), "content")); |
| FilePathWatcher watcher; |
| scoped_refptr<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())); |
| @@ -557,7 +612,7 @@ TEST_F(FilePathWatcherTest, CreateLink) { |
| FilePathWatcher watcher; |
| scoped_refptr<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. |
| @@ -573,7 +628,7 @@ TEST_F(FilePathWatcherTest, DeleteLink) { |
| ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| FilePathWatcher watcher; |
| scoped_refptr<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)); |
| @@ -588,7 +643,7 @@ TEST_F(FilePathWatcherTest, ModifiedLinkedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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")); |
| @@ -602,7 +657,7 @@ TEST_F(FilePathWatcherTest, CreateTargetLinkedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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")); |
| @@ -617,7 +672,7 @@ TEST_F(FilePathWatcherTest, DeleteTargetLinkedFile) { |
| FilePathWatcher watcher; |
| scoped_refptr<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)); |
| @@ -637,7 +692,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"; |
| @@ -665,7 +720,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 +748,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"; |
| @@ -819,7 +874,7 @@ TEST_F(FilePathWatcherTest, DirAttributesChanged) { |
| FilePathWatcher watcher; |
| scoped_refptr<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. |