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); |
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; |
Mattias Nissler (ping if slow)
2012/11/21 09:28:48
Can't you put the entire test into include guards?
kmadhusu
2012/11/22 01:39:41
Browser test is extensively using the deprecated F
|
+#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. |