OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chrome/browser/chromeos/file_system_provider/provided_file_system.h" | 5 #include "chrome/browser/chromeos/file_system_provider/provided_file_system.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 base::File::Error reply_result_; | 94 base::File::Error reply_result_; |
95 DISALLOW_COPY_AND_ASSIGN(FakeEventRouter); | 95 DISALLOW_COPY_AND_ASSIGN(FakeEventRouter); |
96 }; | 96 }; |
97 | 97 |
98 // Observes the tested file system. | 98 // Observes the tested file system. |
99 class Observer : public ProvidedFileSystemObserver { | 99 class Observer : public ProvidedFileSystemObserver { |
100 public: | 100 public: |
101 class ChangeEvent { | 101 class ChangeEvent { |
102 public: | 102 public: |
103 ChangeEvent(ProvidedFileSystemObserver::ChangeType change_type, | 103 ChangeEvent(ProvidedFileSystemObserver::ChangeType change_type, |
104 const ProvidedFileSystemObserver::ChildChanges& child_changes) | 104 const ProvidedFileSystemObserver::Changes& changes) |
105 : change_type_(change_type), child_changes_(child_changes) {} | 105 : change_type_(change_type), changes_(changes) {} |
106 virtual ~ChangeEvent() {} | 106 virtual ~ChangeEvent() {} |
107 | 107 |
108 ProvidedFileSystemObserver::ChangeType change_type() const { | 108 ProvidedFileSystemObserver::ChangeType change_type() const { |
109 return change_type_; | 109 return change_type_; |
110 } | 110 } |
111 const ProvidedFileSystemObserver::ChildChanges& child_changes() const { | 111 const ProvidedFileSystemObserver::Changes& changes() const { |
112 return child_changes_; | 112 return changes_; |
113 } | 113 } |
114 | 114 |
115 private: | 115 private: |
116 const ProvidedFileSystemObserver::ChangeType change_type_; | 116 const ProvidedFileSystemObserver::ChangeType change_type_; |
117 const ProvidedFileSystemObserver::ChildChanges child_changes_; | 117 const ProvidedFileSystemObserver::Changes changes_; |
118 | 118 |
119 DISALLOW_COPY_AND_ASSIGN(ChangeEvent); | 119 DISALLOW_COPY_AND_ASSIGN(ChangeEvent); |
120 }; | 120 }; |
121 | 121 |
122 Observer() : list_changed_counter_(0), tag_updated_counter_(0) {} | 122 Observer() : list_changed_counter_(0), tag_updated_counter_(0) {} |
123 | 123 |
124 // ProvidedFileSystemInterfaceObserver overrides. | 124 // ProvidedFileSystemInterfaceObserver overrides. |
125 virtual void OnObservedEntryChanged( | 125 virtual void OnObservedEntryChanged( |
126 const ProvidedFileSystemInfo& file_system_info, | 126 const ProvidedFileSystemInfo& file_system_info, |
127 const ObservedEntry& observed_entry, | 127 const ObservedEntry& observed_entry, |
128 ProvidedFileSystemObserver::ChangeType change_type, | 128 ProvidedFileSystemObserver::ChangeType change_type, |
129 const ProvidedFileSystemObserver::ChildChanges& child_changes, | 129 const ProvidedFileSystemObserver::Changes& changes, |
130 const base::Closure& callback) override { | 130 const base::Closure& callback) override { |
131 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); | 131 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
132 change_events_.push_back(new ChangeEvent(change_type, child_changes)); | 132 change_events_.push_back(new ChangeEvent(change_type, changes)); |
133 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); | 133 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback); |
134 } | 134 } |
135 | 135 |
136 virtual void OnObservedEntryTagUpdated( | 136 virtual void OnObservedEntryTagUpdated( |
137 const ProvidedFileSystemInfo& file_system_info, | 137 const ProvidedFileSystemInfo& file_system_info, |
138 const ObservedEntry& observed_entry) override { | 138 const ObservedEntry& observed_entry) override { |
139 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); | 139 EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
140 ++tag_updated_counter_; | 140 ++tag_updated_counter_; |
141 } | 141 } |
142 | 142 |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 base::RunLoop().RunUntilIdle(); | 362 base::RunLoop().RunUntilIdle(); |
363 | 363 |
364 ASSERT_EQ(1u, log.size()); | 364 ASSERT_EQ(1u, log.size()); |
365 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[0]); | 365 EXPECT_EQ(base::File::FILE_ERROR_EXISTS, log[0]); |
366 EXPECT_EQ(1, observer.list_changed_counter()); // No changes on the list. | 366 EXPECT_EQ(1, observer.list_changed_counter()); // No changes on the list. |
367 EXPECT_EQ(0, observer.tag_updated_counter()); | 367 EXPECT_EQ(0, observer.tag_updated_counter()); |
368 } | 368 } |
369 | 369 |
370 { | 370 { |
371 // Create another observer on the same path, but a recursive one. That | 371 // Create another observer on the same path, but a recursive one. That |
372 // should | 372 // should succeed. |
373 // succeed. | |
374 Log log; | 373 Log log; |
375 provided_file_system_->ObserveDirectory( | 374 provided_file_system_->ObserveDirectory( |
376 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 375 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
377 true /* recursive */, | 376 true /* recursive */, |
378 base::Bind(&LogStatus, base::Unretained(&log))); | 377 base::Bind(&LogStatus, base::Unretained(&log))); |
379 base::RunLoop().RunUntilIdle(); | 378 base::RunLoop().RunUntilIdle(); |
380 | 379 |
381 ASSERT_EQ(1u, log.size()); | 380 ASSERT_EQ(1u, log.size()); |
382 EXPECT_EQ(base::File::FILE_OK, log[0]); | 381 EXPECT_EQ(base::File::FILE_OK, log[0]); |
383 EXPECT_EQ(2, observer.list_changed_counter()); | 382 EXPECT_EQ(2, observer.list_changed_counter()); |
384 EXPECT_EQ(0, observer.tag_updated_counter()); | 383 EXPECT_EQ(0, observer.tag_updated_counter()); |
385 | 384 |
386 ObservedEntries* const observed_entries = | 385 ObservedEntries* const observed_entries = |
387 provided_file_system_->GetObservedEntries(); | 386 provided_file_system_->GetObservedEntries(); |
388 ASSERT_EQ(1u, observed_entries->size()); | 387 const auto& observed_entry_it = observed_entries->find( |
389 const ObservedEntry& observed_entry = observed_entries->begin()->second; | 388 ObservedEntryKey(base::FilePath(FILE_PATH_LITERAL(kDirectoryPath)), |
390 EXPECT_EQ(kDirectoryPath, observed_entry.entry_path.value()); | 389 true /* recursive */)); |
391 EXPECT_TRUE(observed_entry.recursive); | 390 ASSERT_NE(observed_entries->end(), observed_entry_it); |
392 EXPECT_EQ("", observed_entry.last_tag); | 391 |
| 392 EXPECT_EQ(kDirectoryPath, observed_entry_it->second.entry_path.value()); |
| 393 EXPECT_TRUE(observed_entry_it->second.recursive); |
| 394 EXPECT_EQ("", observed_entry_it->second.last_tag); |
393 } | 395 } |
394 | 396 |
395 { | 397 { |
396 // Lastly, create another recursive observer. That should fail, too. | 398 // Lastly, create another recursive observer. That should fail, too. |
397 Log log; | 399 Log log; |
398 provided_file_system_->ObserveDirectory( | 400 provided_file_system_->ObserveDirectory( |
399 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 401 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
400 true /* recursive */, | 402 true /* recursive */, |
401 base::Bind(&LogStatus, base::Unretained(&log))); | 403 base::Bind(&LogStatus, base::Unretained(&log))); |
402 base::RunLoop().RunUntilIdle(); | 404 base::RunLoop().RunUntilIdle(); |
(...skipping 10 matching lines...) Expand all Loading... |
413 TEST_F(FileSystemProviderProvidedFileSystemTest, UnobserveEntry) { | 415 TEST_F(FileSystemProviderProvidedFileSystemTest, UnobserveEntry) { |
414 Observer observer; | 416 Observer observer; |
415 provided_file_system_->AddObserver(&observer); | 417 provided_file_system_->AddObserver(&observer); |
416 | 418 |
417 { | 419 { |
418 // First, confirm that unobserving an entry which is not observed, results | 420 // First, confirm that unobserving an entry which is not observed, results |
419 // in an error. | 421 // in an error. |
420 Log log; | 422 Log log; |
421 provided_file_system_->UnobserveEntry( | 423 provided_file_system_->UnobserveEntry( |
422 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 424 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
| 425 false /* recursive */, |
423 base::Bind(&LogStatus, base::Unretained(&log))); | 426 base::Bind(&LogStatus, base::Unretained(&log))); |
424 base::RunLoop().RunUntilIdle(); | 427 base::RunLoop().RunUntilIdle(); |
425 | 428 |
426 ASSERT_EQ(1u, log.size()); | 429 ASSERT_EQ(1u, log.size()); |
427 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); | 430 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); |
428 EXPECT_EQ(0, observer.list_changed_counter()); | 431 EXPECT_EQ(0, observer.list_changed_counter()); |
429 EXPECT_EQ(0, observer.tag_updated_counter()); | 432 EXPECT_EQ(0, observer.tag_updated_counter()); |
430 } | 433 } |
431 | 434 |
432 { | 435 { |
(...skipping 13 matching lines...) Expand all Loading... |
446 ObservedEntries* const observed_entries = | 449 ObservedEntries* const observed_entries = |
447 provided_file_system_->GetObservedEntries(); | 450 provided_file_system_->GetObservedEntries(); |
448 EXPECT_EQ(1u, observed_entries->size()); | 451 EXPECT_EQ(1u, observed_entries->size()); |
449 } | 452 } |
450 | 453 |
451 { | 454 { |
452 // Unobserve it gracefully. | 455 // Unobserve it gracefully. |
453 Log log; | 456 Log log; |
454 provided_file_system_->UnobserveEntry( | 457 provided_file_system_->UnobserveEntry( |
455 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 458 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
| 459 false /* recursive */, |
456 base::Bind(&LogStatus, base::Unretained(&log))); | 460 base::Bind(&LogStatus, base::Unretained(&log))); |
457 base::RunLoop().RunUntilIdle(); | 461 base::RunLoop().RunUntilIdle(); |
458 | 462 |
459 ASSERT_EQ(1u, log.size()); | 463 ASSERT_EQ(1u, log.size()); |
460 EXPECT_EQ(base::File::FILE_OK, log[0]); | 464 EXPECT_EQ(base::File::FILE_OK, log[0]); |
461 EXPECT_EQ(2, observer.list_changed_counter()); | 465 EXPECT_EQ(2, observer.list_changed_counter()); |
462 EXPECT_EQ(0, observer.tag_updated_counter()); | 466 EXPECT_EQ(0, observer.tag_updated_counter()); |
463 | 467 |
464 ObservedEntries* const observed_entries = | 468 ObservedEntries* const observed_entries = |
465 provided_file_system_->GetObservedEntries(); | 469 provided_file_system_->GetObservedEntries(); |
(...skipping 21 matching lines...) Expand all Loading... |
487 | 491 |
488 { | 492 { |
489 // Finally, unobserve it, but with an error from extension. That should | 493 // Finally, unobserve it, but with an error from extension. That should |
490 // result | 494 // result |
491 // in a removed observer, anyway. | 495 // in a removed observer, anyway. |
492 event_router_->set_reply_result(base::File::FILE_ERROR_FAILED); | 496 event_router_->set_reply_result(base::File::FILE_ERROR_FAILED); |
493 | 497 |
494 Log log; | 498 Log log; |
495 provided_file_system_->UnobserveEntry( | 499 provided_file_system_->UnobserveEntry( |
496 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 500 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
| 501 false /* recursive */, |
497 base::Bind(&LogStatus, base::Unretained(&log))); | 502 base::Bind(&LogStatus, base::Unretained(&log))); |
498 base::RunLoop().RunUntilIdle(); | 503 base::RunLoop().RunUntilIdle(); |
499 | 504 |
500 ASSERT_EQ(1u, log.size()); | 505 ASSERT_EQ(1u, log.size()); |
501 EXPECT_EQ(base::File::FILE_ERROR_FAILED, log[0]); | 506 EXPECT_EQ(base::File::FILE_ERROR_FAILED, log[0]); |
502 EXPECT_EQ(4, observer.list_changed_counter()); | 507 EXPECT_EQ(4, observer.list_changed_counter()); |
503 EXPECT_EQ(0, observer.tag_updated_counter()); | 508 EXPECT_EQ(0, observer.tag_updated_counter()); |
504 | 509 |
505 ObservedEntries* const observed_entries = | 510 ObservedEntries* const observed_entries = |
506 provided_file_system_->GetObservedEntries(); | 511 provided_file_system_->GetObservedEntries(); |
(...skipping 28 matching lines...) Expand all Loading... |
535 EXPECT_EQ("", observed_entries->begin()->second.last_tag); | 540 EXPECT_EQ("", observed_entries->begin()->second.last_tag); |
536 } | 541 } |
537 | 542 |
538 { | 543 { |
539 // Notify about a change. | 544 // Notify about a change. |
540 const ProvidedFileSystemObserver::ChangeType change_type = | 545 const ProvidedFileSystemObserver::ChangeType change_type = |
541 ProvidedFileSystemObserver::CHANGED; | 546 ProvidedFileSystemObserver::CHANGED; |
542 const std::string tag = "hello-world"; | 547 const std::string tag = "hello-world"; |
543 EXPECT_TRUE(provided_file_system_->Notify( | 548 EXPECT_TRUE(provided_file_system_->Notify( |
544 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 549 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
| 550 false /* recursive */, |
545 change_type, | 551 change_type, |
546 make_scoped_ptr(new ProvidedFileSystemObserver::ChildChanges), | 552 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
547 tag)); | 553 tag)); |
548 | 554 |
549 // Verify the observer event. | 555 // Verify the observer event. |
550 ASSERT_EQ(1u, observer.change_events().size()); | 556 ASSERT_EQ(1u, observer.change_events().size()); |
551 const Observer::ChangeEvent* const change_event = | 557 const Observer::ChangeEvent* const change_event = |
552 observer.change_events()[0]; | 558 observer.change_events()[0]; |
553 EXPECT_EQ(change_type, change_event->change_type()); | 559 EXPECT_EQ(change_type, change_event->change_type()); |
554 EXPECT_EQ(0u, change_event->child_changes().size()); | 560 EXPECT_EQ(0u, change_event->changes().size()); |
555 | 561 |
556 // The tag should not be updated in advance, before all observers handle | 562 // The tag should not be updated in advance, before all observers handle |
557 // the notification. | 563 // the notification. |
558 ObservedEntries* const observed_entries = | 564 ObservedEntries* const observed_entries = |
559 provided_file_system_->GetObservedEntries(); | 565 provided_file_system_->GetObservedEntries(); |
560 EXPECT_EQ(1u, observed_entries->size()); | 566 EXPECT_EQ(1u, observed_entries->size()); |
561 provided_file_system_->GetObservedEntries(); | 567 provided_file_system_->GetObservedEntries(); |
562 EXPECT_EQ("", observed_entries->begin()->second.last_tag); | 568 EXPECT_EQ("", observed_entries->begin()->second.last_tag); |
563 | 569 |
564 // Wait until all observers finish handling the notification. | 570 // Wait until all observers finish handling the notification. |
565 base::RunLoop().RunUntilIdle(); | 571 base::RunLoop().RunUntilIdle(); |
566 | 572 |
567 // Confirm, that the entry is still being observed, and that the tag is | 573 // Confirm, that the entry is still being observed, and that the tag is |
568 // updated. | 574 // updated. |
569 ASSERT_EQ(1u, observed_entries->size()); | 575 ASSERT_EQ(1u, observed_entries->size()); |
570 EXPECT_EQ(tag, observed_entries->begin()->second.last_tag); | 576 EXPECT_EQ(tag, observed_entries->begin()->second.last_tag); |
571 EXPECT_EQ(1, observer.list_changed_counter()); | 577 EXPECT_EQ(1, observer.list_changed_counter()); |
572 EXPECT_EQ(1, observer.tag_updated_counter()); | 578 EXPECT_EQ(1, observer.tag_updated_counter()); |
573 } | 579 } |
574 | 580 |
575 { | 581 { |
576 // Notify about deleting of the observed entry. | 582 // Notify about deleting of the observed entry. |
577 const ProvidedFileSystemObserver::ChangeType change_type = | 583 const ProvidedFileSystemObserver::ChangeType change_type = |
578 ProvidedFileSystemObserver::DELETED; | 584 ProvidedFileSystemObserver::DELETED; |
579 const ProvidedFileSystemObserver::ChildChanges child_changes; | 585 const ProvidedFileSystemObserver::Changes changes; |
580 const std::string tag = "chocolate-disco"; | 586 const std::string tag = "chocolate-disco"; |
581 EXPECT_TRUE(provided_file_system_->Notify( | 587 EXPECT_TRUE(provided_file_system_->Notify( |
582 base::FilePath::FromUTF8Unsafe(kDirectoryPath), | 588 base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
| 589 false /* recursive */, |
583 change_type, | 590 change_type, |
584 make_scoped_ptr(new ProvidedFileSystemObserver::ChildChanges), | 591 make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
585 tag)); | 592 tag)); |
586 base::RunLoop().RunUntilIdle(); | 593 base::RunLoop().RunUntilIdle(); |
587 | 594 |
588 // Verify the observer event. | 595 // Verify the observer event. |
589 ASSERT_EQ(2u, observer.change_events().size()); | 596 ASSERT_EQ(2u, observer.change_events().size()); |
590 const Observer::ChangeEvent* const change_event = | 597 const Observer::ChangeEvent* const change_event = |
591 observer.change_events()[1]; | 598 observer.change_events()[1]; |
592 EXPECT_EQ(change_type, change_event->change_type()); | 599 EXPECT_EQ(change_type, change_event->change_type()); |
593 EXPECT_EQ(0u, change_event->child_changes().size()); | 600 EXPECT_EQ(0u, change_event->changes().size()); |
594 } | 601 } |
595 | 602 |
596 // Confirm, that the entry is not observed anymore. | 603 // Confirm, that the entry is not observed anymore. |
597 { | 604 { |
598 ObservedEntries* const observed_entries = | 605 ObservedEntries* const observed_entries = |
599 provided_file_system_->GetObservedEntries(); | 606 provided_file_system_->GetObservedEntries(); |
600 EXPECT_EQ(0u, observed_entries->size()); | 607 EXPECT_EQ(0u, observed_entries->size()); |
601 EXPECT_EQ(2, observer.list_changed_counter()); | 608 EXPECT_EQ(2, observer.list_changed_counter()); |
602 EXPECT_EQ(2, observer.tag_updated_counter()); | 609 EXPECT_EQ(2, observer.tag_updated_counter()); |
603 } | 610 } |
604 | 611 |
605 provided_file_system_->RemoveObserver(&observer); | 612 provided_file_system_->RemoveObserver(&observer); |
606 } | 613 } |
607 | 614 |
608 } // namespace file_system_provider | 615 } // namespace file_system_provider |
609 } // namespace chromeos | 616 } // namespace chromeos |
OLD | NEW |