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 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 // Fake implementation of the registry, since it's already tested separately. | 85 // Fake implementation of the registry, since it's already tested separately. |
86 // For simplicity it can remember at most only one file system. | 86 // For simplicity it can remember at most only one file system. |
87 class FakeRegistry : public RegistryInterface { | 87 class FakeRegistry : public RegistryInterface { |
88 public: | 88 public: |
89 FakeRegistry() {} | 89 FakeRegistry() {} |
90 virtual ~FakeRegistry() {} | 90 virtual ~FakeRegistry() {} |
91 | 91 |
92 // RegistryInterface overrides. | 92 // RegistryInterface overrides. |
93 virtual void RememberFileSystem( | 93 virtual void RememberFileSystem( |
94 const ProvidedFileSystemInfo& file_system_info, | 94 const ProvidedFileSystemInfo& file_system_info, |
95 const ObservedEntries& observed_entries) override { | 95 const Watchers& watchers) override { |
96 file_system_info_.reset(new ProvidedFileSystemInfo(file_system_info)); | 96 file_system_info_.reset(new ProvidedFileSystemInfo(file_system_info)); |
97 observed_entries_.reset(new ObservedEntries(observed_entries)); | 97 watchers_.reset(new Watchers(watchers)); |
98 } | 98 } |
99 | 99 |
100 virtual void ForgetFileSystem(const std::string& extension_id, | 100 virtual void ForgetFileSystem(const std::string& extension_id, |
101 const std::string& file_system_id) override { | 101 const std::string& file_system_id) override { |
102 if (!file_system_info_.get() || !observed_entries_.get()) | 102 if (!file_system_info_.get() || !watchers_.get()) |
103 return; | 103 return; |
104 if (file_system_info_->extension_id() == extension_id && | 104 if (file_system_info_->extension_id() == extension_id && |
105 file_system_info_->file_system_id() == file_system_id) { | 105 file_system_info_->file_system_id() == file_system_id) { |
106 file_system_info_.reset(); | 106 file_system_info_.reset(); |
107 observed_entries_.reset(); | 107 watchers_.reset(); |
108 } | 108 } |
109 } | 109 } |
110 | 110 |
111 virtual scoped_ptr<RestoredFileSystems> RestoreFileSystems( | 111 virtual scoped_ptr<RestoredFileSystems> RestoreFileSystems( |
112 const std::string& extension_id) override { | 112 const std::string& extension_id) override { |
113 scoped_ptr<RestoredFileSystems> result(new RestoredFileSystems); | 113 scoped_ptr<RestoredFileSystems> result(new RestoredFileSystems); |
114 | 114 |
115 if (file_system_info_.get() && observed_entries_.get()) { | 115 if (file_system_info_.get() && watchers_.get()) { |
116 RestoredFileSystem restored_file_system; | 116 RestoredFileSystem restored_file_system; |
117 restored_file_system.extension_id = file_system_info_->extension_id(); | 117 restored_file_system.extension_id = file_system_info_->extension_id(); |
118 | 118 |
119 MountOptions options; | 119 MountOptions options; |
120 options.file_system_id = file_system_info_->file_system_id(); | 120 options.file_system_id = file_system_info_->file_system_id(); |
121 options.display_name = file_system_info_->display_name(); | 121 options.display_name = file_system_info_->display_name(); |
122 options.writable = file_system_info_->writable(); | 122 options.writable = file_system_info_->writable(); |
123 options.supports_notify_tag = file_system_info_->supports_notify_tag(); | 123 options.supports_notify_tag = file_system_info_->supports_notify_tag(); |
124 restored_file_system.options = options; | 124 restored_file_system.options = options; |
125 restored_file_system.observed_entries = *observed_entries_.get(); | 125 restored_file_system.watchers = *watchers_.get(); |
126 | 126 |
127 result->push_back(restored_file_system); | 127 result->push_back(restored_file_system); |
128 } | 128 } |
129 | 129 |
130 return result; | 130 return result; |
131 } | 131 } |
132 | 132 |
133 virtual void UpdateObservedEntryTag( | 133 virtual void UpdateWatcherTag(const ProvidedFileSystemInfo& file_system_info, |
134 const ProvidedFileSystemInfo& file_system_info, | 134 const Watcher& watcher) override { |
135 const ObservedEntry& observed_entry) override { | 135 ASSERT_TRUE(watchers_.get()); |
136 ASSERT_TRUE(observed_entries_.get()); | 136 const Watchers::iterator it = |
137 const ObservedEntries::iterator it = observed_entries_->find( | 137 watchers_->find(WatcherKey(watcher.entry_path, watcher.recursive)); |
138 ObservedEntryKey(observed_entry.entry_path, observed_entry.recursive)); | 138 ASSERT_NE(watchers_->end(), it); |
139 ASSERT_NE(observed_entries_->end(), it); | 139 it->second.last_tag = watcher.last_tag; |
140 it->second.last_tag = observed_entry.last_tag; | |
141 } | 140 } |
142 | 141 |
143 ProvidedFileSystemInfo* const file_system_info() const { | 142 ProvidedFileSystemInfo* const file_system_info() const { |
144 return file_system_info_.get(); | 143 return file_system_info_.get(); |
145 } | 144 } |
146 ObservedEntries* const observed_entries() const { | 145 Watchers* const watchers() const { return watchers_.get(); } |
147 return observed_entries_.get(); | |
148 } | |
149 | 146 |
150 private: | 147 private: |
151 scoped_ptr<ProvidedFileSystemInfo> file_system_info_; | 148 scoped_ptr<ProvidedFileSystemInfo> file_system_info_; |
152 scoped_ptr<ObservedEntries> observed_entries_; | 149 scoped_ptr<Watchers> watchers_; |
153 | 150 |
154 DISALLOW_COPY_AND_ASSIGN(FakeRegistry); | 151 DISALLOW_COPY_AND_ASSIGN(FakeRegistry); |
155 }; | 152 }; |
156 | 153 |
157 // Creates a fake extension with the specified |extension_id|. | 154 // Creates a fake extension with the specified |extension_id|. |
158 scoped_refptr<extensions::Extension> CreateFakeExtension( | 155 scoped_refptr<extensions::Extension> CreateFakeExtension( |
159 const std::string& extension_id) { | 156 const std::string& extension_id) { |
160 base::DictionaryValue manifest; | 157 base::DictionaryValue manifest; |
161 std::string error; | 158 std::string error; |
162 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, | 159 manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion, |
(...skipping 28 matching lines...) Expand all Loading... |
191 | 188 |
192 service_.reset(new Service(profile_, extension_registry_.get())); | 189 service_.reset(new Service(profile_, extension_registry_.get())); |
193 service_->SetFileSystemFactoryForTesting( | 190 service_->SetFileSystemFactoryForTesting( |
194 base::Bind(&FakeProvidedFileSystem::Create)); | 191 base::Bind(&FakeProvidedFileSystem::Create)); |
195 extension_ = CreateFakeExtension(kExtensionId); | 192 extension_ = CreateFakeExtension(kExtensionId); |
196 | 193 |
197 registry_ = new FakeRegistry; | 194 registry_ = new FakeRegistry; |
198 // Passes ownership to the service instance. | 195 // Passes ownership to the service instance. |
199 service_->SetRegistryForTesting(make_scoped_ptr(registry_)); | 196 service_->SetRegistryForTesting(make_scoped_ptr(registry_)); |
200 | 197 |
201 fake_observed_entry_.entry_path = | 198 fake_watcher_.entry_path = base::FilePath(FILE_PATH_LITERAL("/a/b/c")); |
202 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); | 199 fake_watcher_.recursive = true; |
203 fake_observed_entry_.recursive = true; | 200 fake_watcher_.last_tag = "hello-world"; |
204 fake_observed_entry_.last_tag = "hello-world"; | |
205 } | 201 } |
206 | 202 |
207 content::TestBrowserThreadBundle thread_bundle_; | 203 content::TestBrowserThreadBundle thread_bundle_; |
208 scoped_ptr<TestingProfileManager> profile_manager_; | 204 scoped_ptr<TestingProfileManager> profile_manager_; |
209 TestingProfile* profile_; | 205 TestingProfile* profile_; |
210 FakeUserManager* user_manager_; | 206 FakeUserManager* user_manager_; |
211 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 207 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
212 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 208 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
213 scoped_ptr<Service> service_; | 209 scoped_ptr<Service> service_; |
214 scoped_refptr<extensions::Extension> extension_; | 210 scoped_refptr<extensions::Extension> extension_; |
215 FakeRegistry* registry_; // Owned by Service. | 211 FakeRegistry* registry_; // Owned by Service. |
216 ObservedEntry fake_observed_entry_; | 212 Watcher fake_watcher_; |
217 }; | 213 }; |
218 | 214 |
219 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 215 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
220 LoggingObserver observer; | 216 LoggingObserver observer; |
221 service_->AddObserver(&observer); | 217 service_->AddObserver(&observer); |
222 | 218 |
223 EXPECT_TRUE(service_->MountFileSystem( | 219 EXPECT_TRUE(service_->MountFileSystem( |
224 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 220 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
225 | 221 |
226 ASSERT_EQ(1u, observer.mounts.size()); | 222 ASSERT_EQ(1u, observer.mounts.size()); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
393 | 389 |
394 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 390 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
395 LoggingObserver observer; | 391 LoggingObserver observer; |
396 service_->AddObserver(&observer); | 392 service_->AddObserver(&observer); |
397 | 393 |
398 // Remember a fake file system first in order to be able to restore it. | 394 // Remember a fake file system first in order to be able to restore it. |
399 MountOptions options(kFileSystemId, kDisplayName); | 395 MountOptions options(kFileSystemId, kDisplayName); |
400 options.supports_notify_tag = true; | 396 options.supports_notify_tag = true; |
401 ProvidedFileSystemInfo file_system_info( | 397 ProvidedFileSystemInfo file_system_info( |
402 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); | 398 kExtensionId, options, base::FilePath(FILE_PATH_LITERAL("/a/b/c"))); |
403 ObservedEntries fake_observed_entries; | 399 Watchers fake_watchers; |
404 fake_observed_entries[ObservedEntryKey(fake_observed_entry_.entry_path, | 400 fake_watchers[WatcherKey(fake_watcher_.entry_path, fake_watcher_.recursive)] = |
405 fake_observed_entry_.recursive)] = | 401 fake_watcher_; |
406 fake_observed_entry_; | 402 registry_->RememberFileSystem(file_system_info, fake_watchers); |
407 registry_->RememberFileSystem(file_system_info, fake_observed_entries); | |
408 | 403 |
409 EXPECT_EQ(0u, observer.mounts.size()); | 404 EXPECT_EQ(0u, observer.mounts.size()); |
410 | 405 |
411 // Directly call the observer's method. | 406 // Directly call the observer's method. |
412 service_->OnExtensionLoaded(profile_, extension_.get()); | 407 service_->OnExtensionLoaded(profile_, extension_.get()); |
413 | 408 |
414 ASSERT_EQ(1u, observer.mounts.size()); | 409 ASSERT_EQ(1u, observer.mounts.size()); |
415 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 410 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
416 | 411 |
417 EXPECT_EQ(file_system_info.extension_id(), | 412 EXPECT_EQ(file_system_info.extension_id(), |
418 observer.mounts[0].file_system_info().extension_id()); | 413 observer.mounts[0].file_system_info().extension_id()); |
419 EXPECT_EQ(file_system_info.file_system_id(), | 414 EXPECT_EQ(file_system_info.file_system_id(), |
420 observer.mounts[0].file_system_info().file_system_id()); | 415 observer.mounts[0].file_system_info().file_system_id()); |
421 EXPECT_EQ(file_system_info.writable(), | 416 EXPECT_EQ(file_system_info.writable(), |
422 observer.mounts[0].file_system_info().writable()); | 417 observer.mounts[0].file_system_info().writable()); |
423 EXPECT_EQ(file_system_info.supports_notify_tag(), | 418 EXPECT_EQ(file_system_info.supports_notify_tag(), |
424 observer.mounts[0].file_system_info().supports_notify_tag()); | 419 observer.mounts[0].file_system_info().supports_notify_tag()); |
425 | 420 |
426 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 421 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
427 service_->GetProvidedFileSystemInfoList(); | 422 service_->GetProvidedFileSystemInfoList(); |
428 ASSERT_EQ(1u, file_system_info_list.size()); | 423 ASSERT_EQ(1u, file_system_info_list.size()); |
429 | 424 |
430 ProvidedFileSystemInterface* const file_system = | 425 ProvidedFileSystemInterface* const file_system = |
431 service_->GetProvidedFileSystem(kExtensionId, kFileSystemId); | 426 service_->GetProvidedFileSystem(kExtensionId, kFileSystemId); |
432 ASSERT_TRUE(file_system); | 427 ASSERT_TRUE(file_system); |
433 | 428 |
434 const ObservedEntries* const observed_entries = | 429 const Watchers* const watchers = file_system->GetWatchers(); |
435 file_system->GetObservedEntries(); | 430 ASSERT_TRUE(watchers); |
436 ASSERT_TRUE(observed_entries); | 431 ASSERT_EQ(1u, watchers->size()); |
437 ASSERT_EQ(1u, observed_entries->size()); | |
438 | 432 |
439 const ObservedEntries::const_iterator restored_observed_entry_it = | 433 const Watchers::const_iterator restored_watcher_it = watchers->find( |
440 observed_entries->find(ObservedEntryKey(fake_observed_entry_.entry_path, | 434 WatcherKey(fake_watcher_.entry_path, fake_watcher_.recursive)); |
441 fake_observed_entry_.recursive)); | 435 ASSERT_NE(watchers->end(), restored_watcher_it); |
442 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); | |
443 | 436 |
444 EXPECT_EQ(fake_observed_entry_.entry_path, | 437 EXPECT_EQ(fake_watcher_.entry_path, restored_watcher_it->second.entry_path); |
445 restored_observed_entry_it->second.entry_path); | 438 EXPECT_EQ(fake_watcher_.recursive, restored_watcher_it->second.recursive); |
446 EXPECT_EQ(fake_observed_entry_.recursive, | 439 EXPECT_EQ(fake_watcher_.last_tag, restored_watcher_it->second.last_tag); |
447 restored_observed_entry_it->second.recursive); | |
448 EXPECT_EQ(fake_observed_entry_.last_tag, | |
449 restored_observed_entry_it->second.last_tag); | |
450 | 440 |
451 service_->RemoveObserver(&observer); | 441 service_->RemoveObserver(&observer); |
452 } | 442 } |
453 | 443 |
454 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | 444 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { |
455 LoggingObserver observer; | 445 LoggingObserver observer; |
456 service_->AddObserver(&observer); | 446 service_->AddObserver(&observer); |
457 | 447 |
458 EXPECT_FALSE(registry_->file_system_info()); | 448 EXPECT_FALSE(registry_->file_system_info()); |
459 EXPECT_FALSE(registry_->observed_entries()); | 449 EXPECT_FALSE(registry_->watchers()); |
460 | 450 |
461 EXPECT_TRUE(service_->MountFileSystem( | 451 EXPECT_TRUE(service_->MountFileSystem( |
462 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 452 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
463 ASSERT_EQ(1u, observer.mounts.size()); | 453 ASSERT_EQ(1u, observer.mounts.size()); |
464 | 454 |
465 ASSERT_TRUE(registry_->file_system_info()); | 455 ASSERT_TRUE(registry_->file_system_info()); |
466 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); | 456 EXPECT_EQ(kExtensionId, registry_->file_system_info()->extension_id()); |
467 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); | 457 EXPECT_EQ(kFileSystemId, registry_->file_system_info()->file_system_id()); |
468 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); | 458 EXPECT_EQ(kDisplayName, registry_->file_system_info()->display_name()); |
469 EXPECT_FALSE(registry_->file_system_info()->writable()); | 459 EXPECT_FALSE(registry_->file_system_info()->writable()); |
470 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); | 460 EXPECT_FALSE(registry_->file_system_info()->supports_notify_tag()); |
471 ASSERT_TRUE(registry_->observed_entries()); | 461 ASSERT_TRUE(registry_->watchers()); |
472 | 462 |
473 service_->RemoveObserver(&observer); | 463 service_->RemoveObserver(&observer); |
474 } | 464 } |
475 | 465 |
476 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { | 466 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
477 LoggingObserver observer; | 467 LoggingObserver observer; |
478 service_->AddObserver(&observer); | 468 service_->AddObserver(&observer); |
479 | 469 |
480 { | 470 { |
481 EXPECT_FALSE(registry_->file_system_info()); | 471 EXPECT_FALSE(registry_->file_system_info()); |
482 EXPECT_FALSE(registry_->observed_entries()); | 472 EXPECT_FALSE(registry_->watchers()); |
483 EXPECT_TRUE(service_->MountFileSystem( | 473 EXPECT_TRUE(service_->MountFileSystem( |
484 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 474 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
485 | 475 |
486 EXPECT_EQ(1u, observer.mounts.size()); | 476 EXPECT_EQ(1u, observer.mounts.size()); |
487 EXPECT_TRUE(registry_->file_system_info()); | 477 EXPECT_TRUE(registry_->file_system_info()); |
488 EXPECT_TRUE(registry_->observed_entries()); | 478 EXPECT_TRUE(registry_->watchers()); |
489 } | 479 } |
490 | 480 |
491 { | 481 { |
492 EXPECT_TRUE(service_->UnmountFileSystem( | 482 EXPECT_TRUE(service_->UnmountFileSystem( |
493 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); | 483 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN)); |
494 | 484 |
495 EXPECT_EQ(1u, observer.unmounts.size()); | 485 EXPECT_EQ(1u, observer.unmounts.size()); |
496 EXPECT_TRUE(registry_->file_system_info()); | 486 EXPECT_TRUE(registry_->file_system_info()); |
497 EXPECT_TRUE(registry_->observed_entries()); | 487 EXPECT_TRUE(registry_->watchers()); |
498 } | 488 } |
499 | 489 |
500 service_->RemoveObserver(&observer); | 490 service_->RemoveObserver(&observer); |
501 } | 491 } |
502 | 492 |
503 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { | 493 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) { |
504 LoggingObserver observer; | 494 LoggingObserver observer; |
505 service_->AddObserver(&observer); | 495 service_->AddObserver(&observer); |
506 | 496 |
507 { | 497 { |
508 EXPECT_FALSE(registry_->file_system_info()); | 498 EXPECT_FALSE(registry_->file_system_info()); |
509 EXPECT_FALSE(registry_->observed_entries()); | 499 EXPECT_FALSE(registry_->watchers()); |
510 EXPECT_TRUE(service_->MountFileSystem( | 500 EXPECT_TRUE(service_->MountFileSystem( |
511 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 501 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
512 | 502 |
513 EXPECT_EQ(1u, observer.mounts.size()); | 503 EXPECT_EQ(1u, observer.mounts.size()); |
514 EXPECT_TRUE(registry_->file_system_info()); | 504 EXPECT_TRUE(registry_->file_system_info()); |
515 EXPECT_TRUE(registry_->observed_entries()); | 505 EXPECT_TRUE(registry_->watchers()); |
516 } | 506 } |
517 | 507 |
518 { | 508 { |
519 EXPECT_TRUE(service_->UnmountFileSystem( | 509 EXPECT_TRUE(service_->UnmountFileSystem( |
520 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); | 510 kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER)); |
521 | 511 |
522 EXPECT_EQ(1u, observer.unmounts.size()); | 512 EXPECT_EQ(1u, observer.unmounts.size()); |
523 EXPECT_FALSE(registry_->file_system_info()); | 513 EXPECT_FALSE(registry_->file_system_info()); |
524 EXPECT_FALSE(registry_->observed_entries()); | 514 EXPECT_FALSE(registry_->watchers()); |
525 } | 515 } |
526 | 516 |
527 service_->RemoveObserver(&observer); | 517 service_->RemoveObserver(&observer); |
528 } | 518 } |
529 | 519 |
530 } // namespace file_system_provider | 520 } // namespace file_system_provider |
531 } // namespace chromeos | 521 } // namespace chromeos |
OLD | NEW |