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 |