Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: chrome/browser/media_gallery/media_file_system_registry_unittest.cc

Issue 11027051: MediaFileSystemRegistry unit tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 // MediaFileSystemRegistry unit tests.
6
7 #include "base/command_line.h"
8 #include "base/file_util.h"
9 #include "base/memory/ref_counted.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/scoped_vector.h"
12 #include "base/message_loop.h"
13 #include "base/scoped_temp_dir.h"
14 #include "base/stl_util.h"
15 #include "base/stringprintf.h"
16 #include "base/utf_string_conversions.h"
17 #include "base/values.h"
18 #include "chrome/browser/extensions/extension_service.h"
19 #include "chrome/browser/extensions/extension_system.h"
20 #include "chrome/browser/extensions/test_extension_system.h"
21 #include "chrome/browser/media_gallery/media_file_system_registry.h"
22 #include "chrome/browser/media_gallery/media_galleries_preferences_factory.h"
23 #include "chrome/browser/media_gallery/media_galleries_test_util.h"
24 #include "chrome/browser/system_monitor/media_storage_util.h"
25 #include "chrome/browser/system_monitor/removable_device_constants.h"
26 #include "chrome/common/extensions/extension.h"
27 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
28 #include "chrome/test/base/testing_profile.h"
29 #include "content/public/browser/render_process_host_factory.h"
30 #include "content/public/browser/render_process_host.h"
31 #include "content/public/browser/render_view_host.h"
32 #include "content/public/browser/web_contents.h"
33 #include "content/public/test/mock_render_process_host.h"
34 #include "content/public/test/test_browser_thread.h"
35 #include "content/public/test/web_contents_tester.h"
36 #include "sync/api/string_ordinal.h"
37 #include "testing/gtest/include/gtest/gtest.h"
38
39 namespace chrome {
40
41 class TestMediaFileSystemContext : public MediaFileSystemContext {
42 public:
43 struct FSInfo {
44 FSInfo() {}
45 FSInfo(const std::string& device_id, const FilePath& path,
46 const std::string& fsid);
47
48 bool operator<(const FSInfo& other) const;
49
50 std::string device_id;
51 FilePath path;
52 std::string fsid;
53 };
54
55 explicit TestMediaFileSystemContext(MediaFileSystemRegistry* registry);
56 virtual ~TestMediaFileSystemContext() {}
57
58 // MediaFileSystemContext implementation.
59 virtual std::string RegisterFileSystemForMassStorage(
60 const std::string& device_id, const FilePath& path) OVERRIDE;
61
62 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM)
63 virtual std::string RegisterFileSystemForMTPDevice(
64 const std::string& device_id, const FilePath& path,
65 scoped_refptr<ScopedMTPDeviceMapEntry>* entry) OVERRIDE;
66 #endif
67
68 virtual void RevokeFileSystem(const std::string& fsid) OVERRIDE;
69
70 private:
71 std::string AddFSEntry(const std::string& device_id, const FilePath& path);
72
73 MediaFileSystemRegistry* registry_;
74
75 // A counter used to construct mock FSIDs.
76 int fsid_;
77
78 // The currently allocated mock file systems.
79 std::map<std::string /*fsid*/, FSInfo> file_systems_by_id_;
80 };
81
82 TestMediaFileSystemContext::FSInfo::FSInfo(const std::string& device_id,
83 const FilePath& path,
84 const std::string& fsid)
85 : device_id(device_id),
86 path(path),
87 fsid(fsid) {
88 }
89
90 bool TestMediaFileSystemContext::FSInfo::operator<(const FSInfo& other) const {
91 if (device_id != other.device_id)
92 return device_id < other.device_id;
93 if (path.value() != other.path.value())
94 return path.value() < other.path.value();
95 return fsid < other.fsid;
96 }
97
98 TestMediaFileSystemContext::TestMediaFileSystemContext(
99 MediaFileSystemRegistry* registry)
100 : registry_(registry),
101 fsid_(0) {
102 registry_->file_system_context_.reset(this);
103 }
104
105 std::string TestMediaFileSystemContext::RegisterFileSystemForMassStorage(
106 const std::string& device_id, const FilePath& path) {
107 CHECK(MediaStorageUtil::IsMassStorageDevice(device_id));
108 return AddFSEntry(device_id, path);
109 }
110
111 #if defined(SUPPORT_MTP_DEVICE_FILESYSTEM)
112 std::string TestMediaFileSystemContext::RegisterFileSystemForMTPDevice(
113 const std::string& device_id, const FilePath& path,
114 scoped_refptr<ScopedMTPDeviceMapEntry>* entry) {
115 CHECK(!MediaStorageUtil::IsMassStorageDevice(device_id));
116 DCHECK(entry);
117 *entry = registry_->GetOrCreateScopedMTPDeviceMapEntry(path.value());
118 return AddFSEntry(device_id, path);
119 }
120 #endif
121
122 void TestMediaFileSystemContext::RevokeFileSystem(const std::string& fsid) {
123 if (!ContainsKey(file_systems_by_id_, fsid))
124 return;
125 EXPECT_EQ(1U, file_systems_by_id_.erase(fsid));
126 }
127
128 std::string TestMediaFileSystemContext::AddFSEntry(const std::string& device_id,
129 const FilePath& path) {
130 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
131 DCHECK(path.IsAbsolute());
132 DCHECK(!path.ReferencesParent());
133
134 std::string fsid = base::StringPrintf("FSID:%d", ++fsid_);
135 FSInfo info(device_id, path, fsid);
136 file_systems_by_id_[fsid] = info;
137 return fsid;
138 }
139
140 namespace {
141
142 class TestMediaStorageUtil : public MediaStorageUtil {
143 public:
144 static void SetTestingMode();
145
146 static bool GetDeviceInfoFromPathTestFunction(const FilePath& path,
147 std::string* device_id,
148 string16* device_name,
149 FilePath* relative_path);
150 };
151
152 class MockProfileSharedRenderProcessHostFactory
153 : public content::RenderProcessHostFactory {
154 public:
155 MockProfileSharedRenderProcessHostFactory() {}
156 virtual ~MockProfileSharedRenderProcessHostFactory();
157
158 // RPH created with this factory are owned by it. If the RPH is destroyed
159 // for testing purposes, it must be removed from the factory first.
160 content::MockRenderProcessHost* ReleaseRPH(
161 content::BrowserContext* browser_context);
162
163 virtual content::RenderProcessHost* CreateRenderProcessHost(
164 content::BrowserContext* browser_context) const OVERRIDE;
165
166 private:
167 typedef std::map<content::BrowserContext*, content::MockRenderProcessHost*>
168 ProfileRPHMap;
169 mutable ProfileRPHMap rph_map_;
170
171 DISALLOW_COPY_AND_ASSIGN(MockProfileSharedRenderProcessHostFactory);
172 };
173
174 class ProfileState {
175 public:
176 explicit ProfileState(
177 MockProfileSharedRenderProcessHostFactory* rph_factory);
178 ~ProfileState();
179
180 MediaGalleriesPreferences* GetMediaGalleriesPrefs();
181
182 void CheckGalleries(
183 const std::string& test,
184 const std::vector<MediaFileSystemInfo>& regular_extension_galleries,
185 const std::vector<MediaFileSystemInfo>& all_extension_galleries);
186
187 scoped_ptr<TestingProfile> profile;
Lei Zhang 2012/11/15 18:02:32 I think |profile| can be private now.
vandebo (ex-Chrome) 2012/11/16 06:04:32 Done.
188
189 scoped_refptr<extensions::Extension> all_permission_extension;
Lei Zhang 2012/11/15 18:02:32 And these can be private with a simple accessor.
vandebo (ex-Chrome) 2012/11/16 06:04:32 Done.
190 scoped_refptr<extensions::Extension> regular_permission_extension;
191 scoped_refptr<extensions::Extension> no_permissions_extension;
192
193 private:
194 void CompareResults(const std::string& test,
195 const std::vector<MediaFileSystemInfo>& expected,
196 const std::vector<MediaFileSystemInfo>& actual);
197
198 int GetAndClearComparisonCount();
199
200 int num_comparisons_;
201
202 scoped_ptr<content::WebContents> single_web_contents_;
203 scoped_ptr<content::WebContents> shared_web_contents1_;
204 scoped_ptr<content::WebContents> shared_web_contents2_;
205
206 // The RenderProcessHosts are freed when their respective WebContents /
207 // RenderViewHosts go away.
208 content::MockRenderProcessHost* single_rph_;
209 content::MockRenderProcessHost* shared_rph_;
210
211 DISALLOW_COPY_AND_ASSIGN(ProfileState);
212 };
213
214 class MediaFileSystemRegistryTest : public ChromeRenderViewHostTestHarness {
215 public:
216 MediaFileSystemRegistryTest();
217 virtual ~MediaFileSystemRegistryTest() {}
218
219 void CreateProfileState(int profile_count);
220
221 ProfileState* GetProfileState(int i);
222
223 FilePath empty_dir() {
224 return empty_dir_;
225 }
226
227 FilePath dcim_dir() {
228 return dcim_dir_;
229 }
230
231 // Create a user added gallery based on the information passed and add it to
232 // |profiles|. Returns the device id.
233 std::string AddUserGallery(MediaStorageUtil::Type type,
234 const std::string& unique_id,
235 const FilePath& path);
236
237 void AttachDevice(MediaStorageUtil::Type type, const std::string& unique_id,
238 const FilePath& location);
239
240 void DetachDevice(const std::string& device_id);
241
242 void SetGalleryPermission(size_t profile, extensions::Extension* extension,
243 const std::string& device_id, bool has_access);
244
245 void AssertAllAutoAddedGalleries();
246
247 std::vector<MediaFileSystemInfo> GetAutoAddedGalleries(size_t profile);
248
249 protected:
250 void SetUp();
251 void TearDown();
252
253 private:
254 // This makes sure that at least one default gallery exists on the file
255 // system.
256 EnsureMediaDirectoriesExists media_directories_;
257
258 // Some test gallery directories.
259 ScopedTempDir galleries_dir_;
260 // An empty directory in |galleries_dir_|
261 FilePath empty_dir_;
262 // A directory in |galleries_dir_| with a DCIM directory in it.
263 FilePath dcim_dir_;
264
265 // MediaFileSystemRegistry owns this.
266 TestMediaFileSystemContext* test_file_system_context_;
267
268 // Needed for extension service & friends to work.
269 content::TestBrowserThread ui_thread_;
270 content::TestBrowserThread file_thread_;
271
272 MockProfileSharedRenderProcessHostFactory rph_factory_;
273
274 ScopedVector<ProfileState> profile_states_;
275
276 DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistryTest);
277 };
278
279 bool MediaFileSystemInfoComparator(const MediaFileSystemInfo& a,
280 const MediaFileSystemInfo& b) {
281 if (a.name != b.name)
282 return a.name < b.name;
283 if (a.path.value() != b.path.value())
284 return a.path.value() < b.path.value();
285 return a.fsid < b.fsid;
286 }
287
288 //////////////////////////
289 // TestMediaStorageUtil //
290 //////////////////////////
291
292 // static
293 void TestMediaStorageUtil::SetTestingMode() {
294 SetGetDeviceInfoFromPathFunctionForTesting(
295 &GetDeviceInfoFromPathTestFunction);
296 }
297
298 // static
299 bool TestMediaStorageUtil::GetDeviceInfoFromPathTestFunction(
300 const FilePath& path, std::string* device_id, string16* device_name,
301 FilePath* relative_path) {
302 if (device_id)
303 *device_id = MakeDeviceId(FIXED_MASS_STORAGE, path.AsUTF8Unsafe());
304 if (device_name)
305 *device_name = path.BaseName().LossyDisplayName();
306 if (relative_path)
307 *relative_path = FilePath();
308 return true;
309 }
310
311 ///////////////////////////////////////////////
312 // MockProfileSharedRenderProcessHostFactory //
313 ///////////////////////////////////////////////
314
315 MockProfileSharedRenderProcessHostFactory::
316 ~MockProfileSharedRenderProcessHostFactory() {
317 STLDeleteValues(&rph_map_);
318 }
319
320 content::MockRenderProcessHost*
321 MockProfileSharedRenderProcessHostFactory::ReleaseRPH(
322 content::BrowserContext* browser_context) {
323 ProfileRPHMap::iterator existing = rph_map_.find(browser_context);
324 if (existing == rph_map_.end())
325 return NULL;
326 content::MockRenderProcessHost* result = existing->second;
327 rph_map_.erase(existing);
328 return result;
329 }
330
331 content::RenderProcessHost*
332 MockProfileSharedRenderProcessHostFactory::CreateRenderProcessHost(
333 content::BrowserContext* browser_context) const {
334 ProfileRPHMap::const_iterator existing = rph_map_.find(browser_context);
335 if (existing != rph_map_.end())
336 return existing->second;
337 rph_map_[browser_context] =
338 new content::MockRenderProcessHost(browser_context);
339 return rph_map_[browser_context];
340 }
341
342 //////////////////
343 // ProfileState //
344 //////////////////
345
346 ProfileState::ProfileState(
347 MockProfileSharedRenderProcessHostFactory* rph_factory)
348 : profile(new TestingProfile()),
349 num_comparisons_(0) {
350 extensions::TestExtensionSystem* extension_system(
351 static_cast<extensions::TestExtensionSystem*>(
352 extensions::ExtensionSystem::Get(profile.get())));
353 extension_system->CreateExtensionService(
354 CommandLine::ForCurrentProcess(), FilePath(), false);
355
356 std::vector<std::string> all_permissions;
357 all_permissions.push_back("allAutoDetected");
358 all_permissions.push_back("read");
359 std::vector<std::string> read_permissions;
360 read_permissions.push_back("read");
361
362 all_permission_extension =
363 AddMediaGalleriesApp("all", all_permissions, profile.get());
364 regular_permission_extension =
365 AddMediaGalleriesApp("regular", read_permissions, profile.get());
366 no_permissions_extension =
367 AddMediaGalleriesApp("no", read_permissions, profile.get());
368
369 single_web_contents_.reset(
370 content::WebContentsTester::CreateTestWebContents(profile.get(), NULL));
371 single_rph_ = rph_factory->ReleaseRPH(profile.get());
372
373 shared_web_contents1_.reset(
374 content::WebContentsTester::CreateTestWebContents(profile.get(), NULL));
375 shared_web_contents2_.reset(
376 content::WebContentsTester::CreateTestWebContents(profile.get(), NULL));
377 shared_rph_ = rph_factory->ReleaseRPH(profile.get());
378 }
379
380 ProfileState::~ProfileState() {
381 // TestExtensionSystem uses DeleteSoon, so we need to delete the profiles
382 // and then run the message queue to clean up. But first we have to
383 // delete everything that references the profile.
384 single_web_contents_.reset();
385 shared_web_contents1_.reset();
386 shared_web_contents2_.reset();
387 profile.reset();
388
389 MessageLoop::current()->RunUntilIdle();
390 }
391
392 MediaGalleriesPreferences* ProfileState::GetMediaGalleriesPrefs() {
393 return MediaGalleriesPreferencesFactory::GetForProfile(profile.get());
394 }
395
396 void ProfileState::CheckGalleries(
397 const std::string& test,
398 const std::vector<MediaFileSystemInfo>& regular_extension_galleries,
399 const std::vector<MediaFileSystemInfo>& all_extension_galleries) {
400 content::RenderViewHost* rvh = single_web_contents_->GetRenderViewHost();
401
402 // No Media Galleries permissions.
403 std::vector<MediaFileSystemInfo> empty_expectation;
404 MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
405 rvh, no_permissions_extension.get(),
406 base::Bind(&ProfileState::CompareResults, base::Unretained(this),
407 StringPrintf("%s (no permission)", test.c_str()),
408 base::ConstRef(empty_expectation)));
409 MessageLoop::current()->RunUntilIdle();
410 EXPECT_EQ(1, GetAndClearComparisonCount());
411
412 // Read permission only.
413 MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
414 rvh, regular_permission_extension.get(),
415 base::Bind(&ProfileState::CompareResults, base::Unretained(this),
416 StringPrintf("%s (regular permission)", test.c_str()),
417 base::ConstRef(regular_extension_galleries)));
418 MessageLoop::current()->RunUntilIdle();
419 EXPECT_EQ(1, GetAndClearComparisonCount());
420
421 // All galleries permission.
422 MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
423 rvh, all_permission_extension.get(),
424 base::Bind(&ProfileState::CompareResults, base::Unretained(this),
425 StringPrintf("%s (all permission)", test.c_str()),
426 base::ConstRef(all_extension_galleries)));
427 MessageLoop::current()->RunUntilIdle();
428 EXPECT_EQ(1, GetAndClearComparisonCount());
429 }
430
431 void ProfileState::CompareResults(
432 const std::string& test,
433 const std::vector<MediaFileSystemInfo>& expected,
434 const std::vector<MediaFileSystemInfo>& actual) {
435 // Order isn't important, so sort the results. Assume that expected
436 // is already sorted.
437 std::vector<MediaFileSystemInfo> sorted(actual);
438 std::sort(sorted.begin(), sorted.end(), MediaFileSystemInfoComparator);
439
440 num_comparisons_++;
441 EXPECT_EQ(expected.size(), actual.size()) << test;
442 for (size_t i = 0; i < expected.size() && i < actual.size(); i++) {
443 EXPECT_EQ(expected[i].path.value(), actual[i].path.value()) << test;
444 EXPECT_FALSE(actual[i].fsid.empty()) << test;
445 if (!expected[i].fsid.empty())
446 EXPECT_EQ(expected[i].fsid, actual[i].fsid) << test;
447 }
448 }
449
450 int ProfileState::GetAndClearComparisonCount() {
451 int result = num_comparisons_;
452 num_comparisons_ = 0;
453 return result;
454 }
455
456 /////////////////////////////////
457 // MediaFileSystemRegistryTest //
458 /////////////////////////////////
459
460 MediaFileSystemRegistryTest::MediaFileSystemRegistryTest()
461 : ui_thread_(content::BrowserThread::UI, MessageLoop::current()),
462 file_thread_(content::BrowserThread::FILE, MessageLoop::current()) {
463 }
464
465 void MediaFileSystemRegistryTest::CreateProfileState(int profile_count) {
466 for (int i = 0; i < profile_count; i++) {
467 ProfileState * state = new ProfileState(&rph_factory_);
468 profile_states_.push_back(state);
469 }
470 }
471
472 ProfileState* MediaFileSystemRegistryTest::GetProfileState(int i) {
473 return profile_states_[i];
474 }
475
476 std::string MediaFileSystemRegistryTest::AddUserGallery(
477 MediaStorageUtil::Type type,
478 const std::string& unique_id,
479 const FilePath& path) {
480 std::string device_id = MediaStorageUtil::MakeDeviceId(type, unique_id);
481 string16 name = path.LossyDisplayName();
482 DCHECK(!MediaStorageUtil::IsMediaDevice(device_id));
483
484 for (size_t i = 0; i < profile_states_.size(); i++) {
485 profile_states_[i]->GetMediaGalleriesPrefs()->AddGallery(
486 device_id, name, FilePath(), true /*user_added*/);
487 }
488 return device_id;
489 }
490
491 void MediaFileSystemRegistryTest::AttachDevice(MediaStorageUtil::Type type,
492 const std::string& unique_id,
493 const FilePath& location) {
494 std::string device_id = MediaStorageUtil::MakeDeviceId(type, unique_id);
495 DCHECK(MediaStorageUtil::IsRemovableDevice(device_id));
496 string16 name = location.LossyDisplayName();
497 base::SystemMonitor::Get()->ProcessRemovableStorageAttached(device_id, name,
498 location.value());
499 }
500
501 void MediaFileSystemRegistryTest::DetachDevice(const std::string& device_id) {
502 DCHECK(MediaStorageUtil::IsRemovableDevice(device_id));
503 base::SystemMonitor::Get()->ProcessRemovableStorageDetached(device_id);
504 }
505
506 void MediaFileSystemRegistryTest::SetGalleryPermission(
507 size_t profile, extensions::Extension* extension,
508 const std::string& device_id, bool has_access) {
509 MediaGalleriesPreferences* preferences =
510 GetProfileState(profile)->GetMediaGalleriesPrefs();
511 MediaGalleryPrefIdSet pref_id =
512 preferences->LookUpGalleriesByDeviceId(device_id);
513 DCHECK_EQ(1U, pref_id.size());
514 preferences->SetGalleryPermissionForExtension(*extension, *pref_id.begin(),
515 has_access);
516 }
517
518 void MediaFileSystemRegistryTest::AssertAllAutoAddedGalleries() {
519 for (size_t i = 0; i < profile_states_.size(); i++) {
520 MediaGalleriesPreferences* prefs =
521 profile_states_[0]->GetMediaGalleriesPrefs();
522
523 // Make sure that we have at least one gallery and that they are all
524 // auto added galleries.
525 const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries();
526 #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
527 ASSERT_GT(galleries.size(), 0U);
528 #endif
529 for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
530 it != galleries.end();
531 ++it) {
532 ASSERT_EQ(MediaGalleryPrefInfo::kAutoDetected, it->second.type);
533 }
534 }
535 }
536
537 std::vector<MediaFileSystemInfo>
538 MediaFileSystemRegistryTest::GetAutoAddedGalleries(size_t profile) {
539 DCHECK_LT(profile, profile_states_.size());
540 const MediaGalleriesPrefInfoMap& galleries =
541 GetProfileState(profile)->GetMediaGalleriesPrefs()->known_galleries();
542 std::vector<MediaFileSystemInfo> result;
543 for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
544 it != galleries.end();
545 ++it) {
546 if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) {
547 FilePath path = it->second.AbsolutePath();
548 MediaFileSystemInfo info(std::string(), path, std::string());
549 result.push_back(info);
550 }
551 }
552 std::sort(result.begin(), result.end(), MediaFileSystemInfoComparator);
553 return result;
554 }
555
556 void MediaFileSystemRegistryTest::SetUp() {
557 ChromeRenderViewHostTestHarness::SetUp();
558 DeleteContents();
559 SetRenderProcessHostFactory(&rph_factory_);
560
561 TestMediaStorageUtil::SetTestingMode();
562 test_file_system_context_ =
563 new TestMediaFileSystemContext(MediaFileSystemRegistry::GetInstance());
564
565 ASSERT_TRUE(galleries_dir_.CreateUniqueTempDir());
566 empty_dir_ = galleries_dir_.path().AppendASCII("empty");
567 ASSERT_TRUE(file_util::CreateDirectory(empty_dir_));
568 dcim_dir_ = galleries_dir_.path().AppendASCII("with_dcim");
569 ASSERT_TRUE(file_util::CreateDirectory(dcim_dir_));
570 ASSERT_TRUE(file_util::CreateDirectory(dcim_dir_.Append(kDCIMDirectoryName)));
571 }
572
573 void MediaFileSystemRegistryTest::TearDown() {
574 profile_states_.clear();
575 ChromeRenderViewHostTestHarness::TearDown();
576 MediaFileSystemRegistry* registry = MediaFileSystemRegistry::GetInstance();
577 EXPECT_EQ(0U, registry->GetExtensionHostCountForTests());
578 }
579
580 ///////////
581 // Tests //
582 ///////////
583
584 TEST_F(MediaFileSystemRegistryTest, Basic) {
585 CreateProfileState(1);
586 AssertAllAutoAddedGalleries();
587
588 std::vector<MediaFileSystemInfo> empty_expectation;
589 std::vector<MediaFileSystemInfo> auto_galleries = GetAutoAddedGalleries(0);
590 GetProfileState(0)->CheckGalleries("basic", empty_expectation,
591 auto_galleries);
592 }
593
594 TEST_F(MediaFileSystemRegistryTest, UserAddedGallery) {
595 CreateProfileState(1);
596 AssertAllAutoAddedGalleries();
597
598 std::vector<MediaFileSystemInfo> added_galleries;
599 std::vector<MediaFileSystemInfo> auto_galleries = GetAutoAddedGalleries(0);
600 GetProfileState(0)->CheckGalleries("user added init", added_galleries,
601 auto_galleries);
602
603 // Add a user gallery to the regular permission extension.
604 std::string device_id = AddUserGallery(MediaStorageUtil::FIXED_MASS_STORAGE,
605 empty_dir().AsUTF8Unsafe(),
606 empty_dir());
607 SetGalleryPermission(0,
608 GetProfileState(0)->regular_permission_extension.get(),
609 device_id,
610 true /*has access*/);
611 MediaFileSystemInfo added_info(empty_dir().AsUTF8Unsafe(), empty_dir(),
612 std::string());
613 added_galleries.push_back(added_info);
614 GetProfileState(0)->CheckGalleries("user added regular", added_galleries,
615 auto_galleries);
616
617 // Add it to the all galleries extension.
618 SetGalleryPermission(0, GetProfileState(0)->all_permission_extension.get(),
619 device_id, true /*has access*/);
620 auto_galleries.push_back(added_info);
621 GetProfileState(0)->CheckGalleries("user added all", added_galleries,
622 auto_galleries);
623 }
624
625 } // namespace
626
627 } // namespace chrome
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698