| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/files/file_path_watcher.h" | 5 #include "base/files/file_path_watcher.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <windows.h> | 8 #include <windows.h> |
| 9 #include <aclapi.h> | 9 #include <aclapi.h> |
| 10 #elif defined(OS_POSIX) | 10 #elif defined(OS_POSIX) |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 122 |
| 123 private: | 123 private: |
| 124 scoped_refptr<NotificationCollector> collector_; | 124 scoped_refptr<NotificationCollector> collector_; |
| 125 | 125 |
| 126 DISALLOW_COPY_AND_ASSIGN(TestDelegate); | 126 DISALLOW_COPY_AND_ASSIGN(TestDelegate); |
| 127 }; | 127 }; |
| 128 | 128 |
| 129 void SetupWatchCallback(const FilePath& target, | 129 void SetupWatchCallback(const FilePath& target, |
| 130 FilePathWatcher* watcher, | 130 FilePathWatcher* watcher, |
| 131 TestDelegateBase* delegate, | 131 TestDelegateBase* delegate, |
| 132 bool recursive_watch, |
| 132 bool* result, | 133 bool* result, |
| 133 base::WaitableEvent* completion) { | 134 base::WaitableEvent* completion) { |
| 134 *result = watcher->Watch(target, | 135 *result = watcher->Watch(target, recursive_watch, |
| 135 base::Bind(&TestDelegateBase::OnFileChanged, | 136 base::Bind(&TestDelegateBase::OnFileChanged, |
| 136 delegate->AsWeakPtr())); | 137 delegate->AsWeakPtr())); |
| 137 completion->Signal(); | 138 completion->Signal(); |
| 138 } | 139 } |
| 139 | 140 |
| 140 void QuitLoopWatchCallback(MessageLoop* loop, | 141 void QuitLoopWatchCallback(MessageLoop* loop, |
| 141 const FilePath& expected_path, | 142 const FilePath& expected_path, |
| 142 bool expected_error, | 143 bool expected_error, |
| 143 bool* flag, | 144 bool* flag, |
| 144 const FilePath& path, | 145 const FilePath& path, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 | 185 |
| 185 // Write |content| to |file|. Returns true on success. | 186 // Write |content| to |file|. Returns true on success. |
| 186 bool WriteFile(const FilePath& file, const std::string& content) { | 187 bool WriteFile(const FilePath& file, const std::string& content) { |
| 187 int write_size = file_util::WriteFile(file, content.c_str(), | 188 int write_size = file_util::WriteFile(file, content.c_str(), |
| 188 content.length()); | 189 content.length()); |
| 189 return write_size == static_cast<int>(content.length()); | 190 return write_size == static_cast<int>(content.length()); |
| 190 } | 191 } |
| 191 | 192 |
| 192 bool SetupWatch(const FilePath& target, | 193 bool SetupWatch(const FilePath& target, |
| 193 FilePathWatcher* watcher, | 194 FilePathWatcher* watcher, |
| 194 TestDelegateBase* delegate) WARN_UNUSED_RESULT; | 195 TestDelegateBase* delegate, |
| 196 bool recursive_watch) WARN_UNUSED_RESULT; |
| 195 | 197 |
| 196 bool WaitForEvents() WARN_UNUSED_RESULT { | 198 bool WaitForEvents() WARN_UNUSED_RESULT { |
| 197 collector_->Reset(); | 199 collector_->Reset(); |
| 198 loop_.Run(); | 200 loop_.Run(); |
| 199 return collector_->Success(); | 201 return collector_->Success(); |
| 200 } | 202 } |
| 201 | 203 |
| 202 NotificationCollector* collector() { return collector_.get(); } | 204 NotificationCollector* collector() { return collector_.get(); } |
| 203 | 205 |
| 204 MessageLoop loop_; | 206 MessageLoop loop_; |
| 205 base::Thread file_thread_; | 207 base::Thread file_thread_; |
| 206 ScopedTempDir temp_dir_; | 208 ScopedTempDir temp_dir_; |
| 207 scoped_refptr<NotificationCollector> collector_; | 209 scoped_refptr<NotificationCollector> collector_; |
| 208 | 210 |
| 209 DISALLOW_COPY_AND_ASSIGN(FilePathWatcherTest); | 211 DISALLOW_COPY_AND_ASSIGN(FilePathWatcherTest); |
| 210 }; | 212 }; |
| 211 | 213 |
| 212 bool FilePathWatcherTest::SetupWatch(const FilePath& target, | 214 bool FilePathWatcherTest::SetupWatch(const FilePath& target, |
| 213 FilePathWatcher* watcher, | 215 FilePathWatcher* watcher, |
| 214 TestDelegateBase* delegate) { | 216 TestDelegateBase* delegate, |
| 217 bool recursive_watch) { |
| 215 base::WaitableEvent completion(false, false); | 218 base::WaitableEvent completion(false, false); |
| 216 bool result; | 219 bool result; |
| 217 file_thread_.message_loop_proxy()->PostTask( | 220 file_thread_.message_loop_proxy()->PostTask( |
| 218 FROM_HERE, | 221 FROM_HERE, |
| 219 base::Bind(SetupWatchCallback, | 222 base::Bind(SetupWatchCallback, |
| 220 target, watcher, delegate, &result, &completion)); | 223 target, watcher, delegate, recursive_watch, &result, |
| 224 &completion)); |
| 221 completion.Wait(); | 225 completion.Wait(); |
| 222 return result; | 226 return result; |
| 223 } | 227 } |
| 224 | 228 |
| 225 // Basic test: Create the file and verify that we notice. | 229 // Basic test: Create the file and verify that we notice. |
| 226 TEST_F(FilePathWatcherTest, NewFile) { | 230 TEST_F(FilePathWatcherTest, NewFile) { |
| 227 FilePathWatcher watcher; | 231 FilePathWatcher watcher; |
| 228 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 232 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 229 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 233 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 230 | 234 |
| 231 ASSERT_TRUE(WriteFile(test_file(), "content")); | 235 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 232 ASSERT_TRUE(WaitForEvents()); | 236 ASSERT_TRUE(WaitForEvents()); |
| 233 DeleteDelegateOnFileThread(delegate.release()); | 237 DeleteDelegateOnFileThread(delegate.release()); |
| 234 } | 238 } |
| 235 | 239 |
| 236 // Verify that modifying the file is caught. | 240 // Verify that modifying the file is caught. |
| 237 TEST_F(FilePathWatcherTest, ModifiedFile) { | 241 TEST_F(FilePathWatcherTest, ModifiedFile) { |
| 238 ASSERT_TRUE(WriteFile(test_file(), "content")); | 242 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 239 | 243 |
| 240 FilePathWatcher watcher; | 244 FilePathWatcher watcher; |
| 241 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 245 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 242 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 246 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 243 | 247 |
| 244 // Now make sure we get notified if the file is modified. | 248 // Now make sure we get notified if the file is modified. |
| 245 ASSERT_TRUE(WriteFile(test_file(), "new content")); | 249 ASSERT_TRUE(WriteFile(test_file(), "new content")); |
| 246 ASSERT_TRUE(WaitForEvents()); | 250 ASSERT_TRUE(WaitForEvents()); |
| 247 DeleteDelegateOnFileThread(delegate.release()); | 251 DeleteDelegateOnFileThread(delegate.release()); |
| 248 } | 252 } |
| 249 | 253 |
| 250 // Verify that moving the file into place is caught. | 254 // Verify that moving the file into place is caught. |
| 251 TEST_F(FilePathWatcherTest, MovedFile) { | 255 TEST_F(FilePathWatcherTest, MovedFile) { |
| 252 FilePath source_file(temp_dir_.path().AppendASCII("source")); | 256 FilePath source_file(temp_dir_.path().AppendASCII("source")); |
| 253 ASSERT_TRUE(WriteFile(source_file, "content")); | 257 ASSERT_TRUE(WriteFile(source_file, "content")); |
| 254 | 258 |
| 255 FilePathWatcher watcher; | 259 FilePathWatcher watcher; |
| 256 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 260 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 257 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 261 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 258 | 262 |
| 259 // Now make sure we get notified if the file is modified. | 263 // Now make sure we get notified if the file is modified. |
| 260 ASSERT_TRUE(file_util::Move(source_file, test_file())); | 264 ASSERT_TRUE(file_util::Move(source_file, test_file())); |
| 261 ASSERT_TRUE(WaitForEvents()); | 265 ASSERT_TRUE(WaitForEvents()); |
| 262 DeleteDelegateOnFileThread(delegate.release()); | 266 DeleteDelegateOnFileThread(delegate.release()); |
| 263 } | 267 } |
| 264 | 268 |
| 265 TEST_F(FilePathWatcherTest, DeletedFile) { | 269 TEST_F(FilePathWatcherTest, DeletedFile) { |
| 266 ASSERT_TRUE(WriteFile(test_file(), "content")); | 270 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 267 | 271 |
| 268 FilePathWatcher watcher; | 272 FilePathWatcher watcher; |
| 269 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 273 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 270 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 274 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 271 | 275 |
| 272 // Now make sure we get notified if the file is deleted. | 276 // Now make sure we get notified if the file is deleted. |
| 273 file_util::Delete(test_file(), false); | 277 file_util::Delete(test_file(), false); |
| 274 ASSERT_TRUE(WaitForEvents()); | 278 ASSERT_TRUE(WaitForEvents()); |
| 275 DeleteDelegateOnFileThread(delegate.release()); | 279 DeleteDelegateOnFileThread(delegate.release()); |
| 276 } | 280 } |
| 277 | 281 |
| 278 // Used by the DeleteDuringNotify test below. | 282 // Used by the DeleteDuringNotify test below. |
| 279 // Deletes the FilePathWatcher when it's notified. | 283 // Deletes the FilePathWatcher when it's notified. |
| 280 class Deleter : public TestDelegateBase { | 284 class Deleter : public TestDelegateBase { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 297 MessageLoop* loop_; | 301 MessageLoop* loop_; |
| 298 | 302 |
| 299 DISALLOW_COPY_AND_ASSIGN(Deleter); | 303 DISALLOW_COPY_AND_ASSIGN(Deleter); |
| 300 }; | 304 }; |
| 301 | 305 |
| 302 // Verify that deleting a watcher during the callback doesn't crash. | 306 // Verify that deleting a watcher during the callback doesn't crash. |
| 303 TEST_F(FilePathWatcherTest, DeleteDuringNotify) { | 307 TEST_F(FilePathWatcherTest, DeleteDuringNotify) { |
| 304 FilePathWatcher* watcher = new FilePathWatcher; | 308 FilePathWatcher* watcher = new FilePathWatcher; |
| 305 // Takes ownership of watcher. | 309 // Takes ownership of watcher. |
| 306 scoped_ptr<Deleter> deleter(new Deleter(watcher, &loop_)); | 310 scoped_ptr<Deleter> deleter(new Deleter(watcher, &loop_)); |
| 307 ASSERT_TRUE(SetupWatch(test_file(), watcher, deleter.get())); | 311 ASSERT_TRUE(SetupWatch(test_file(), watcher, deleter.get(), false)); |
| 308 | 312 |
| 309 ASSERT_TRUE(WriteFile(test_file(), "content")); | 313 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 310 ASSERT_TRUE(WaitForEvents()); | 314 ASSERT_TRUE(WaitForEvents()); |
| 311 | 315 |
| 312 // We win if we haven't crashed yet. | 316 // We win if we haven't crashed yet. |
| 313 // Might as well double-check it got deleted, too. | 317 // Might as well double-check it got deleted, too. |
| 314 ASSERT_TRUE(deleter->watcher() == NULL); | 318 ASSERT_TRUE(deleter->watcher() == NULL); |
| 315 } | 319 } |
| 316 | 320 |
| 317 // Verify that deleting the watcher works even if there is a pending | 321 // Verify that deleting the watcher works even if there is a pending |
| 318 // notification. | 322 // notification. |
| 319 // Flaky on MacOS. http://crbug.com/85930 | 323 // Flaky on MacOS. http://crbug.com/85930 |
| 320 #if defined(OS_MACOSX) | 324 #if defined(OS_MACOSX) |
| 321 #define MAYBE_DestroyWithPendingNotification \ | 325 #define MAYBE_DestroyWithPendingNotification \ |
| 322 DISABLED_DestroyWithPendingNotification | 326 DISABLED_DestroyWithPendingNotification |
| 323 #else | 327 #else |
| 324 #define MAYBE_DestroyWithPendingNotification DestroyWithPendingNotification | 328 #define MAYBE_DestroyWithPendingNotification DestroyWithPendingNotification |
| 325 #endif | 329 #endif |
| 326 TEST_F(FilePathWatcherTest, MAYBE_DestroyWithPendingNotification) { | 330 TEST_F(FilePathWatcherTest, MAYBE_DestroyWithPendingNotification) { |
| 327 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 331 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 328 FilePathWatcher* watcher = new FilePathWatcher; | 332 FilePathWatcher* watcher = new FilePathWatcher; |
| 329 ASSERT_TRUE(SetupWatch(test_file(), watcher, delegate.get())); | 333 ASSERT_TRUE(SetupWatch(test_file(), watcher, delegate.get(), false)); |
| 330 ASSERT_TRUE(WriteFile(test_file(), "content")); | 334 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 331 file_thread_.message_loop_proxy()->DeleteSoon(FROM_HERE, watcher); | 335 file_thread_.message_loop_proxy()->DeleteSoon(FROM_HERE, watcher); |
| 332 DeleteDelegateOnFileThread(delegate.release()); | 336 DeleteDelegateOnFileThread(delegate.release()); |
| 333 } | 337 } |
| 334 | 338 |
| 335 TEST_F(FilePathWatcherTest, MultipleWatchersSingleFile) { | 339 TEST_F(FilePathWatcherTest, MultipleWatchersSingleFile) { |
| 336 FilePathWatcher watcher1, watcher2; | 340 FilePathWatcher watcher1, watcher2; |
| 337 scoped_ptr<TestDelegate> delegate1(new TestDelegate(collector())); | 341 scoped_ptr<TestDelegate> delegate1(new TestDelegate(collector())); |
| 338 scoped_ptr<TestDelegate> delegate2(new TestDelegate(collector())); | 342 scoped_ptr<TestDelegate> delegate2(new TestDelegate(collector())); |
| 339 ASSERT_TRUE(SetupWatch(test_file(), &watcher1, delegate1.get())); | 343 ASSERT_TRUE(SetupWatch(test_file(), &watcher1, delegate1.get(), false)); |
| 340 ASSERT_TRUE(SetupWatch(test_file(), &watcher2, delegate2.get())); | 344 ASSERT_TRUE(SetupWatch(test_file(), &watcher2, delegate2.get(), false)); |
| 341 | 345 |
| 342 ASSERT_TRUE(WriteFile(test_file(), "content")); | 346 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 343 ASSERT_TRUE(WaitForEvents()); | 347 ASSERT_TRUE(WaitForEvents()); |
| 344 DeleteDelegateOnFileThread(delegate1.release()); | 348 DeleteDelegateOnFileThread(delegate1.release()); |
| 345 DeleteDelegateOnFileThread(delegate2.release()); | 349 DeleteDelegateOnFileThread(delegate2.release()); |
| 346 } | 350 } |
| 347 | 351 |
| 348 // Verify that watching a file whose parent directory doesn't exist yet works if | 352 // Verify that watching a file whose parent directory doesn't exist yet works if |
| 349 // the directory and file are created eventually. | 353 // the directory and file are created eventually. |
| 350 TEST_F(FilePathWatcherTest, NonExistentDirectory) { | 354 TEST_F(FilePathWatcherTest, NonExistentDirectory) { |
| 351 FilePathWatcher watcher; | 355 FilePathWatcher watcher; |
| 352 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 356 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 353 FilePath file(dir.AppendASCII("file")); | 357 FilePath file(dir.AppendASCII("file")); |
| 354 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 358 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 355 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); | 359 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
| 356 | 360 |
| 357 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 361 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 358 | 362 |
| 359 ASSERT_TRUE(WriteFile(file, "content")); | 363 ASSERT_TRUE(WriteFile(file, "content")); |
| 360 | 364 |
| 361 VLOG(1) << "Waiting for file creation"; | 365 VLOG(1) << "Waiting for file creation"; |
| 362 ASSERT_TRUE(WaitForEvents()); | 366 ASSERT_TRUE(WaitForEvents()); |
| 363 | 367 |
| 364 ASSERT_TRUE(WriteFile(file, "content v2")); | 368 ASSERT_TRUE(WriteFile(file, "content v2")); |
| 365 VLOG(1) << "Waiting for file change"; | 369 VLOG(1) << "Waiting for file change"; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 378 std::vector<std::string> dir_names; | 382 std::vector<std::string> dir_names; |
| 379 for (int i = 0; i < 20; i++) { | 383 for (int i = 0; i < 20; i++) { |
| 380 std::string dir(base::StringPrintf("d%d", i)); | 384 std::string dir(base::StringPrintf("d%d", i)); |
| 381 dir_names.push_back(dir); | 385 dir_names.push_back(dir); |
| 382 path = path.AppendASCII(dir); | 386 path = path.AppendASCII(dir); |
| 383 } | 387 } |
| 384 | 388 |
| 385 FilePathWatcher watcher; | 389 FilePathWatcher watcher; |
| 386 FilePath file(path.AppendASCII("file")); | 390 FilePath file(path.AppendASCII("file")); |
| 387 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 391 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 388 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); | 392 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
| 389 | 393 |
| 390 FilePath sub_path(temp_dir_.path()); | 394 FilePath sub_path(temp_dir_.path()); |
| 391 for (std::vector<std::string>::const_iterator d(dir_names.begin()); | 395 for (std::vector<std::string>::const_iterator d(dir_names.begin()); |
| 392 d != dir_names.end(); ++d) { | 396 d != dir_names.end(); ++d) { |
| 393 sub_path = sub_path.AppendASCII(*d); | 397 sub_path = sub_path.AppendASCII(*d); |
| 394 ASSERT_TRUE(file_util::CreateDirectory(sub_path)); | 398 ASSERT_TRUE(file_util::CreateDirectory(sub_path)); |
| 395 } | 399 } |
| 396 VLOG(1) << "Create File"; | 400 VLOG(1) << "Create File"; |
| 397 ASSERT_TRUE(WriteFile(file, "content")); | 401 ASSERT_TRUE(WriteFile(file, "content")); |
| 398 VLOG(1) << "Waiting for file creation"; | 402 VLOG(1) << "Waiting for file creation"; |
| 399 ASSERT_TRUE(WaitForEvents()); | 403 ASSERT_TRUE(WaitForEvents()); |
| 400 | 404 |
| 401 ASSERT_TRUE(WriteFile(file, "content v2")); | 405 ASSERT_TRUE(WriteFile(file, "content v2")); |
| 402 VLOG(1) << "Waiting for file modification"; | 406 VLOG(1) << "Waiting for file modification"; |
| 403 ASSERT_TRUE(WaitForEvents()); | 407 ASSERT_TRUE(WaitForEvents()); |
| 404 DeleteDelegateOnFileThread(delegate.release()); | 408 DeleteDelegateOnFileThread(delegate.release()); |
| 405 } | 409 } |
| 406 | 410 |
| 407 #if defined(OS_MACOSX) | 411 #if defined(OS_MACOSX) |
| 408 // http://crbug.com/85930 | 412 // http://crbug.com/85930 |
| 409 #define DisappearingDirectory DISABLED_DisappearingDirectory | 413 #define DisappearingDirectory DISABLED_DisappearingDirectory |
| 410 #endif | 414 #endif |
| 411 TEST_F(FilePathWatcherTest, DisappearingDirectory) { | 415 TEST_F(FilePathWatcherTest, DisappearingDirectory) { |
| 412 FilePathWatcher watcher; | 416 FilePathWatcher watcher; |
| 413 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 417 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 414 FilePath file(dir.AppendASCII("file")); | 418 FilePath file(dir.AppendASCII("file")); |
| 415 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 419 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 416 ASSERT_TRUE(WriteFile(file, "content")); | 420 ASSERT_TRUE(WriteFile(file, "content")); |
| 417 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 421 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 418 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get())); | 422 ASSERT_TRUE(SetupWatch(file, &watcher, delegate.get(), false)); |
| 419 | 423 |
| 420 ASSERT_TRUE(file_util::Delete(dir, true)); | 424 ASSERT_TRUE(file_util::Delete(dir, true)); |
| 421 ASSERT_TRUE(WaitForEvents()); | 425 ASSERT_TRUE(WaitForEvents()); |
| 422 DeleteDelegateOnFileThread(delegate.release()); | 426 DeleteDelegateOnFileThread(delegate.release()); |
| 423 } | 427 } |
| 424 | 428 |
| 425 // Tests that a file that is deleted and reappears is tracked correctly. | 429 // Tests that a file that is deleted and reappears is tracked correctly. |
| 426 TEST_F(FilePathWatcherTest, DeleteAndRecreate) { | 430 TEST_F(FilePathWatcherTest, DeleteAndRecreate) { |
| 427 ASSERT_TRUE(WriteFile(test_file(), "content")); | 431 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 428 FilePathWatcher watcher; | 432 FilePathWatcher watcher; |
| 429 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 433 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 430 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 434 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 431 | 435 |
| 432 ASSERT_TRUE(file_util::Delete(test_file(), false)); | 436 ASSERT_TRUE(file_util::Delete(test_file(), false)); |
| 433 VLOG(1) << "Waiting for file deletion"; | 437 VLOG(1) << "Waiting for file deletion"; |
| 434 ASSERT_TRUE(WaitForEvents()); | 438 ASSERT_TRUE(WaitForEvents()); |
| 435 | 439 |
| 436 ASSERT_TRUE(WriteFile(test_file(), "content")); | 440 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 437 VLOG(1) << "Waiting for file creation"; | 441 VLOG(1) << "Waiting for file creation"; |
| 438 ASSERT_TRUE(WaitForEvents()); | 442 ASSERT_TRUE(WaitForEvents()); |
| 439 DeleteDelegateOnFileThread(delegate.release()); | 443 DeleteDelegateOnFileThread(delegate.release()); |
| 440 } | 444 } |
| 441 | 445 |
| 442 TEST_F(FilePathWatcherTest, WatchDirectory) { | 446 TEST_F(FilePathWatcherTest, WatchDirectory) { |
| 443 FilePathWatcher watcher; | 447 FilePathWatcher watcher; |
| 444 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 448 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 445 FilePath file1(dir.AppendASCII("file1")); | 449 FilePath file1(dir.AppendASCII("file1")); |
| 446 FilePath file2(dir.AppendASCII("file2")); | 450 FilePath file2(dir.AppendASCII("file2")); |
| 447 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 451 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 448 ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get())); | 452 ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), false)); |
| 449 | 453 |
| 450 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 454 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 451 VLOG(1) << "Waiting for directory creation"; | 455 VLOG(1) << "Waiting for directory creation"; |
| 452 ASSERT_TRUE(WaitForEvents()); | 456 ASSERT_TRUE(WaitForEvents()); |
| 453 | 457 |
| 454 ASSERT_TRUE(WriteFile(file1, "content")); | 458 ASSERT_TRUE(WriteFile(file1, "content")); |
| 455 VLOG(1) << "Waiting for file1 creation"; | 459 VLOG(1) << "Waiting for file1 creation"; |
| 456 ASSERT_TRUE(WaitForEvents()); | 460 ASSERT_TRUE(WaitForEvents()); |
| 457 | 461 |
| 458 #if !defined(OS_MACOSX) | 462 #if !defined(OS_MACOSX) |
| (...skipping 14 matching lines...) Expand all Loading... |
| 473 } | 477 } |
| 474 | 478 |
| 475 TEST_F(FilePathWatcherTest, MoveParent) { | 479 TEST_F(FilePathWatcherTest, MoveParent) { |
| 476 FilePathWatcher file_watcher; | 480 FilePathWatcher file_watcher; |
| 477 FilePathWatcher subdir_watcher; | 481 FilePathWatcher subdir_watcher; |
| 478 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 482 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 479 FilePath dest(temp_dir_.path().AppendASCII("dest")); | 483 FilePath dest(temp_dir_.path().AppendASCII("dest")); |
| 480 FilePath subdir(dir.AppendASCII("subdir")); | 484 FilePath subdir(dir.AppendASCII("subdir")); |
| 481 FilePath file(subdir.AppendASCII("file")); | 485 FilePath file(subdir.AppendASCII("file")); |
| 482 scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); | 486 scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); |
| 483 ASSERT_TRUE(SetupWatch(file, &file_watcher, file_delegate.get())); | 487 ASSERT_TRUE(SetupWatch(file, &file_watcher, file_delegate.get(), false)); |
| 484 scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); | 488 scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); |
| 485 ASSERT_TRUE(SetupWatch(subdir, &subdir_watcher, subdir_delegate.get())); | 489 ASSERT_TRUE(SetupWatch(subdir, &subdir_watcher, subdir_delegate.get(), |
| 490 false)); |
| 486 | 491 |
| 487 // Setup a directory hierarchy. | 492 // Setup a directory hierarchy. |
| 488 ASSERT_TRUE(file_util::CreateDirectory(subdir)); | 493 ASSERT_TRUE(file_util::CreateDirectory(subdir)); |
| 489 ASSERT_TRUE(WriteFile(file, "content")); | 494 ASSERT_TRUE(WriteFile(file, "content")); |
| 490 VLOG(1) << "Waiting for file creation"; | 495 VLOG(1) << "Waiting for file creation"; |
| 491 ASSERT_TRUE(WaitForEvents()); | 496 ASSERT_TRUE(WaitForEvents()); |
| 492 | 497 |
| 493 // Move the parent directory. | 498 // Move the parent directory. |
| 494 file_util::Move(dir, dest); | 499 file_util::Move(dir, dest); |
| 495 VLOG(1) << "Waiting for directory move"; | 500 VLOG(1) << "Waiting for directory move"; |
| 496 ASSERT_TRUE(WaitForEvents()); | 501 ASSERT_TRUE(WaitForEvents()); |
| 497 DeleteDelegateOnFileThread(file_delegate.release()); | 502 DeleteDelegateOnFileThread(file_delegate.release()); |
| 498 DeleteDelegateOnFileThread(subdir_delegate.release()); | 503 DeleteDelegateOnFileThread(subdir_delegate.release()); |
| 499 } | 504 } |
| 500 | 505 |
| 506 #if defined(OS_WIN) |
| 507 TEST_F(FilePathWatcherTest, RecursiveWatch) { |
| 508 FilePathWatcher watcher; |
| 509 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 510 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 511 ASSERT_TRUE(SetupWatch(dir, &watcher, delegate.get(), true)); |
| 512 |
| 513 // Main directory("dir") creation. |
| 514 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 515 ASSERT_TRUE(WaitForEvents()); |
| 516 |
| 517 // Create "$dir/file1". |
| 518 FilePath file1(dir.AppendASCII("file1")); |
| 519 ASSERT_TRUE(WriteFile(file1, "content")); |
| 520 ASSERT_TRUE(WaitForEvents()); |
| 521 |
| 522 // Create "$dir/subdir". |
| 523 FilePath subdir(dir.AppendASCII("subdir")); |
| 524 ASSERT_TRUE(file_util::CreateDirectory(subdir)); |
| 525 ASSERT_TRUE(WaitForEvents()); |
| 526 |
| 527 // Create "$dir/subdir/subdir_file1". |
| 528 FilePath subdir_file1(subdir.AppendASCII("subdir_file1")); |
| 529 ASSERT_TRUE(WriteFile(subdir_file1, "content")); |
| 530 ASSERT_TRUE(WaitForEvents()); |
| 531 |
| 532 // Create "$dir/subdir/subdir_child_dir". |
| 533 FilePath subdir_child_dir(subdir.AppendASCII("subdir_child_dir")); |
| 534 ASSERT_TRUE(file_util::CreateDirectory(subdir_child_dir)); |
| 535 ASSERT_TRUE(WaitForEvents()); |
| 536 |
| 537 // Create "$dir/subdir/subdir_child_dir/child_dir_file1". |
| 538 FilePath child_dir_file1(subdir_child_dir.AppendASCII("child_dir_file1")); |
| 539 ASSERT_TRUE(WriteFile(child_dir_file1, "content v2")); |
| 540 ASSERT_TRUE(WaitForEvents()); |
| 541 |
| 542 // Write into "$dir/subdir/subdir_child_dir/child_dir_file1". |
| 543 ASSERT_TRUE(WriteFile(child_dir_file1, "content")); |
| 544 ASSERT_TRUE(WaitForEvents()); |
| 545 |
| 546 // Modify "$dir/subdir/subdir_child_dir/child_dir_file1" attributes. |
| 547 ASSERT_TRUE(file_util::MakeFileUnreadable(child_dir_file1)); |
| 548 ASSERT_TRUE(WaitForEvents()); |
| 549 |
| 550 // Delete "$dir/subdir/subdir_file1". |
| 551 ASSERT_TRUE(file_util::Delete(subdir_file1, false)); |
| 552 ASSERT_TRUE(WaitForEvents()); |
| 553 |
| 554 // Delete "$dir/subdir/subdir_child_dir/child_dir_file1". |
| 555 ASSERT_TRUE(file_util::Delete(child_dir_file1, false)); |
| 556 ASSERT_TRUE(WaitForEvents()); |
| 557 DeleteDelegateOnFileThread(delegate.release()); |
| 558 } |
| 559 #else |
| 560 TEST_F(FilePathWatcherTest, RecursiveWatch) { |
| 561 FilePathWatcher watcher; |
| 562 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 563 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 564 // Non-Windows implementaion does not support recursive watching. |
| 565 ASSERT_FALSE(SetupWatch(dir, &watcher, delegate.get(), true)); |
| 566 DeleteDelegateOnFileThread(delegate.release()); |
| 567 } |
| 568 #endif |
| 569 |
| 501 TEST_F(FilePathWatcherTest, MoveChild) { | 570 TEST_F(FilePathWatcherTest, MoveChild) { |
| 502 FilePathWatcher file_watcher; | 571 FilePathWatcher file_watcher; |
| 503 FilePathWatcher subdir_watcher; | 572 FilePathWatcher subdir_watcher; |
| 504 FilePath source_dir(temp_dir_.path().AppendASCII("source")); | 573 FilePath source_dir(temp_dir_.path().AppendASCII("source")); |
| 505 FilePath source_subdir(source_dir.AppendASCII("subdir")); | 574 FilePath source_subdir(source_dir.AppendASCII("subdir")); |
| 506 FilePath source_file(source_subdir.AppendASCII("file")); | 575 FilePath source_file(source_subdir.AppendASCII("file")); |
| 507 FilePath dest_dir(temp_dir_.path().AppendASCII("dest")); | 576 FilePath dest_dir(temp_dir_.path().AppendASCII("dest")); |
| 508 FilePath dest_subdir(dest_dir.AppendASCII("subdir")); | 577 FilePath dest_subdir(dest_dir.AppendASCII("subdir")); |
| 509 FilePath dest_file(dest_subdir.AppendASCII("file")); | 578 FilePath dest_file(dest_subdir.AppendASCII("file")); |
| 510 | 579 |
| 511 // Setup a directory hierarchy. | 580 // Setup a directory hierarchy. |
| 512 ASSERT_TRUE(file_util::CreateDirectory(source_subdir)); | 581 ASSERT_TRUE(file_util::CreateDirectory(source_subdir)); |
| 513 ASSERT_TRUE(WriteFile(source_file, "content")); | 582 ASSERT_TRUE(WriteFile(source_file, "content")); |
| 514 | 583 |
| 515 scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); | 584 scoped_ptr<TestDelegate> file_delegate(new TestDelegate(collector())); |
| 516 ASSERT_TRUE(SetupWatch(dest_file, &file_watcher, file_delegate.get())); | 585 ASSERT_TRUE(SetupWatch(dest_file, &file_watcher, file_delegate.get(), false)); |
| 517 scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); | 586 scoped_ptr<TestDelegate> subdir_delegate(new TestDelegate(collector())); |
| 518 ASSERT_TRUE(SetupWatch(dest_subdir, &subdir_watcher, subdir_delegate.get())); | 587 ASSERT_TRUE(SetupWatch(dest_subdir, &subdir_watcher, subdir_delegate.get(), |
| 588 false)); |
| 519 | 589 |
| 520 // Move the directory into place, s.t. the watched file appears. | 590 // Move the directory into place, s.t. the watched file appears. |
| 521 ASSERT_TRUE(file_util::Move(source_dir, dest_dir)); | 591 ASSERT_TRUE(file_util::Move(source_dir, dest_dir)); |
| 522 ASSERT_TRUE(WaitForEvents()); | 592 ASSERT_TRUE(WaitForEvents()); |
| 523 DeleteDelegateOnFileThread(file_delegate.release()); | 593 DeleteDelegateOnFileThread(file_delegate.release()); |
| 524 DeleteDelegateOnFileThread(subdir_delegate.release()); | 594 DeleteDelegateOnFileThread(subdir_delegate.release()); |
| 525 } | 595 } |
| 526 | 596 |
| 527 #if !defined(OS_LINUX) | 597 #if !defined(OS_LINUX) |
| 528 // Linux implementation of FilePathWatcher doesn't catch attribute changes. | 598 // Linux implementation of FilePathWatcher doesn't catch attribute changes. |
| 529 // http://crbug.com/78043 | 599 // http://crbug.com/78043 |
| 530 | 600 |
| 531 // Verify that changing attributes on a file is caught | 601 // Verify that changing attributes on a file is caught |
| 532 TEST_F(FilePathWatcherTest, FileAttributesChanged) { | 602 TEST_F(FilePathWatcherTest, FileAttributesChanged) { |
| 533 ASSERT_TRUE(WriteFile(test_file(), "content")); | 603 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 534 FilePathWatcher watcher; | 604 FilePathWatcher watcher; |
| 535 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 605 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 536 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get())); | 606 ASSERT_TRUE(SetupWatch(test_file(), &watcher, delegate.get(), false)); |
| 537 | 607 |
| 538 // Now make sure we get notified if the file is modified. | 608 // Now make sure we get notified if the file is modified. |
| 539 ASSERT_TRUE(file_util::MakeFileUnreadable(test_file())); | 609 ASSERT_TRUE(file_util::MakeFileUnreadable(test_file())); |
| 540 ASSERT_TRUE(WaitForEvents()); | 610 ASSERT_TRUE(WaitForEvents()); |
| 541 DeleteDelegateOnFileThread(delegate.release()); | 611 DeleteDelegateOnFileThread(delegate.release()); |
| 542 } | 612 } |
| 543 | 613 |
| 544 #endif // !OS_LINUX | 614 #endif // !OS_LINUX |
| 545 | 615 |
| 546 #if defined(OS_LINUX) | 616 #if defined(OS_LINUX) |
| 547 | 617 |
| 548 // Verify that creating a symlink is caught. | 618 // Verify that creating a symlink is caught. |
| 549 TEST_F(FilePathWatcherTest, CreateLink) { | 619 TEST_F(FilePathWatcherTest, CreateLink) { |
| 550 FilePathWatcher watcher; | 620 FilePathWatcher watcher; |
| 551 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 621 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 552 // Note that we are watching the symlink | 622 // Note that we are watching the symlink |
| 553 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); | 623 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
| 554 | 624 |
| 555 // Now make sure we get notified if the link is created. | 625 // Now make sure we get notified if the link is created. |
| 556 // Note that test_file() doesn't have to exist. | 626 // Note that test_file() doesn't have to exist. |
| 557 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); | 627 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| 558 ASSERT_TRUE(WaitForEvents()); | 628 ASSERT_TRUE(WaitForEvents()); |
| 559 DeleteDelegateOnFileThread(delegate.release()); | 629 DeleteDelegateOnFileThread(delegate.release()); |
| 560 } | 630 } |
| 561 | 631 |
| 562 // Verify that deleting a symlink is caught. | 632 // Verify that deleting a symlink is caught. |
| 563 TEST_F(FilePathWatcherTest, DeleteLink) { | 633 TEST_F(FilePathWatcherTest, DeleteLink) { |
| 564 // Unfortunately this test case only works if the link target exists. | 634 // Unfortunately this test case only works if the link target exists. |
| 565 // TODO(craig) fix this as part of crbug.com/91561. | 635 // TODO(craig) fix this as part of crbug.com/91561. |
| 566 ASSERT_TRUE(WriteFile(test_file(), "content")); | 636 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 567 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); | 637 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| 568 FilePathWatcher watcher; | 638 FilePathWatcher watcher; |
| 569 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 639 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 570 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); | 640 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
| 571 | 641 |
| 572 // Now make sure we get notified if the link is deleted. | 642 // Now make sure we get notified if the link is deleted. |
| 573 ASSERT_TRUE(file_util::Delete(test_link(), false)); | 643 ASSERT_TRUE(file_util::Delete(test_link(), false)); |
| 574 ASSERT_TRUE(WaitForEvents()); | 644 ASSERT_TRUE(WaitForEvents()); |
| 575 DeleteDelegateOnFileThread(delegate.release()); | 645 DeleteDelegateOnFileThread(delegate.release()); |
| 576 } | 646 } |
| 577 | 647 |
| 578 // Verify that modifying a target file that a link is pointing to | 648 // Verify that modifying a target file that a link is pointing to |
| 579 // when we are watching the link is caught. | 649 // when we are watching the link is caught. |
| 580 TEST_F(FilePathWatcherTest, ModifiedLinkedFile) { | 650 TEST_F(FilePathWatcherTest, ModifiedLinkedFile) { |
| 581 ASSERT_TRUE(WriteFile(test_file(), "content")); | 651 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 582 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); | 652 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| 583 FilePathWatcher watcher; | 653 FilePathWatcher watcher; |
| 584 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 654 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 585 // Note that we are watching the symlink. | 655 // Note that we are watching the symlink. |
| 586 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); | 656 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
| 587 | 657 |
| 588 // Now make sure we get notified if the file is modified. | 658 // Now make sure we get notified if the file is modified. |
| 589 ASSERT_TRUE(WriteFile(test_file(), "new content")); | 659 ASSERT_TRUE(WriteFile(test_file(), "new content")); |
| 590 ASSERT_TRUE(WaitForEvents()); | 660 ASSERT_TRUE(WaitForEvents()); |
| 591 DeleteDelegateOnFileThread(delegate.release()); | 661 DeleteDelegateOnFileThread(delegate.release()); |
| 592 } | 662 } |
| 593 | 663 |
| 594 // Verify that creating a target file that a link is pointing to | 664 // Verify that creating a target file that a link is pointing to |
| 595 // when we are watching the link is caught. | 665 // when we are watching the link is caught. |
| 596 TEST_F(FilePathWatcherTest, CreateTargetLinkedFile) { | 666 TEST_F(FilePathWatcherTest, CreateTargetLinkedFile) { |
| 597 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); | 667 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| 598 FilePathWatcher watcher; | 668 FilePathWatcher watcher; |
| 599 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 669 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 600 // Note that we are watching the symlink. | 670 // Note that we are watching the symlink. |
| 601 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); | 671 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
| 602 | 672 |
| 603 // Now make sure we get notified if the target file is created. | 673 // Now make sure we get notified if the target file is created. |
| 604 ASSERT_TRUE(WriteFile(test_file(), "content")); | 674 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 605 ASSERT_TRUE(WaitForEvents()); | 675 ASSERT_TRUE(WaitForEvents()); |
| 606 DeleteDelegateOnFileThread(delegate.release()); | 676 DeleteDelegateOnFileThread(delegate.release()); |
| 607 } | 677 } |
| 608 | 678 |
| 609 // Verify that deleting a target file that a link is pointing to | 679 // Verify that deleting a target file that a link is pointing to |
| 610 // when we are watching the link is caught. | 680 // when we are watching the link is caught. |
| 611 TEST_F(FilePathWatcherTest, DeleteTargetLinkedFile) { | 681 TEST_F(FilePathWatcherTest, DeleteTargetLinkedFile) { |
| 612 ASSERT_TRUE(WriteFile(test_file(), "content")); | 682 ASSERT_TRUE(WriteFile(test_file(), "content")); |
| 613 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); | 683 ASSERT_TRUE(file_util::CreateSymbolicLink(test_file(), test_link())); |
| 614 FilePathWatcher watcher; | 684 FilePathWatcher watcher; |
| 615 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 685 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 616 // Note that we are watching the symlink. | 686 // Note that we are watching the symlink. |
| 617 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get())); | 687 ASSERT_TRUE(SetupWatch(test_link(), &watcher, delegate.get(), false)); |
| 618 | 688 |
| 619 // Now make sure we get notified if the target file is deleted. | 689 // Now make sure we get notified if the target file is deleted. |
| 620 ASSERT_TRUE(file_util::Delete(test_file(), false)); | 690 ASSERT_TRUE(file_util::Delete(test_file(), false)); |
| 621 ASSERT_TRUE(WaitForEvents()); | 691 ASSERT_TRUE(WaitForEvents()); |
| 622 DeleteDelegateOnFileThread(delegate.release()); | 692 DeleteDelegateOnFileThread(delegate.release()); |
| 623 } | 693 } |
| 624 | 694 |
| 625 // Verify that watching a file whose parent directory is a link that | 695 // Verify that watching a file whose parent directory is a link that |
| 626 // doesn't exist yet works if the symlink is created eventually. | 696 // doesn't exist yet works if the symlink is created eventually. |
| 627 TEST_F(FilePathWatcherTest, LinkedDirectoryPart1) { | 697 TEST_F(FilePathWatcherTest, LinkedDirectoryPart1) { |
| 628 FilePathWatcher watcher; | 698 FilePathWatcher watcher; |
| 629 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 699 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 630 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); | 700 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); |
| 631 FilePath file(dir.AppendASCII("file")); | 701 FilePath file(dir.AppendASCII("file")); |
| 632 FilePath linkfile(link_dir.AppendASCII("file")); | 702 FilePath linkfile(link_dir.AppendASCII("file")); |
| 633 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 703 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 634 // dir/file should exist. | 704 // dir/file should exist. |
| 635 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 705 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 636 ASSERT_TRUE(WriteFile(file, "content")); | 706 ASSERT_TRUE(WriteFile(file, "content")); |
| 637 // Note that we are watching dir.lnk/file which doesn't exist yet. | 707 // Note that we are watching dir.lnk/file which doesn't exist yet. |
| 638 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); | 708 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
| 639 | 709 |
| 640 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); | 710 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
| 641 VLOG(1) << "Waiting for link creation"; | 711 VLOG(1) << "Waiting for link creation"; |
| 642 ASSERT_TRUE(WaitForEvents()); | 712 ASSERT_TRUE(WaitForEvents()); |
| 643 | 713 |
| 644 ASSERT_TRUE(WriteFile(file, "content v2")); | 714 ASSERT_TRUE(WriteFile(file, "content v2")); |
| 645 VLOG(1) << "Waiting for file change"; | 715 VLOG(1) << "Waiting for file change"; |
| 646 ASSERT_TRUE(WaitForEvents()); | 716 ASSERT_TRUE(WaitForEvents()); |
| 647 | 717 |
| 648 ASSERT_TRUE(file_util::Delete(file, false)); | 718 ASSERT_TRUE(file_util::Delete(file, false)); |
| 649 VLOG(1) << "Waiting for file deletion"; | 719 VLOG(1) << "Waiting for file deletion"; |
| 650 ASSERT_TRUE(WaitForEvents()); | 720 ASSERT_TRUE(WaitForEvents()); |
| 651 DeleteDelegateOnFileThread(delegate.release()); | 721 DeleteDelegateOnFileThread(delegate.release()); |
| 652 } | 722 } |
| 653 | 723 |
| 654 // Verify that watching a file whose parent directory is a | 724 // Verify that watching a file whose parent directory is a |
| 655 // dangling symlink works if the directory is created eventually. | 725 // dangling symlink works if the directory is created eventually. |
| 656 TEST_F(FilePathWatcherTest, LinkedDirectoryPart2) { | 726 TEST_F(FilePathWatcherTest, LinkedDirectoryPart2) { |
| 657 FilePathWatcher watcher; | 727 FilePathWatcher watcher; |
| 658 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 728 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 659 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); | 729 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); |
| 660 FilePath file(dir.AppendASCII("file")); | 730 FilePath file(dir.AppendASCII("file")); |
| 661 FilePath linkfile(link_dir.AppendASCII("file")); | 731 FilePath linkfile(link_dir.AppendASCII("file")); |
| 662 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 732 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 663 // Now create the link from dir.lnk pointing to dir but | 733 // Now create the link from dir.lnk pointing to dir but |
| 664 // neither dir nor dir/file exist yet. | 734 // neither dir nor dir/file exist yet. |
| 665 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); | 735 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
| 666 // Note that we are watching dir.lnk/file. | 736 // Note that we are watching dir.lnk/file. |
| 667 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); | 737 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
| 668 | 738 |
| 669 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 739 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 670 ASSERT_TRUE(WriteFile(file, "content")); | 740 ASSERT_TRUE(WriteFile(file, "content")); |
| 671 VLOG(1) << "Waiting for dir/file creation"; | 741 VLOG(1) << "Waiting for dir/file creation"; |
| 672 ASSERT_TRUE(WaitForEvents()); | 742 ASSERT_TRUE(WaitForEvents()); |
| 673 | 743 |
| 674 ASSERT_TRUE(WriteFile(file, "content v2")); | 744 ASSERT_TRUE(WriteFile(file, "content v2")); |
| 675 VLOG(1) << "Waiting for file change"; | 745 VLOG(1) << "Waiting for file change"; |
| 676 ASSERT_TRUE(WaitForEvents()); | 746 ASSERT_TRUE(WaitForEvents()); |
| 677 | 747 |
| 678 ASSERT_TRUE(file_util::Delete(file, false)); | 748 ASSERT_TRUE(file_util::Delete(file, false)); |
| 679 VLOG(1) << "Waiting for file deletion"; | 749 VLOG(1) << "Waiting for file deletion"; |
| 680 ASSERT_TRUE(WaitForEvents()); | 750 ASSERT_TRUE(WaitForEvents()); |
| 681 DeleteDelegateOnFileThread(delegate.release()); | 751 DeleteDelegateOnFileThread(delegate.release()); |
| 682 } | 752 } |
| 683 | 753 |
| 684 // Verify that watching a file with a symlink on the path | 754 // Verify that watching a file with a symlink on the path |
| 685 // to the file works. | 755 // to the file works. |
| 686 TEST_F(FilePathWatcherTest, LinkedDirectoryPart3) { | 756 TEST_F(FilePathWatcherTest, LinkedDirectoryPart3) { |
| 687 FilePathWatcher watcher; | 757 FilePathWatcher watcher; |
| 688 FilePath dir(temp_dir_.path().AppendASCII("dir")); | 758 FilePath dir(temp_dir_.path().AppendASCII("dir")); |
| 689 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); | 759 FilePath link_dir(temp_dir_.path().AppendASCII("dir.lnk")); |
| 690 FilePath file(dir.AppendASCII("file")); | 760 FilePath file(dir.AppendASCII("file")); |
| 691 FilePath linkfile(link_dir.AppendASCII("file")); | 761 FilePath linkfile(link_dir.AppendASCII("file")); |
| 692 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 762 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 693 ASSERT_TRUE(file_util::CreateDirectory(dir)); | 763 ASSERT_TRUE(file_util::CreateDirectory(dir)); |
| 694 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); | 764 ASSERT_TRUE(file_util::CreateSymbolicLink(dir, link_dir)); |
| 695 // Note that we are watching dir.lnk/file but the file doesn't exist yet. | 765 // Note that we are watching dir.lnk/file but the file doesn't exist yet. |
| 696 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get())); | 766 ASSERT_TRUE(SetupWatch(linkfile, &watcher, delegate.get(), false)); |
| 697 | 767 |
| 698 ASSERT_TRUE(WriteFile(file, "content")); | 768 ASSERT_TRUE(WriteFile(file, "content")); |
| 699 VLOG(1) << "Waiting for file creation"; | 769 VLOG(1) << "Waiting for file creation"; |
| 700 ASSERT_TRUE(WaitForEvents()); | 770 ASSERT_TRUE(WaitForEvents()); |
| 701 | 771 |
| 702 ASSERT_TRUE(WriteFile(file, "content v2")); | 772 ASSERT_TRUE(WriteFile(file, "content v2")); |
| 703 VLOG(1) << "Waiting for file change"; | 773 VLOG(1) << "Waiting for file change"; |
| 704 ASSERT_TRUE(WaitForEvents()); | 774 ASSERT_TRUE(WaitForEvents()); |
| 705 | 775 |
| 706 ASSERT_TRUE(file_util::Delete(file, false)); | 776 ASSERT_TRUE(file_util::Delete(file, false)); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 813 FilePath test_dir1(temp_dir_.path().AppendASCII("DirAttributesChangedDir1")); | 883 FilePath test_dir1(temp_dir_.path().AppendASCII("DirAttributesChangedDir1")); |
| 814 FilePath test_dir2(test_dir1.AppendASCII("DirAttributesChangedDir2")); | 884 FilePath test_dir2(test_dir1.AppendASCII("DirAttributesChangedDir2")); |
| 815 FilePath test_file(test_dir2.AppendASCII("DirAttributesChangedFile")); | 885 FilePath test_file(test_dir2.AppendASCII("DirAttributesChangedFile")); |
| 816 // Setup a directory hierarchy. | 886 // Setup a directory hierarchy. |
| 817 ASSERT_TRUE(file_util::CreateDirectory(test_dir1)); | 887 ASSERT_TRUE(file_util::CreateDirectory(test_dir1)); |
| 818 ASSERT_TRUE(file_util::CreateDirectory(test_dir2)); | 888 ASSERT_TRUE(file_util::CreateDirectory(test_dir2)); |
| 819 ASSERT_TRUE(WriteFile(test_file, "content")); | 889 ASSERT_TRUE(WriteFile(test_file, "content")); |
| 820 | 890 |
| 821 FilePathWatcher watcher; | 891 FilePathWatcher watcher; |
| 822 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); | 892 scoped_ptr<TestDelegate> delegate(new TestDelegate(collector())); |
| 823 ASSERT_TRUE(SetupWatch(test_file, &watcher, delegate.get())); | 893 ASSERT_TRUE(SetupWatch(test_file, &watcher, delegate.get(), false)); |
| 824 | 894 |
| 825 // We should not get notified in this case as it hasn't affected our ability | 895 // We should not get notified in this case as it hasn't affected our ability |
| 826 // to access the file. | 896 // to access the file. |
| 827 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, false)); | 897 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, false)); |
| 828 loop_.PostDelayedTask(FROM_HERE, | 898 loop_.PostDelayedTask(FROM_HERE, |
| 829 MessageLoop::QuitClosure(), | 899 MessageLoop::QuitClosure(), |
| 830 TestTimeouts::tiny_timeout()); | 900 TestTimeouts::tiny_timeout()); |
| 831 ASSERT_FALSE(WaitForEvents()); | 901 ASSERT_FALSE(WaitForEvents()); |
| 832 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, true)); | 902 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Read, true)); |
| 833 | 903 |
| 834 // We should get notified in this case because filepathwatcher can no | 904 // We should get notified in this case because filepathwatcher can no |
| 835 // longer access the file | 905 // longer access the file |
| 836 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, false)); | 906 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, false)); |
| 837 ASSERT_TRUE(WaitForEvents()); | 907 ASSERT_TRUE(WaitForEvents()); |
| 838 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, true)); | 908 ASSERT_TRUE(ChangeFilePermissions(test_dir1, Execute, true)); |
| 839 DeleteDelegateOnFileThread(delegate.release()); | 909 DeleteDelegateOnFileThread(delegate.release()); |
| 840 } | 910 } |
| 841 | 911 |
| 842 #endif // OS_MACOSX | 912 #endif // OS_MACOSX |
| 843 } // namespace | 913 } // namespace |
| 844 | 914 |
| 845 } // namespace files | 915 } // namespace files |
| 846 } // namespace base | 916 } // namespace base |
| OLD | NEW |