| 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/service.h" | 5 #include "chrome/browser/chromeos/file_system_provider/service.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" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/memory/scoped_ptr.h" | 12 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/strings/string_number_conversions.h" | 13 #include "base/strings/string_number_conversions.h" |
| 14 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system
.h" | 14 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system
.h" |
| 15 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" | 15 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" |
| 16 #include "chrome/browser/chromeos/file_system_provider/observer.h" | 16 #include "chrome/browser/chromeos/file_system_provider/observer.h" |
| 17 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info
.h" | 17 #include "chrome/browser/chromeos/file_system_provider/provided_file_system_info
.h" |
| 18 #include "chrome/browser/chromeos/file_system_provider/registry_interface.h" |
| 18 #include "chrome/browser/chromeos/login/users/fake_user_manager.h" | 19 #include "chrome/browser/chromeos/login/users/fake_user_manager.h" |
| 19 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" | 20 #include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h" |
| 20 #include "chrome/common/pref_names.h" | 21 #include "chrome/common/pref_names.h" |
| 21 #include "chrome/test/base/testing_browser_process.h" | 22 #include "chrome/test/base/testing_browser_process.h" |
| 22 #include "chrome/test/base/testing_pref_service_syncable.h" | 23 #include "chrome/test/base/testing_pref_service_syncable.h" |
| 23 #include "chrome/test/base/testing_profile.h" | 24 #include "chrome/test/base/testing_profile.h" |
| 24 #include "chrome/test/base/testing_profile_manager.h" | 25 #include "chrome/test/base/testing_profile_manager.h" |
| 25 #include "components/user_prefs/user_prefs.h" | 26 #include "components/user_prefs/user_prefs.h" |
| 26 #include "content/public/test/test_browser_thread_bundle.h" | 27 #include "content/public/test/test_browser_thread_bundle.h" |
| 27 #include "extensions/browser/extension_registry.h" | 28 #include "extensions/browser/extension_registry.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 virtual void OnProvidedFileSystemUnmount( | 76 virtual void OnProvidedFileSystemUnmount( |
| 76 const ProvidedFileSystemInfo& file_system_info, | 77 const ProvidedFileSystemInfo& file_system_info, |
| 77 base::File::Error error) override { | 78 base::File::Error error) override { |
| 78 unmounts.push_back(Event(file_system_info, error)); | 79 unmounts.push_back(Event(file_system_info, error)); |
| 79 } | 80 } |
| 80 | 81 |
| 81 std::vector<Event> mounts; | 82 std::vector<Event> mounts; |
| 82 std::vector<Event> unmounts; | 83 std::vector<Event> unmounts; |
| 83 }; | 84 }; |
| 84 | 85 |
| 86 // Fake implementation of the registry, since it's already tested separately. |
| 87 // For simplicity it can remember at most only one file system. |
| 88 class FakeRegistry : public RegistryInterface { |
| 89 public: |
| 90 FakeRegistry() {} |
| 91 virtual ~FakeRegistry() {} |
| 92 |
| 93 // RegistryInterface overrides. |
| 94 virtual void RememberFileSystem( |
| 95 const ProvidedFileSystemInfo& file_system_info, |
| 96 const ObservedEntries& observed_entries) override { |
| 97 file_system_info_.reset(new ProvidedFileSystemInfo(file_system_info)); |
| 98 observed_entries_.reset(new ObservedEntries(observed_entries)); |
| 99 } |
| 100 |
| 101 virtual void ForgetFileSystem(const std::string& extension_id, |
| 102 const std::string& file_system_id) override { |
| 103 if (!file_system_info_.get() || !observed_entries_.get()) |
| 104 return; |
| 105 if (file_system_info_->extension_id() == extension_id && |
| 106 file_system_info_->file_system_id() == file_system_id) { |
| 107 file_system_info_.reset(); |
| 108 observed_entries_.reset(); |
| 109 } |
| 110 } |
| 111 |
| 112 virtual scoped_ptr<RestoredFileSystems> RestoreFileSystems( |
| 113 const std::string& extension_id) override { |
| 114 scoped_ptr<RestoredFileSystems> result(new RestoredFileSystems); |
| 115 |
| 116 if (file_system_info_.get() && observed_entries_.get()) { |
| 117 RestoredFileSystem restored_file_system; |
| 118 restored_file_system.extension_id = file_system_info_->extension_id(); |
| 119 |
| 120 MountOptions options; |
| 121 options.file_system_id = file_system_info_->file_system_id(); |
| 122 options.display_name = file_system_info_->display_name(); |
| 123 options.writable = file_system_info_->writable(); |
| 124 options.supports_notify_tag = file_system_info_->supports_notify_tag(); |
| 125 restored_file_system.options = options; |
| 126 restored_file_system.observed_entries = *observed_entries_.get(); |
| 127 |
| 128 result->push_back(restored_file_system); |
| 129 } |
| 130 |
| 131 return result; |
| 132 } |
| 133 |
| 134 virtual void UpdateObservedEntryTag( |
| 135 const ProvidedFileSystemInfo& file_system_info, |
| 136 const ObservedEntry& observed_entry) override { |
| 137 ASSERT_TRUE(observed_entries_.get()); |
| 138 const ObservedEntries::iterator it = |
| 139 observed_entries_->find(observed_entry.entry_path); |
| 140 ASSERT_NE(observed_entries_->end(), it); |
| 141 it->second.last_tag = observed_entry.last_tag; |
| 142 } |
| 143 |
| 144 ProvidedFileSystemInfo* const file_system_info() const { |
| 145 return file_system_info_.get(); |
| 146 } |
| 147 ObservedEntries* const observed_entries() const { |
| 148 return observed_entries_.get(); |
| 149 } |
| 150 |
| 151 private: |
| 152 scoped_ptr<ProvidedFileSystemInfo> file_system_info_; |
| 153 scoped_ptr<ObservedEntries> observed_entries_; |
| 154 |
| 155 DISALLOW_COPY_AND_ASSIGN(FakeRegistry); |
| 156 }; |
| 157 |
| 85 // Creates a fake extension with the specified |extension_id|. | 158 // Creates a fake extension with the specified |extension_id|. |
| 86 scoped_refptr<extensions::Extension> CreateFakeExtension( | 159 scoped_refptr<extensions::Extension> CreateFakeExtension( |
| 87 const std::string& extension_id) { | 160 const std::string& extension_id) { |
| 88 base::DictionaryValue manifest; | 161 base::DictionaryValue manifest; |
| 89 std::string error; | 162 std::string error; |
| 90 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, | 163 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, |
| 91 "1.0.0.0"); | 164 "1.0.0.0"); |
| 92 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName, | 165 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName, |
| 93 "unused"); | 166 "unused"); |
| 94 return extensions::Extension::Create(base::FilePath(), | 167 return extensions::Extension::Create(base::FilePath(), |
| 95 extensions::Manifest::UNPACKED, | 168 extensions::Manifest::UNPACKED, |
| 96 manifest, | 169 manifest, |
| 97 extensions::Extension::NO_FLAGS, | 170 extensions::Extension::NO_FLAGS, |
| 98 extension_id, | 171 extension_id, |
| 99 &error); | 172 &error); |
| 100 } | 173 } |
| 101 | 174 |
| 102 // Stores a provided file system information in preferences together with a | |
| 103 // fake observed entry. | |
| 104 void RememberFakeFileSystem(TestingProfile* profile, | |
| 105 const std::string& extension_id, | |
| 106 const std::string& file_system_id, | |
| 107 const std::string& display_name, | |
| 108 bool writable, | |
| 109 bool supports_notify_tag, | |
| 110 const ObservedEntry& observed_entry) { | |
| 111 TestingPrefServiceSyncable* const pref_service = | |
| 112 profile->GetTestingPrefService(); | |
| 113 ASSERT_TRUE(pref_service); | |
| 114 | |
| 115 base::DictionaryValue extensions; | |
| 116 base::DictionaryValue* file_systems = new base::DictionaryValue(); | |
| 117 base::DictionaryValue* file_system = new base::DictionaryValue(); | |
| 118 file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId, | |
| 119 kFileSystemId); | |
| 120 file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName, kDisplayName); | |
| 121 file_system->SetBooleanWithoutPathExpansion(kPrefKeyWritable, writable); | |
| 122 file_system->SetBooleanWithoutPathExpansion(kPrefKeySupportsNotifyTag, | |
| 123 supports_notify_tag); | |
| 124 file_systems->SetWithoutPathExpansion(kFileSystemId, file_system); | |
| 125 extensions.SetWithoutPathExpansion(kExtensionId, file_systems); | |
| 126 | |
| 127 // Remember observed entries. | |
| 128 base::DictionaryValue* const observed_entries = new base::DictionaryValue(); | |
| 129 file_system->SetWithoutPathExpansion(kPrefKeyObservedEntries, | |
| 130 observed_entries); | |
| 131 base::DictionaryValue* const observed_entry_value = | |
| 132 new base::DictionaryValue(); | |
| 133 observed_entries->SetWithoutPathExpansion(observed_entry.entry_path.value(), | |
| 134 observed_entry_value); | |
| 135 observed_entry_value->SetStringWithoutPathExpansion( | |
| 136 kPrefKeyObservedEntryEntryPath, observed_entry.entry_path.value()); | |
| 137 observed_entry_value->SetBooleanWithoutPathExpansion( | |
| 138 kPrefKeyObservedEntryRecursive, observed_entry.recursive); | |
| 139 observed_entry_value->SetStringWithoutPathExpansion( | |
| 140 kPrefKeyObservedEntryLastTag, observed_entry.last_tag); | |
| 141 | |
| 142 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); | |
| 143 } | |
| 144 | |
| 145 } // namespace | 175 } // namespace |
| 146 | 176 |
| 147 class FileSystemProviderServiceTest : public testing::Test { | 177 class FileSystemProviderServiceTest : public testing::Test { |
| 148 protected: | 178 protected: |
| 149 FileSystemProviderServiceTest() : profile_(NULL) {} | 179 FileSystemProviderServiceTest() : profile_(NULL) {} |
| 150 | 180 |
| 151 virtual ~FileSystemProviderServiceTest() {} | 181 virtual ~FileSystemProviderServiceTest() {} |
| 152 | 182 |
| 153 virtual void SetUp() override { | 183 virtual void SetUp() override { |
| 154 profile_manager_.reset( | 184 profile_manager_.reset( |
| 155 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); | 185 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
| 156 ASSERT_TRUE(profile_manager_->SetUp()); | 186 ASSERT_TRUE(profile_manager_->SetUp()); |
| 157 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); | 187 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); |
| 158 user_manager_ = new FakeUserManager(); | 188 user_manager_ = new FakeUserManager(); |
| 159 user_manager_->AddUser(profile_->GetProfileName()); | 189 user_manager_->AddUser(profile_->GetProfileName()); |
| 160 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); | 190 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); |
| 161 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); | 191 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); |
| 192 |
| 162 service_.reset(new Service(profile_, extension_registry_.get())); | 193 service_.reset(new Service(profile_, extension_registry_.get())); |
| 163 service_->SetFileSystemFactoryForTesting( | 194 service_->SetFileSystemFactoryForTesting( |
| 164 base::Bind(&FakeProvidedFileSystem::Create)); | 195 base::Bind(&FakeProvidedFileSystem::Create)); |
| 165 extension_ = CreateFakeExtension(kExtensionId); | 196 extension_ = CreateFakeExtension(kExtensionId); |
| 197 |
| 198 registry_ = new FakeRegistry; |
| 199 // Passes ownership to the service instance. |
| 200 service_->SetRegistryForTesting(make_scoped_ptr(registry_)); |
| 201 |
| 166 fake_observed_entry_.entry_path = | 202 fake_observed_entry_.entry_path = |
| 167 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); | 203 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); |
| 168 fake_observed_entry_.recursive = true; | 204 fake_observed_entry_.recursive = true; |
| 169 fake_observed_entry_.last_tag = "hello-world"; | 205 fake_observed_entry_.last_tag = "hello-world"; |
| 170 } | 206 } |
| 171 | 207 |
| 172 content::TestBrowserThreadBundle thread_bundle_; | 208 content::TestBrowserThreadBundle thread_bundle_; |
| 173 scoped_ptr<TestingProfileManager> profile_manager_; | 209 scoped_ptr<TestingProfileManager> profile_manager_; |
| 174 TestingProfile* profile_; | 210 TestingProfile* profile_; |
| 175 FakeUserManager* user_manager_; | 211 FakeUserManager* user_manager_; |
| 176 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 212 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
| 177 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 213 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
| 178 scoped_ptr<Service> service_; | 214 scoped_ptr<Service> service_; |
| 179 scoped_refptr<extensions::Extension> extension_; | 215 scoped_refptr<extensions::Extension> extension_; |
| 216 FakeRegistry* registry_; // Owned by Service. |
| 180 ObservedEntry fake_observed_entry_; | 217 ObservedEntry fake_observed_entry_; |
| 181 }; | 218 }; |
| 182 | 219 |
| 183 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 220 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
| 184 LoggingObserver observer; | 221 LoggingObserver observer; |
| 185 service_->AddObserver(&observer); | 222 service_->AddObserver(&observer); |
| 186 | 223 |
| 187 EXPECT_TRUE(service_->MountFileSystem( | 224 EXPECT_TRUE(service_->MountFileSystem( |
| 188 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 225 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 189 | 226 |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); | 386 ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size()); |
| 350 | 387 |
| 351 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 388 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
| 352 service_->GetProvidedFileSystemInfoList(); | 389 service_->GetProvidedFileSystemInfoList(); |
| 353 ASSERT_EQ(1u, file_system_info_list.size()); | 390 ASSERT_EQ(1u, file_system_info_list.size()); |
| 354 | 391 |
| 355 service_->RemoveObserver(&observer); | 392 service_->RemoveObserver(&observer); |
| 356 } | 393 } |
| 357 | 394 |
| 358 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 395 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
| 359 // Create a fake entry in the preferences. | 396 LoggingObserver observer; |
| 360 RememberFakeFileSystem(profile_, | 397 service_->AddObserver(&observer); |
| 361 kExtensionId, | |
| 362 kFileSystemId, | |
| 363 kDisplayName, | |
| 364 true /* writable */, | |
| 365 true /* supports_notify_tag */, | |
| 366 fake_observed_entry_); | |
| 367 | 398 |
| 368 // Create a new service instance in order to load remembered file systems | 399 // Remember a fake file system first in order to be able to restore it. |
| 369 // from preferences. | 400 MountOptions options(kFileSystemId, kDisplayName); |
| 370 scoped_ptr<Service> new_service( | 401 options.supports_notify_tag = true; |
| 371 new Service(profile_, extension_registry_.get())); | 402 ProvidedFileSystemInfo file_system_info( |
| 372 LoggingObserver observer; | 403 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); |
| 373 new_service->AddObserver(&observer); | 404 ObservedEntries fake_observed_entries; |
| 374 | 405 fake_observed_entries[fake_observed_entry_.entry_path] = fake_observed_entry_; |
| 375 new_service->SetFileSystemFactoryForTesting( | 406 registry_->RememberFileSystem(file_system_info, fake_observed_entries); |
| 376 base::Bind(&FakeProvidedFileSystem::Create)); | |
| 377 | 407 |
| 378 EXPECT_EQ(0u, observer.mounts.size()); | 408 EXPECT_EQ(0u, observer.mounts.size()); |
| 379 | 409 |
| 380 // Directly call the observer's method. | 410 // Directly call the observer's method. |
| 381 new_service->OnExtensionLoaded(profile_, extension_.get()); | 411 service_->OnExtensionLoaded(profile_, extension_.get()); |
| 382 | 412 |
| 383 ASSERT_EQ(1u, observer.mounts.size()); | 413 ASSERT_EQ(1u, observer.mounts.size()); |
| 384 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 414 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
| 385 | 415 |
| 386 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); | 416 EXPECT_EQ(file_system_info.extension_id(), |
| 387 EXPECT_EQ(kFileSystemId, | 417 observer.mounts[0].file_system_info().extension_id()); |
| 418 EXPECT_EQ(file_system_info.file_system_id(), |
| 388 observer.mounts[0].file_system_info().file_system_id()); | 419 observer.mounts[0].file_system_info().file_system_id()); |
| 389 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); | 420 EXPECT_EQ(file_system_info.writable(), |
| 390 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); | 421 observer.mounts[0].file_system_info().writable()); |
| 422 EXPECT_EQ(file_system_info.supports_notify_tag(), |
| 423 observer.mounts[0].file_system_info().supports_notify_tag()); |
| 391 | 424 |
| 392 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 425 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
| 393 new_service->GetProvidedFileSystemInfoList(); | 426 service_->GetProvidedFileSystemInfoList(); |
| 394 ASSERT_EQ(1u, file_system_info_list.size()); | 427 ASSERT_EQ(1u, file_system_info_list.size()); |
| 395 | 428 |
| 396 ProvidedFileSystemInterface* const file_system = | 429 ProvidedFileSystemInterface* const file_system = |
| 397 new_service->GetProvidedFileSystem(kExtensionId, kFileSystemId); | 430 service_->GetProvidedFileSystem(kExtensionId, kFileSystemId); |
| 398 ASSERT_TRUE(file_system); | 431 ASSERT_TRUE(file_system); |
| 399 | 432 |
| 400 const ObservedEntries* const observed_entries = | 433 const ObservedEntries* const observed_entries = |
| 401 file_system->GetObservedEntries(); | 434 file_system->GetObservedEntries(); |
| 402 ASSERT_TRUE(observed_entries); | 435 ASSERT_TRUE(observed_entries); |
| 403 ASSERT_EQ(1u, observed_entries->size()); | 436 ASSERT_EQ(1u, observed_entries->size()); |
| 404 | 437 |
| 405 const ObservedEntries::const_iterator restored_observed_entry_it = | 438 const ObservedEntries::const_iterator restored_observed_entry_it = |
| 406 observed_entries->find(fake_observed_entry_.entry_path); | 439 observed_entries->find(fake_observed_entry_.entry_path); |
| 407 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); | 440 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); |
| 408 | 441 |
| 409 EXPECT_EQ(fake_observed_entry_.entry_path, | 442 EXPECT_EQ(fake_observed_entry_.entry_path, |
| 410 restored_observed_entry_it->second.entry_path); | 443 restored_observed_entry_it->second.entry_path); |
| 411 EXPECT_EQ(fake_observed_entry_.recursive, | 444 EXPECT_EQ(fake_observed_entry_.recursive, |
| 412 restored_observed_entry_it->second.recursive); | 445 restored_observed_entry_it->second.recursive); |
| 413 EXPECT_EQ(fake_observed_entry_.last_tag, | 446 EXPECT_EQ(fake_observed_entry_.last_tag, |
| 414 restored_observed_entry_it->second.last_tag); | 447 restored_observed_entry_it->second.last_tag); |
| 415 | 448 |
| 416 new_service->RemoveObserver(&observer); | 449 service_->RemoveObserver(&observer); |
| 417 } | |
| 418 | |
| 419 TEST_F(FileSystemProviderServiceTest, RememberFileSystem) { | |
| 420 MountOptions options(kFileSystemId, kDisplayName); | |
| 421 options.writable = true; | |
| 422 options.supports_notify_tag = true; | |
| 423 | |
| 424 ProvidedFileSystemInfo file_system_info( | |
| 425 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); | |
| 426 | |
| 427 ObservedEntries observed_entries; | |
| 428 observed_entries[fake_observed_entry_.entry_path] = fake_observed_entry_; | |
| 429 | |
| 430 service_->RememberFileSystem(file_system_info, observed_entries); | |
| 431 | |
| 432 TestingPrefServiceSyncable* const pref_service = | |
| 433 profile_->GetTestingPrefService(); | |
| 434 ASSERT_TRUE(pref_service); | |
| 435 | |
| 436 const base::DictionaryValue* const extensions = | |
| 437 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | |
| 438 ASSERT_TRUE(extensions); | |
| 439 | |
| 440 const base::DictionaryValue* file_systems = NULL; | |
| 441 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 442 &file_systems)); | |
| 443 EXPECT_EQ(1u, file_systems->size()); | |
| 444 | |
| 445 const base::Value* file_system_value = NULL; | |
| 446 const base::DictionaryValue* file_system = NULL; | |
| 447 ASSERT_TRUE( | |
| 448 file_systems->GetWithoutPathExpansion(kFileSystemId, &file_system_value)); | |
| 449 ASSERT_TRUE(file_system_value->GetAsDictionary(&file_system)); | |
| 450 | |
| 451 std::string file_system_id; | |
| 452 EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId, | |
| 453 &file_system_id)); | |
| 454 EXPECT_EQ(kFileSystemId, file_system_id); | |
| 455 | |
| 456 std::string display_name; | |
| 457 EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName, | |
| 458 &display_name)); | |
| 459 EXPECT_EQ(kDisplayName, display_name); | |
| 460 | |
| 461 bool writable = false; | |
| 462 EXPECT_TRUE( | |
| 463 file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable)); | |
| 464 EXPECT_TRUE(writable); | |
| 465 | |
| 466 bool supports_notify_tag = false; | |
| 467 EXPECT_TRUE(file_system->GetBooleanWithoutPathExpansion( | |
| 468 kPrefKeySupportsNotifyTag, &supports_notify_tag)); | |
| 469 EXPECT_TRUE(supports_notify_tag); | |
| 470 | |
| 471 const base::DictionaryValue* observed_entries_value = NULL; | |
| 472 ASSERT_TRUE(file_system->GetDictionaryWithoutPathExpansion( | |
| 473 kPrefKeyObservedEntries, &observed_entries_value)); | |
| 474 | |
| 475 const base::DictionaryValue* observed_entry = NULL; | |
| 476 ASSERT_TRUE(observed_entries_value->GetDictionaryWithoutPathExpansion( | |
| 477 fake_observed_entry_.entry_path.value(), &observed_entry)); | |
| 478 | |
| 479 std::string entry_path; | |
| 480 EXPECT_TRUE(observed_entry->GetStringWithoutPathExpansion( | |
| 481 kPrefKeyObservedEntryEntryPath, &entry_path)); | |
| 482 EXPECT_EQ(fake_observed_entry_.entry_path.value(), entry_path); | |
| 483 | |
| 484 bool recursive = false; | |
| 485 EXPECT_TRUE(observed_entry->GetBooleanWithoutPathExpansion( | |
| 486 kPrefKeyObservedEntryRecursive, &recursive)); | |
| 487 EXPECT_EQ(fake_observed_entry_.recursive, recursive); | |
| 488 | |
| 489 std::string last_tag; | |
| 490 EXPECT_TRUE(observed_entry->GetStringWithoutPathExpansion( | |
| 491 kPrefKeyObservedEntryLastTag, &last_tag)); | |
| 492 EXPECT_EQ(fake_observed_entry_.last_tag, last_tag); | |
| 493 } | 450 } |
| 494 | 451 |
| 495 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | 452 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { |
| 496 LoggingObserver observer; | 453 LoggingObserver observer; |
| 497 service_->AddObserver(&observer); | 454 service_->AddObserver(&observer); |
| 498 | 455 |
| 499 TestingPrefServiceSyncable* const pref_service = | 456 EXPECT_FALSE(registry_->file_system_info()); |
| 500 profile_->GetTestingPrefService(); | 457 EXPECT_FALSE(registry_->observed_entries()); |
| 501 ASSERT_TRUE(pref_service); | |
| 502 | 458 |
| 503 EXPECT_TRUE(service_->MountFileSystem( | 459 EXPECT_TRUE(service_->MountFileSystem( |
| 504 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 460 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 505 ASSERT_EQ(1u, observer.mounts.size()); | 461 ASSERT_EQ(1u, observer.mounts.size()); |
| 506 | 462 |
| 507 const base::DictionaryValue* extensions = | 463 ASSERT_TRUE(registry_->file_system_info()); |
| 508 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 464 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); |
| 509 ASSERT_TRUE(extensions); | 465 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); |
| 510 | 466 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); |
| 511 const base::DictionaryValue* file_systems = NULL; | 467 EXPECT_FALSE(registry_->file_system_info()->writable()); |
| 512 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | 468 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); |
| 513 &file_systems)); | 469 ASSERT_TRUE(registry_->observed_entries()); |
| 514 EXPECT_EQ(1u, file_systems->size()); | |
| 515 | 470 |
| 516 service_->RemoveObserver(&observer); | 471 service_->RemoveObserver(&observer); |
| 517 } | 472 } |
| 518 | 473 |
| 519 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { | 474 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
| 520 LoggingObserver observer; | 475 LoggingObserver observer; |
| 521 service_->AddObserver(&observer); | 476 service_->AddObserver(&observer); |
| 522 | 477 |
| 523 TestingPrefServiceSyncable* const pref_service = | |
| 524 profile_->GetTestingPrefService(); | |
| 525 ASSERT_TRUE(pref_service); | |
| 526 | |
| 527 { | 478 { |
| 479 EXPECT_FALSE(registry_->file_system_info()); |
| 480 EXPECT_FALSE(registry_->observed_entries()); |
| 528 EXPECT_TRUE(service_->MountFileSystem( | 481 EXPECT_TRUE(service_->MountFileSystem( |
| 529 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 482 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 530 ASSERT_EQ(1u, observer.mounts.size()); | |
| 531 | 483 |
| 532 const base::DictionaryValue* extensions = | 484 EXPECT_EQ(1u, observer.mounts.size()); |
| 533 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 485 EXPECT_TRUE(registry_->file_system_info()); |
| 534 ASSERT_TRUE(extensions); | 486 EXPECT_TRUE(registry_->observed_entries()); |
| 535 | |
| 536 const base::DictionaryValue* file_systems = NULL; | |
| 537 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 538 &file_systems)); | |
| 539 EXPECT_EQ(1u, file_systems->size()); | |
| 540 } | 487 } |
| 541 | 488 |
| 542 { | 489 { |
| 543 EXPECT_TRUE(service_->UnmountFileSystem( | 490 EXPECT_TRUE(service_->UnmountFileSystem( |
| 544 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); | 491 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); |
| 545 | 492 |
| 546 const base::DictionaryValue* const extensions = | 493 EXPECT_EQ(1u, observer.unmounts.size()); |
| 547 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 494 EXPECT_TRUE(registry_->file_system_info()); |
| 548 ASSERT_TRUE(extensions); | 495 EXPECT_TRUE(registry_->observed_entries()); |
| 549 | |
| 550 const base::DictionaryValue* file_systems = NULL; | |
| 551 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 552 &file_systems)); | |
| 553 EXPECT_EQ(1u, file_systems->size()); | |
| 554 } | 496 } |
| 555 | 497 |
| 556 service_->RemoveObserver(&observer); | 498 service_->RemoveObserver(&observer); |
| 557 } | 499 } |
| 558 | 500 |
| 559 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { | 501 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { |
| 560 LoggingObserver observer; | 502 LoggingObserver observer; |
| 561 service_->AddObserver(&observer); | 503 service_->AddObserver(&observer); |
| 562 | 504 |
| 563 TestingPrefServiceSyncable* const pref_service = | |
| 564 profile_->GetTestingPrefService(); | |
| 565 ASSERT_TRUE(pref_service); | |
| 566 | |
| 567 { | 505 { |
| 506 EXPECT_FALSE(registry_->file_system_info()); |
| 507 EXPECT_FALSE(registry_->observed_entries()); |
| 568 EXPECT_TRUE(service_->MountFileSystem( | 508 EXPECT_TRUE(service_->MountFileSystem( |
| 569 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 509 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 570 ASSERT_EQ(1u, observer.mounts.size()); | |
| 571 | 510 |
| 572 const base::DictionaryValue* extensions = | 511 EXPECT_EQ(1u, observer.mounts.size()); |
| 573 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 512 EXPECT_TRUE(registry_->file_system_info()); |
| 574 ASSERT_TRUE(extensions); | 513 EXPECT_TRUE(registry_->observed_entries()); |
| 575 | |
| 576 const base::DictionaryValue* file_systems = NULL; | |
| 577 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 578 &file_systems)); | |
| 579 EXPECT_EQ(1u, file_systems->size()); | |
| 580 } | 514 } |
| 581 | 515 |
| 582 { | 516 { |
| 583 EXPECT_TRUE(service_->UnmountFileSystem( | 517 EXPECT_TRUE(service_->UnmountFileSystem( |
| 584 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); | 518 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
| 585 | 519 |
| 586 const base::DictionaryValue* const extensions = | 520 EXPECT_EQ(1u, observer.unmounts.size()); |
| 587 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 521 EXPECT_FALSE(registry_->file_system_info()); |
| 588 ASSERT_TRUE(extensions); | 522 EXPECT_FALSE(registry_->observed_entries()); |
| 589 | |
| 590 const base::DictionaryValue* file_systems = NULL; | |
| 591 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 592 &file_systems)); | |
| 593 } | 523 } |
| 594 | 524 |
| 595 service_->RemoveObserver(&observer); | 525 service_->RemoveObserver(&observer); |
| 596 } | 526 } |
| 597 | 527 |
| 598 } // namespace file_system_provider | 528 } // namespace file_system_provider |
| 599 } // namespace chromeos | 529 } // namespace chromeos |
| OLD | NEW |