Chromium Code Reviews| 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" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 76 const ProvidedFileSystemInfo& file_system_info, | 76 const ProvidedFileSystemInfo& file_system_info, |
| 77 base::File::Error error) override { | 77 base::File::Error error) override { |
| 78 unmounts.push_back(Event(file_system_info, error)); | 78 unmounts.push_back(Event(file_system_info, error)); |
| 79 } | 79 } |
| 80 | 80 |
| 81 std::vector<Event> mounts; | 81 std::vector<Event> mounts; |
| 82 std::vector<Event> unmounts; | 82 std::vector<Event> unmounts; |
| 83 }; | 83 }; |
| 84 | 84 |
| 85 // Creates a fake extension with the specified |extension_id|. | 85 // Creates a fake extension with the specified |extension_id|. |
| 86 scoped_refptr<extensions::Extension> createFakeExtension( | 86 scoped_refptr<extensions::Extension> CreateFakeExtension( |
| 87 const std::string& extension_id) { | 87 const std::string& extension_id) { |
| 88 base::DictionaryValue manifest; | 88 base::DictionaryValue manifest; |
| 89 std::string error; | 89 std::string error; |
| 90 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, | 90 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, |
| 91 "1.0.0.0"); | 91 "1.0.0.0"); |
| 92 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName, | 92 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName, |
| 93 "unused"); | 93 "unused"); |
| 94 return extensions::Extension::Create(base::FilePath(), | 94 return extensions::Extension::Create(base::FilePath(), |
| 95 extensions::Manifest::UNPACKED, | 95 extensions::Manifest::UNPACKED, |
| 96 manifest, | 96 manifest, |
| 97 extensions::Extension::NO_FLAGS, | 97 extensions::Extension::NO_FLAGS, |
| 98 extension_id, | 98 extension_id, |
| 99 &error); | 99 &error); |
| 100 } | 100 } |
| 101 | 101 |
| 102 // Stores a provided file system information in preferences. | 102 // Stores a provided file system information in preferences together with a |
| 103 // fake observed entry. | |
| 103 void RememberFakeFileSystem(TestingProfile* profile, | 104 void RememberFakeFileSystem(TestingProfile* profile, |
| 104 const std::string& extension_id, | 105 const std::string& extension_id, |
| 105 const std::string& file_system_id, | 106 const std::string& file_system_id, |
| 106 const std::string& display_name, | 107 const std::string& display_name, |
| 107 bool writable, | 108 bool writable, |
| 108 bool supports_notify_tag) { | 109 bool supports_notify_tag, |
| 110 const ObservedEntry& observed_entry) { | |
| 109 TestingPrefServiceSyncable* const pref_service = | 111 TestingPrefServiceSyncable* const pref_service = |
| 110 profile->GetTestingPrefService(); | 112 profile->GetTestingPrefService(); |
| 111 ASSERT_TRUE(pref_service); | 113 ASSERT_TRUE(pref_service); |
| 112 | 114 |
| 113 base::DictionaryValue extensions; | 115 base::DictionaryValue extensions; |
| 114 base::DictionaryValue* file_systems = new base::DictionaryValue(); | 116 base::DictionaryValue* file_systems = new base::DictionaryValue(); |
| 115 base::DictionaryValue* file_system = new base::DictionaryValue(); | 117 base::DictionaryValue* file_system = new base::DictionaryValue(); |
| 116 file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId, | 118 file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId, |
| 117 kFileSystemId); | 119 kFileSystemId); |
| 118 file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName, kDisplayName); | 120 file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName, kDisplayName); |
| 119 file_system->SetBooleanWithoutPathExpansion(kPrefKeyWritable, writable); | 121 file_system->SetBooleanWithoutPathExpansion(kPrefKeyWritable, writable); |
| 120 file_system->SetBooleanWithoutPathExpansion(kPrefKeySupportsNotifyTag, | 122 file_system->SetBooleanWithoutPathExpansion(kPrefKeySupportsNotifyTag, |
| 121 supports_notify_tag); | 123 supports_notify_tag); |
| 122 file_systems->SetWithoutPathExpansion(kFileSystemId, file_system); | 124 file_systems->SetWithoutPathExpansion(kFileSystemId, file_system); |
| 123 extensions.SetWithoutPathExpansion(kExtensionId, file_systems); | 125 extensions.SetWithoutPathExpansion(kExtensionId, file_systems); |
| 124 | 126 |
| 127 // Remember observed entries. | |
| 128 base::DictionaryValue* observed_entries = new base::DictionaryValue(); | |
|
hirono
2014/10/17 08:22:23
nit: base::DictionaryValue* const
mtomasz
2014/10/20 05:11:56
Done.
| |
| 129 file_system->SetWithoutPathExpansion(kPrefKeyObservedEntries, | |
| 130 observed_entries); | |
| 131 base::DictionaryValue* observed_entry_value = new base::DictionaryValue(); | |
|
hirono
2014/10/17 08:22:23
nit: base::DictionaryValue* const
mtomasz
2014/10/20 05:11:56
Done.
| |
| 132 observed_entries->SetWithoutPathExpansion(observed_entry.entry_path.value(), | |
| 133 observed_entry_value); | |
| 134 observed_entry_value->SetStringWithoutPathExpansion( | |
| 135 kPrefKeyObservedEntryEntryPath, observed_entry.entry_path.value()); | |
| 136 observed_entry_value->SetBooleanWithoutPathExpansion( | |
| 137 kPrefKeyObservedEntryRecursive, observed_entry.recursive); | |
| 138 observed_entry_value->SetStringWithoutPathExpansion( | |
| 139 kPrefKeyObservedEntryLastTag, observed_entry.last_tag); | |
| 140 | |
| 125 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); | 141 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); |
| 126 } | 142 } |
| 127 | 143 |
| 128 } // namespace | 144 } // namespace |
| 129 | 145 |
| 130 class FileSystemProviderServiceTest : public testing::Test { | 146 class FileSystemProviderServiceTest : public testing::Test { |
| 131 protected: | 147 protected: |
| 132 FileSystemProviderServiceTest() : profile_(NULL) {} | 148 FileSystemProviderServiceTest() : profile_(NULL) {} |
| 133 | 149 |
| 134 virtual ~FileSystemProviderServiceTest() {} | 150 virtual ~FileSystemProviderServiceTest() {} |
| 135 | 151 |
| 136 virtual void SetUp() override { | 152 virtual void SetUp() override { |
| 137 profile_manager_.reset( | 153 profile_manager_.reset( |
| 138 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); | 154 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
| 139 ASSERT_TRUE(profile_manager_->SetUp()); | 155 ASSERT_TRUE(profile_manager_->SetUp()); |
| 140 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); | 156 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); |
| 141 user_manager_ = new FakeUserManager(); | 157 user_manager_ = new FakeUserManager(); |
| 142 user_manager_->AddUser(profile_->GetProfileName()); | 158 user_manager_->AddUser(profile_->GetProfileName()); |
| 143 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); | 159 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); |
| 144 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); | 160 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); |
| 145 service_.reset(new Service(profile_, extension_registry_.get())); | 161 service_.reset(new Service(profile_, extension_registry_.get())); |
| 146 service_->SetFileSystemFactoryForTesting( | 162 service_->SetFileSystemFactoryForTesting( |
| 147 base::Bind(&FakeProvidedFileSystem::Create)); | 163 base::Bind(&FakeProvidedFileSystem::Create)); |
| 148 extension_ = createFakeExtension(kExtensionId); | 164 extension_ = CreateFakeExtension(kExtensionId); |
| 165 fake_observed_entry_.entry_path = | |
| 166 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); | |
| 167 fake_observed_entry_.recursive = true; | |
| 168 fake_observed_entry_.last_tag = "hello-world"; | |
| 149 } | 169 } |
| 150 | 170 |
| 151 content::TestBrowserThreadBundle thread_bundle_; | 171 content::TestBrowserThreadBundle thread_bundle_; |
| 152 scoped_ptr<TestingProfileManager> profile_manager_; | 172 scoped_ptr<TestingProfileManager> profile_manager_; |
| 153 TestingProfile* profile_; | 173 TestingProfile* profile_; |
| 154 FakeUserManager* user_manager_; | 174 FakeUserManager* user_manager_; |
| 155 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 175 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
| 156 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 176 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
| 157 scoped_ptr<Service> service_; | 177 scoped_ptr<Service> service_; |
| 158 scoped_refptr<extensions::Extension> extension_; | 178 scoped_refptr<extensions::Extension> extension_; |
| 179 ObservedEntry fake_observed_entry_; | |
| 159 }; | 180 }; |
| 160 | 181 |
| 161 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 182 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
| 162 LoggingObserver observer; | 183 LoggingObserver observer; |
| 163 service_->AddObserver(&observer); | 184 service_->AddObserver(&observer); |
| 164 | 185 |
| 165 EXPECT_TRUE(service_->MountFileSystem( | 186 EXPECT_TRUE(service_->MountFileSystem( |
| 166 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 187 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 167 | 188 |
| 168 ASSERT_EQ(1u, observer.mounts.size()); | 189 ASSERT_EQ(1u, observer.mounts.size()); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 333 service_->RemoveObserver(&observer); | 354 service_->RemoveObserver(&observer); |
| 334 } | 355 } |
| 335 | 356 |
| 336 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 357 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
| 337 // Create a fake entry in the preferences. | 358 // Create a fake entry in the preferences. |
| 338 RememberFakeFileSystem(profile_, | 359 RememberFakeFileSystem(profile_, |
| 339 kExtensionId, | 360 kExtensionId, |
| 340 kFileSystemId, | 361 kFileSystemId, |
| 341 kDisplayName, | 362 kDisplayName, |
| 342 true /* writable */, | 363 true /* writable */, |
| 343 true /* supports_notify_tag */); | 364 true /* supports_notify_tag */, |
| 365 fake_observed_entry_); | |
| 344 | 366 |
| 345 // Create a new service instance in order to load remembered file systems | 367 // Create a new service instance in order to load remembered file systems |
| 346 // from preferences. | 368 // from preferences. |
| 347 scoped_ptr<Service> new_service( | 369 scoped_ptr<Service> new_service( |
| 348 new Service(profile_, extension_registry_.get())); | 370 new Service(profile_, extension_registry_.get())); |
| 349 LoggingObserver observer; | 371 LoggingObserver observer; |
| 350 new_service->AddObserver(&observer); | 372 new_service->AddObserver(&observer); |
| 351 | 373 |
| 352 new_service->SetFileSystemFactoryForTesting( | 374 new_service->SetFileSystemFactoryForTesting( |
| 353 base::Bind(&FakeProvidedFileSystem::Create)); | 375 base::Bind(&FakeProvidedFileSystem::Create)); |
| 354 | 376 |
| 355 EXPECT_EQ(0u, observer.mounts.size()); | 377 EXPECT_EQ(0u, observer.mounts.size()); |
| 356 | 378 |
| 357 // Directly call the observer's method. | 379 // Directly call the observer's method. |
| 358 new_service->OnExtensionLoaded(profile_, extension_.get()); | 380 new_service->OnExtensionLoaded(profile_, extension_.get()); |
| 359 | 381 |
| 360 ASSERT_EQ(1u, observer.mounts.size()); | 382 ASSERT_EQ(1u, observer.mounts.size()); |
| 361 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 383 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
| 362 | 384 |
| 363 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); | 385 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); |
| 364 EXPECT_EQ(kFileSystemId, | 386 EXPECT_EQ(kFileSystemId, |
| 365 observer.mounts[0].file_system_info().file_system_id()); | 387 observer.mounts[0].file_system_info().file_system_id()); |
| 366 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); | 388 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); |
| 367 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); | 389 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); |
| 368 | 390 |
| 369 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 391 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
| 370 new_service->GetProvidedFileSystemInfoList(); | 392 new_service->GetProvidedFileSystemInfoList(); |
| 371 ASSERT_EQ(1u, file_system_info_list.size()); | 393 ASSERT_EQ(1u, file_system_info_list.size()); |
| 372 | 394 |
| 395 ProvidedFileSystemInterface* file_system = | |
|
hirono
2014/10/17 08:22:23
nit: const
mtomasz
2014/10/20 05:11:56
Done.
| |
| 396 new_service->GetProvidedFileSystem(kExtensionId, kFileSystemId); | |
| 397 ASSERT_TRUE(file_system); | |
| 398 | |
| 399 const ObservedEntries* const observed_entries = | |
| 400 file_system->GetObservedEntries(); | |
| 401 ASSERT_TRUE(observed_entries); | |
| 402 ASSERT_EQ(1u, observed_entries->size()); | |
| 403 | |
| 404 const ObservedEntries::const_iterator restored_observed_entry_it = | |
| 405 observed_entries->find(fake_observed_entry_.entry_path); | |
| 406 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); | |
| 407 | |
| 408 EXPECT_EQ(fake_observed_entry_.entry_path, | |
| 409 restored_observed_entry_it->second.entry_path); | |
| 410 EXPECT_EQ(fake_observed_entry_.recursive, | |
| 411 restored_observed_entry_it->second.recursive); | |
| 412 EXPECT_EQ(fake_observed_entry_.last_tag, | |
| 413 restored_observed_entry_it->second.last_tag); | |
| 414 | |
| 373 new_service->RemoveObserver(&observer); | 415 new_service->RemoveObserver(&observer); |
| 374 } | 416 } |
| 375 | 417 |
| 376 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | 418 TEST_F(FileSystemProviderServiceTest, RememberFileSystem) { |
| 377 LoggingObserver observer; | |
| 378 service_->AddObserver(&observer); | |
| 379 | |
| 380 MountOptions options(kFileSystemId, kDisplayName); | 419 MountOptions options(kFileSystemId, kDisplayName); |
| 381 options.writable = true; | 420 options.writable = true; |
| 382 options.supports_notify_tag = true; | 421 options.supports_notify_tag = true; |
| 383 EXPECT_TRUE(service_->MountFileSystem(kExtensionId, options)); | 422 |
| 384 ASSERT_EQ(1u, observer.mounts.size()); | 423 ProvidedFileSystemInfo file_system_info( |
| 424 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); | |
| 425 | |
| 426 ObservedEntries observed_entries; | |
| 427 observed_entries[fake_observed_entry_.entry_path] = fake_observed_entry_; | |
| 428 | |
| 429 service_->RememberFileSystem(file_system_info, observed_entries); | |
| 385 | 430 |
| 386 TestingPrefServiceSyncable* const pref_service = | 431 TestingPrefServiceSyncable* const pref_service = |
| 387 profile_->GetTestingPrefService(); | 432 profile_->GetTestingPrefService(); |
| 388 ASSERT_TRUE(pref_service); | 433 ASSERT_TRUE(pref_service); |
| 389 | 434 |
| 390 const base::DictionaryValue* const extensions = | 435 const base::DictionaryValue* const extensions = |
| 391 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 436 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 392 ASSERT_TRUE(extensions); | 437 ASSERT_TRUE(extensions); |
| 393 | 438 |
| 394 const base::DictionaryValue* file_systems = NULL; | 439 const base::DictionaryValue* file_systems = NULL; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 415 bool writable = false; | 460 bool writable = false; |
| 416 EXPECT_TRUE( | 461 EXPECT_TRUE( |
| 417 file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable)); | 462 file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable)); |
| 418 EXPECT_TRUE(writable); | 463 EXPECT_TRUE(writable); |
| 419 | 464 |
| 420 bool supports_notify_tag = false; | 465 bool supports_notify_tag = false; |
| 421 EXPECT_TRUE(file_system->GetBooleanWithoutPathExpansion( | 466 EXPECT_TRUE(file_system->GetBooleanWithoutPathExpansion( |
| 422 kPrefKeySupportsNotifyTag, &supports_notify_tag)); | 467 kPrefKeySupportsNotifyTag, &supports_notify_tag)); |
| 423 EXPECT_TRUE(supports_notify_tag); | 468 EXPECT_TRUE(supports_notify_tag); |
| 424 | 469 |
| 470 const base::DictionaryValue* observed_entries_value = NULL; | |
| 471 ASSERT_TRUE(file_system->GetDictionaryWithoutPathExpansion( | |
| 472 kPrefKeyObservedEntries, &observed_entries_value)); | |
| 473 | |
| 474 const base::DictionaryValue* observed_entry = NULL; | |
| 475 ASSERT_TRUE(observed_entries_value->GetDictionaryWithoutPathExpansion( | |
| 476 fake_observed_entry_.entry_path.value(), &observed_entry)); | |
| 477 | |
| 478 std::string entry_path; | |
| 479 EXPECT_TRUE(observed_entry->GetStringWithoutPathExpansion( | |
| 480 kPrefKeyObservedEntryEntryPath, &entry_path)); | |
| 481 EXPECT_EQ(fake_observed_entry_.entry_path.value(), entry_path); | |
| 482 | |
| 483 bool recursive = false; | |
| 484 EXPECT_TRUE(observed_entry->GetBooleanWithoutPathExpansion( | |
| 485 kPrefKeyObservedEntryRecursive, &recursive)); | |
| 486 EXPECT_EQ(fake_observed_entry_.recursive, recursive); | |
| 487 | |
| 488 std::string last_tag; | |
| 489 EXPECT_TRUE(observed_entry->GetStringWithoutPathExpansion( | |
| 490 kPrefKeyObservedEntryLastTag, &last_tag)); | |
| 491 EXPECT_EQ(fake_observed_entry_.last_tag, last_tag); | |
| 492 } | |
| 493 | |
| 494 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | |
| 495 LoggingObserver observer; | |
| 496 service_->AddObserver(&observer); | |
| 497 | |
| 498 TestingPrefServiceSyncable* const pref_service = | |
| 499 profile_->GetTestingPrefService(); | |
| 500 ASSERT_TRUE(pref_service); | |
| 501 | |
| 502 EXPECT_TRUE(service_->MountFileSystem( | |
| 503 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | |
| 504 ASSERT_EQ(1u, observer.mounts.size()); | |
| 505 | |
| 506 const base::DictionaryValue* extensions = | |
| 507 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | |
| 508 ASSERT_TRUE(extensions); | |
| 509 | |
| 510 const base::DictionaryValue* file_systems = NULL; | |
| 511 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | |
| 512 &file_systems)); | |
| 513 EXPECT_EQ(1u, file_systems->size()); | |
| 514 | |
| 425 service_->RemoveObserver(&observer); | 515 service_->RemoveObserver(&observer); |
| 426 } | 516 } |
| 427 | 517 |
| 428 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { | 518 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
| 429 LoggingObserver observer; | 519 LoggingObserver observer; |
| 430 service_->AddObserver(&observer); | 520 service_->AddObserver(&observer); |
| 431 | 521 |
| 432 TestingPrefServiceSyncable* const pref_service = | 522 TestingPrefServiceSyncable* const pref_service = |
| 433 profile_->GetTestingPrefService(); | 523 profile_->GetTestingPrefService(); |
| 434 ASSERT_TRUE(pref_service); | 524 ASSERT_TRUE(pref_service); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 499 const base::DictionaryValue* file_systems = NULL; | 589 const base::DictionaryValue* file_systems = NULL; |
| 500 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | 590 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 501 &file_systems)); | 591 &file_systems)); |
| 502 } | 592 } |
| 503 | 593 |
| 504 service_->RemoveObserver(&observer); | 594 service_->RemoveObserver(&observer); |
| 505 } | 595 } |
| 506 | 596 |
| 507 } // namespace file_system_provider | 597 } // namespace file_system_provider |
| 508 } // namespace chromeos | 598 } // namespace chromeos |
| OLD | NEW |