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* 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 |
125 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); | 142 pref_service->Set(prefs::kFileSystemProviderMounted, extensions); |
126 } | 143 } |
127 | 144 |
128 } // namespace | 145 } // namespace |
129 | 146 |
130 class FileSystemProviderServiceTest : public testing::Test { | 147 class FileSystemProviderServiceTest : public testing::Test { |
131 protected: | 148 protected: |
132 FileSystemProviderServiceTest() : profile_(NULL) {} | 149 FileSystemProviderServiceTest() : profile_(NULL) {} |
133 | 150 |
134 virtual ~FileSystemProviderServiceTest() {} | 151 virtual ~FileSystemProviderServiceTest() {} |
135 | 152 |
136 virtual void SetUp() override { | 153 virtual void SetUp() override { |
137 profile_manager_.reset( | 154 profile_manager_.reset( |
138 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); | 155 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
139 ASSERT_TRUE(profile_manager_->SetUp()); | 156 ASSERT_TRUE(profile_manager_->SetUp()); |
140 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); | 157 profile_ = profile_manager_->CreateTestingProfile("test-user@example.com"); |
141 user_manager_ = new FakeUserManager(); | 158 user_manager_ = new FakeUserManager(); |
142 user_manager_->AddUser(profile_->GetProfileName()); | 159 user_manager_->AddUser(profile_->GetProfileName()); |
143 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); | 160 user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_)); |
144 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); | 161 extension_registry_.reset(new extensions::ExtensionRegistry(profile_)); |
145 service_.reset(new Service(profile_, extension_registry_.get())); | 162 service_.reset(new Service(profile_, extension_registry_.get())); |
146 service_->SetFileSystemFactoryForTesting( | 163 service_->SetFileSystemFactoryForTesting( |
147 base::Bind(&FakeProvidedFileSystem::Create)); | 164 base::Bind(&FakeProvidedFileSystem::Create)); |
148 extension_ = createFakeExtension(kExtensionId); | 165 extension_ = CreateFakeExtension(kExtensionId); |
| 166 fake_observed_entry_.entry_path = |
| 167 base::FilePath(FILE_PATH_LITERAL("/a/b/c")); |
| 168 fake_observed_entry_.recursive = true; |
| 169 fake_observed_entry_.last_tag = "hello-world"; |
149 } | 170 } |
150 | 171 |
151 content::TestBrowserThreadBundle thread_bundle_; | 172 content::TestBrowserThreadBundle thread_bundle_; |
152 scoped_ptr<TestingProfileManager> profile_manager_; | 173 scoped_ptr<TestingProfileManager> profile_manager_; |
153 TestingProfile* profile_; | 174 TestingProfile* profile_; |
154 FakeUserManager* user_manager_; | 175 FakeUserManager* user_manager_; |
155 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; | 176 scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_; |
156 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; | 177 scoped_ptr<extensions::ExtensionRegistry> extension_registry_; |
157 scoped_ptr<Service> service_; | 178 scoped_ptr<Service> service_; |
158 scoped_refptr<extensions::Extension> extension_; | 179 scoped_refptr<extensions::Extension> extension_; |
| 180 ObservedEntry fake_observed_entry_; |
159 }; | 181 }; |
160 | 182 |
161 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { | 183 TEST_F(FileSystemProviderServiceTest, MountFileSystem) { |
162 LoggingObserver observer; | 184 LoggingObserver observer; |
163 service_->AddObserver(&observer); | 185 service_->AddObserver(&observer); |
164 | 186 |
165 EXPECT_TRUE(service_->MountFileSystem( | 187 EXPECT_TRUE(service_->MountFileSystem( |
166 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); | 188 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
167 | 189 |
168 ASSERT_EQ(1u, observer.mounts.size()); | 190 ASSERT_EQ(1u, observer.mounts.size()); |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 service_->RemoveObserver(&observer); | 355 service_->RemoveObserver(&observer); |
334 } | 356 } |
335 | 357 |
336 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { | 358 TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) { |
337 // Create a fake entry in the preferences. | 359 // Create a fake entry in the preferences. |
338 RememberFakeFileSystem(profile_, | 360 RememberFakeFileSystem(profile_, |
339 kExtensionId, | 361 kExtensionId, |
340 kFileSystemId, | 362 kFileSystemId, |
341 kDisplayName, | 363 kDisplayName, |
342 true /* writable */, | 364 true /* writable */, |
343 true /* supports_notify_tag */); | 365 true /* supports_notify_tag */, |
| 366 fake_observed_entry_); |
344 | 367 |
345 // Create a new service instance in order to load remembered file systems | 368 // Create a new service instance in order to load remembered file systems |
346 // from preferences. | 369 // from preferences. |
347 scoped_ptr<Service> new_service( | 370 scoped_ptr<Service> new_service( |
348 new Service(profile_, extension_registry_.get())); | 371 new Service(profile_, extension_registry_.get())); |
349 LoggingObserver observer; | 372 LoggingObserver observer; |
350 new_service->AddObserver(&observer); | 373 new_service->AddObserver(&observer); |
351 | 374 |
352 new_service->SetFileSystemFactoryForTesting( | 375 new_service->SetFileSystemFactoryForTesting( |
353 base::Bind(&FakeProvidedFileSystem::Create)); | 376 base::Bind(&FakeProvidedFileSystem::Create)); |
354 | 377 |
355 EXPECT_EQ(0u, observer.mounts.size()); | 378 EXPECT_EQ(0u, observer.mounts.size()); |
356 | 379 |
357 // Directly call the observer's method. | 380 // Directly call the observer's method. |
358 new_service->OnExtensionLoaded(profile_, extension_.get()); | 381 new_service->OnExtensionLoaded(profile_, extension_.get()); |
359 | 382 |
360 ASSERT_EQ(1u, observer.mounts.size()); | 383 ASSERT_EQ(1u, observer.mounts.size()); |
361 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); | 384 EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error()); |
362 | 385 |
363 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); | 386 EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id()); |
364 EXPECT_EQ(kFileSystemId, | 387 EXPECT_EQ(kFileSystemId, |
365 observer.mounts[0].file_system_info().file_system_id()); | 388 observer.mounts[0].file_system_info().file_system_id()); |
366 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); | 389 EXPECT_TRUE(observer.mounts[0].file_system_info().writable()); |
367 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); | 390 EXPECT_TRUE(observer.mounts[0].file_system_info().supports_notify_tag()); |
368 | 391 |
369 std::vector<ProvidedFileSystemInfo> file_system_info_list = | 392 std::vector<ProvidedFileSystemInfo> file_system_info_list = |
370 new_service->GetProvidedFileSystemInfoList(); | 393 new_service->GetProvidedFileSystemInfoList(); |
371 ASSERT_EQ(1u, file_system_info_list.size()); | 394 ASSERT_EQ(1u, file_system_info_list.size()); |
372 | 395 |
| 396 ProvidedFileSystemInterface* const file_system = |
| 397 new_service->GetProvidedFileSystem(kExtensionId, kFileSystemId); |
| 398 ASSERT_TRUE(file_system); |
| 399 |
| 400 const ObservedEntries* const observed_entries = |
| 401 file_system->GetObservedEntries(); |
| 402 ASSERT_TRUE(observed_entries); |
| 403 ASSERT_EQ(1u, observed_entries->size()); |
| 404 |
| 405 const ObservedEntries::const_iterator restored_observed_entry_it = |
| 406 observed_entries->find(fake_observed_entry_.entry_path); |
| 407 ASSERT_NE(observed_entries->end(), restored_observed_entry_it); |
| 408 |
| 409 EXPECT_EQ(fake_observed_entry_.entry_path, |
| 410 restored_observed_entry_it->second.entry_path); |
| 411 EXPECT_EQ(fake_observed_entry_.recursive, |
| 412 restored_observed_entry_it->second.recursive); |
| 413 EXPECT_EQ(fake_observed_entry_.last_tag, |
| 414 restored_observed_entry_it->second.last_tag); |
| 415 |
373 new_service->RemoveObserver(&observer); | 416 new_service->RemoveObserver(&observer); |
374 } | 417 } |
375 | 418 |
376 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { | 419 TEST_F(FileSystemProviderServiceTest, RememberFileSystem) { |
377 LoggingObserver observer; | |
378 service_->AddObserver(&observer); | |
379 | |
380 MountOptions options(kFileSystemId, kDisplayName); | 420 MountOptions options(kFileSystemId, kDisplayName); |
381 options.writable = true; | 421 options.writable = true; |
382 options.supports_notify_tag = true; | 422 options.supports_notify_tag = true; |
383 EXPECT_TRUE(service_->MountFileSystem(kExtensionId, options)); | 423 |
384 ASSERT_EQ(1u, observer.mounts.size()); | 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); |
385 | 431 |
386 TestingPrefServiceSyncable* const pref_service = | 432 TestingPrefServiceSyncable* const pref_service = |
387 profile_->GetTestingPrefService(); | 433 profile_->GetTestingPrefService(); |
388 ASSERT_TRUE(pref_service); | 434 ASSERT_TRUE(pref_service); |
389 | 435 |
390 const base::DictionaryValue* const extensions = | 436 const base::DictionaryValue* const extensions = |
391 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); | 437 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
392 ASSERT_TRUE(extensions); | 438 ASSERT_TRUE(extensions); |
393 | 439 |
394 const base::DictionaryValue* file_systems = NULL; | 440 const base::DictionaryValue* file_systems = NULL; |
(...skipping 20 matching lines...) Expand all Loading... |
415 bool writable = false; | 461 bool writable = false; |
416 EXPECT_TRUE( | 462 EXPECT_TRUE( |
417 file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable)); | 463 file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable)); |
418 EXPECT_TRUE(writable); | 464 EXPECT_TRUE(writable); |
419 | 465 |
420 bool supports_notify_tag = false; | 466 bool supports_notify_tag = false; |
421 EXPECT_TRUE(file_system->GetBooleanWithoutPathExpansion( | 467 EXPECT_TRUE(file_system->GetBooleanWithoutPathExpansion( |
422 kPrefKeySupportsNotifyTag, &supports_notify_tag)); | 468 kPrefKeySupportsNotifyTag, &supports_notify_tag)); |
423 EXPECT_TRUE(supports_notify_tag); | 469 EXPECT_TRUE(supports_notify_tag); |
424 | 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 } |
| 494 |
| 495 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) { |
| 496 LoggingObserver observer; |
| 497 service_->AddObserver(&observer); |
| 498 |
| 499 TestingPrefServiceSyncable* const pref_service = |
| 500 profile_->GetTestingPrefService(); |
| 501 ASSERT_TRUE(pref_service); |
| 502 |
| 503 EXPECT_TRUE(service_->MountFileSystem( |
| 504 kExtensionId, MountOptions(kFileSystemId, kDisplayName))); |
| 505 ASSERT_EQ(1u, observer.mounts.size()); |
| 506 |
| 507 const base::DictionaryValue* extensions = |
| 508 pref_service->GetDictionary(prefs::kFileSystemProviderMounted); |
| 509 ASSERT_TRUE(extensions); |
| 510 |
| 511 const base::DictionaryValue* file_systems = NULL; |
| 512 ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
| 513 &file_systems)); |
| 514 EXPECT_EQ(1u, file_systems->size()); |
| 515 |
425 service_->RemoveObserver(&observer); | 516 service_->RemoveObserver(&observer); |
426 } | 517 } |
427 | 518 |
428 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { | 519 TEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) { |
429 LoggingObserver observer; | 520 LoggingObserver observer; |
430 service_->AddObserver(&observer); | 521 service_->AddObserver(&observer); |
431 | 522 |
432 TestingPrefServiceSyncable* const pref_service = | 523 TestingPrefServiceSyncable* const pref_service = |
433 profile_->GetTestingPrefService(); | 524 profile_->GetTestingPrefService(); |
434 ASSERT_TRUE(pref_service); | 525 ASSERT_TRUE(pref_service); |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
499 const base::DictionaryValue* file_systems = NULL; | 590 const base::DictionaryValue* file_systems = NULL; |
500 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, | 591 EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId, |
501 &file_systems)); | 592 &file_systems)); |
502 } | 593 } |
503 | 594 |
504 service_->RemoveObserver(&observer); | 595 service_->RemoveObserver(&observer); |
505 } | 596 } |
506 | 597 |
507 } // namespace file_system_provider | 598 } // namespace file_system_provider |
508 } // namespace chromeos | 599 } // namespace chromeos |
OLD | NEW |