Index: chrome/browser/chromeos/file_system_provider/provided_file_system_unittest.cc |
diff --git a/chrome/browser/chromeos/file_system_provider/provided_file_system_unittest.cc b/chrome/browser/chromeos/file_system_provider/provided_file_system_unittest.cc |
index 1974510d9dbc51ca0d11f9afbb169885e87c85b9..905458dc7fe39b595ed6339be664b1726a8464a0 100644 |
--- a/chrome/browser/chromeos/file_system_provider/provided_file_system_unittest.cc |
+++ b/chrome/browser/chromeos/file_system_provider/provided_file_system_unittest.cc |
@@ -26,6 +26,7 @@ |
#include "chrome/test/base/testing_profile.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "extensions/browser/event_router.h" |
+#include "storage/browser/fileapi/watcher_manager.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace chromeos { |
@@ -103,12 +104,12 @@ class Observer : public ProvidedFileSystemObserver { |
public: |
class ChangeEvent { |
public: |
- ChangeEvent(ProvidedFileSystemObserver::ChangeType change_type, |
+ ChangeEvent(storage::WatcherManager::ChangeType change_type, |
const ProvidedFileSystemObserver::Changes& changes) |
: change_type_(change_type), changes_(changes) {} |
virtual ~ChangeEvent() {} |
- ProvidedFileSystemObserver::ChangeType change_type() const { |
+ storage::WatcherManager::ChangeType change_type() const { |
return change_type_; |
} |
const ProvidedFileSystemObserver::Changes& changes() const { |
@@ -116,7 +117,7 @@ class Observer : public ProvidedFileSystemObserver { |
} |
private: |
- const ProvidedFileSystemObserver::ChangeType change_type_; |
+ const storage::WatcherManager::ChangeType change_type_; |
const ProvidedFileSystemObserver::Changes changes_; |
DISALLOW_COPY_AND_ASSIGN(ChangeEvent); |
@@ -128,7 +129,7 @@ class Observer : public ProvidedFileSystemObserver { |
virtual void OnWatcherChanged( |
const ProvidedFileSystemInfo& file_system_info, |
const Watcher& watcher, |
- ProvidedFileSystemObserver::ChangeType change_type, |
+ storage::WatcherManager::ChangeType change_type, |
const ProvidedFileSystemObserver::Changes& changes, |
const base::Closure& callback) override { |
EXPECT_EQ(kFileSystemId, file_system_info.file_system_id()); |
@@ -181,12 +182,19 @@ class StubNotificationManager : public NotificationManagerInterface { |
}; |
typedef std::vector<base::File::Error> Log; |
+typedef std::vector<storage::WatcherManager::ChangeType> NotificationLog; |
// Writes a |result| to the |log| vector. |
void LogStatus(Log* log, base::File::Error result) { |
log->push_back(result); |
} |
+// Writes an |change_type| to the |notification_log| vector. |
+void LogNotification(NotificationLog* notification_log, |
+ storage::WatcherManager::ChangeType change_type) { |
+ notification_log->push_back(change_type); |
+} |
+ |
} // namespace |
class FileSystemProviderProvidedFileSystemTest : public testing::Test { |
@@ -280,6 +288,7 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AutoUpdater_CallbackIgnored) { |
TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_NotFound) { |
Log log; |
+ NotificationLog notification_log; |
Observer observer; |
provided_file_system_->AddObserver(&observer); |
@@ -292,12 +301,14 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_NotFound) { |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
false /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
// The directory should not become watched because of an error. |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, log[0]); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
EXPECT_EQ(0u, watchers->size()); |
@@ -320,7 +331,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher) { |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ storage::WatcherManager::NotificationCallback()); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
@@ -339,41 +351,73 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher) { |
} |
TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_PersistentIllegal) { |
- Log log; |
- Observer observer; |
+ { |
+ // Adding a persistent watcher with a notification callback is not allowed, |
+ // as it's basically impossible to restore the callback after a shutdown. |
+ Log log; |
+ NotificationLog notification_log; |
- // Create a provided file system interface, which does not support a notify |
- // tag, though. |
- const base::FilePath mount_path = |
- util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); |
- MountOptions mount_options; |
- mount_options.file_system_id = kFileSystemId; |
- mount_options.display_name = kDisplayName; |
- mount_options.supports_notify_tag = false; |
- ProvidedFileSystemInfo file_system_info( |
- kExtensionId, mount_options, mount_path); |
- ProvidedFileSystem simple_provided_file_system(profile_.get(), |
- file_system_info); |
- simple_provided_file_system.SetEventRouterForTesting(event_router_.get()); |
- simple_provided_file_system.SetNotificationManagerForTesting( |
- make_scoped_ptr(new StubNotificationManager)); |
- |
- simple_provided_file_system.AddObserver(&observer); |
- |
- simple_provided_file_system.AddWatcher( |
- GURL(kOrigin), |
- base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
- false /* recursive */, |
- true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
- base::RunLoop().RunUntilIdle(); |
+ Observer observer; |
+ provided_file_system_->AddObserver(&observer); |
- ASSERT_EQ(1u, log.size()); |
- EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]); |
- EXPECT_EQ(0, observer.list_changed_counter()); |
- EXPECT_EQ(0, observer.tag_updated_counter()); |
+ provided_file_system_->AddWatcher( |
+ GURL(kOrigin), |
+ base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
+ false /* recursive */, |
+ true /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ ASSERT_EQ(1u, log.size()); |
+ EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]); |
+ EXPECT_EQ(0, observer.list_changed_counter()); |
+ EXPECT_EQ(0, observer.tag_updated_counter()); |
+ |
+ provided_file_system_->RemoveObserver(&observer); |
+ } |
+ |
+ { |
+ // Adding a persistent watcher is not allowed if the file system doesn't |
+ // support the notify tag. It's because the notify tag is essential to be |
+ // able to recreate notification during shutdown. |
+ Log log; |
+ Observer observer; |
+ |
+ // Create a provided file system interface, which does not support a notify |
+ // tag, though. |
+ const base::FilePath mount_path = |
+ util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); |
+ MountOptions mount_options; |
+ mount_options.file_system_id = kFileSystemId; |
+ mount_options.display_name = kDisplayName; |
+ mount_options.supports_notify_tag = false; |
+ ProvidedFileSystemInfo file_system_info( |
+ kExtensionId, mount_options, mount_path); |
+ ProvidedFileSystem simple_provided_file_system(profile_.get(), |
+ file_system_info); |
+ simple_provided_file_system.SetEventRouterForTesting(event_router_.get()); |
+ simple_provided_file_system.SetNotificationManagerForTesting( |
+ make_scoped_ptr(new StubNotificationManager)); |
- simple_provided_file_system.RemoveObserver(&observer); |
+ simple_provided_file_system.AddObserver(&observer); |
+ |
+ simple_provided_file_system.AddWatcher( |
+ GURL(kOrigin), |
+ base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
+ false /* recursive */, |
+ true /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ storage::WatcherManager::NotificationCallback()); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ ASSERT_EQ(1u, log.size()); |
+ EXPECT_EQ(base::File::FILE_ERROR_INVALID_OPERATION, log[0]); |
+ EXPECT_EQ(0, observer.list_changed_counter()); |
+ EXPECT_EQ(0, observer.tag_updated_counter()); |
+ |
+ simple_provided_file_system.RemoveObserver(&observer); |
+ } |
} |
TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_Exists) { |
@@ -388,7 +432,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_Exists) { |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ storage::WatcherManager::NotificationCallback()); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
@@ -420,7 +465,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_Exists) { |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ storage::WatcherManager::NotificationCallback()); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
@@ -437,7 +483,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_Exists) { |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
true /* recursive */, |
true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ storage::WatcherManager::NotificationCallback()); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
@@ -456,18 +503,22 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_MultipleOrigins) { |
{ |
// First watch a directory not recursively. |
Log log; |
+ NotificationLog notification_log; |
+ |
provided_file_system_->AddWatcher( |
GURL(kOrigin), |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
false /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_OK, log[0]); |
EXPECT_EQ(1, observer.list_changed_counter()); |
EXPECT_EQ(0, observer.tag_updated_counter()); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
ASSERT_TRUE(watchers); |
@@ -489,18 +540,22 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, AddWatcher_MultipleOrigins) { |
{ |
// Create another watcher, but recursive and with a different origin. |
Log log; |
+ NotificationLog notification_log; |
+ |
provided_file_system_->AddWatcher( |
GURL(kAnotherOrigin), |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
true /* recursive */, |
- true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ false /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_OK, log[0]); |
EXPECT_EQ(2, observer.list_changed_counter()); |
EXPECT_EQ(0, observer.tag_updated_counter()); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
ASSERT_TRUE(watchers); |
@@ -578,18 +633,22 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, RemoveWatcher) { |
{ |
// Watch a directory not recursively. |
Log log; |
+ NotificationLog notification_log; |
+ |
provided_file_system_->AddWatcher( |
GURL(kOrigin), |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
- true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ false /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_OK, log[0]); |
EXPECT_EQ(1, observer.list_changed_counter()); |
EXPECT_EQ(0, observer.tag_updated_counter()); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
EXPECT_EQ(1u, watchers->size()); |
@@ -617,18 +676,22 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, RemoveWatcher) { |
{ |
// Confirm that it's possible to watch it again. |
Log log; |
+ NotificationLog notification_log; |
+ |
provided_file_system_->AddWatcher( |
GURL(kOrigin), |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
- true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ false /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_OK, log[0]); |
EXPECT_EQ(3, observer.list_changed_counter()); |
EXPECT_EQ(0, observer.tag_updated_counter()); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
EXPECT_EQ(1u, watchers->size()); |
@@ -662,22 +725,26 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, RemoveWatcher) { |
TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
Observer observer; |
provided_file_system_->AddObserver(&observer); |
+ NotificationLog notification_log; |
{ |
// Watch a directory. |
Log log; |
+ |
provided_file_system_->AddWatcher( |
GURL(kOrigin), |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
false /* recursive */, |
- true /* persistent */, |
- base::Bind(&LogStatus, base::Unretained(&log))); |
+ false /* persistent */, |
+ base::Bind(&LogStatus, base::Unretained(&log)), |
+ base::Bind(&LogNotification, base::Unretained(¬ification_log))); |
base::RunLoop().RunUntilIdle(); |
ASSERT_EQ(1u, log.size()); |
EXPECT_EQ(base::File::FILE_OK, log[0]); |
EXPECT_EQ(1, observer.list_changed_counter()); |
EXPECT_EQ(0, observer.tag_updated_counter()); |
+ EXPECT_EQ(0u, notification_log.size()); |
Watchers* const watchers = provided_file_system_->GetWatchers(); |
EXPECT_EQ(1u, watchers->size()); |
@@ -687,8 +754,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
{ |
// Notify about a change. |
- const ProvidedFileSystemObserver::ChangeType change_type = |
- ProvidedFileSystemObserver::CHANGED; |
+ const storage::WatcherManager::ChangeType change_type = |
+ storage::WatcherManager::CHANGED; |
const std::string tag = "hello-world"; |
EXPECT_TRUE(provided_file_system_->Notify( |
base::FilePath::FromUTF8Unsafe(kDirectoryPath), |
@@ -697,6 +764,10 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
make_scoped_ptr(new ProvidedFileSystemObserver::Changes), |
tag)); |
+ // Confirm that the notification callback was called. |
+ ASSERT_EQ(1u, notification_log.size()); |
+ EXPECT_EQ(change_type, notification_log[0]); |
+ |
// Verify the observer event. |
ASSERT_EQ(1u, observer.change_events().size()); |
const Observer::ChangeEvent* const change_event = |
@@ -723,8 +794,8 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
{ |
// Notify about deleting of the watched entry. |
- const ProvidedFileSystemObserver::ChangeType change_type = |
- ProvidedFileSystemObserver::DELETED; |
+ const storage::WatcherManager::ChangeType change_type = |
+ storage::WatcherManager::DELETED; |
const ProvidedFileSystemObserver::Changes changes; |
const std::string tag = "chocolate-disco"; |
EXPECT_TRUE(provided_file_system_->Notify( |
@@ -735,6 +806,10 @@ TEST_F(FileSystemProviderProvidedFileSystemTest, Notify) { |
tag)); |
base::RunLoop().RunUntilIdle(); |
+ // Confirm that the notification callback was called. |
+ ASSERT_EQ(2u, notification_log.size()); |
+ EXPECT_EQ(change_type, notification_log[1]); |
+ |
// Verify the observer event. |
ASSERT_EQ(2u, observer.change_events().size()); |
const Observer::ChangeEvent* const change_event = |