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

Unified 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: Fix compile 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/media_gallery/media_file_system_registry_unittest.cc
diff --git a/chrome/browser/media_gallery/media_file_system_registry_unittest.cc b/chrome/browser/media_gallery/media_file_system_registry_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..06a9c7cdd444711e1a5967e58afcffdce566939f
--- /dev/null
+++ b/chrome/browser/media_gallery/media_file_system_registry_unittest.cc
@@ -0,0 +1,674 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// MediaFileSystemRegistry unit tests.
+
+#include "base/command_line.h"
+#include "base/file_util.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_vector.h"
+#include "base/message_loop.h"
+#include "base/scoped_temp_dir.h"
+#include "base/stringprintf.h"
+#include "base/utf_string_conversions.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/extension_system.h"
+#include "chrome/browser/extensions/test_extension_system.h"
+#include "chrome/browser/media_gallery/media_file_system_registry.h"
+#include "chrome/browser/media_gallery/media_galleries_preferences_factory.h"
+#include "chrome/browser/media_gallery/media_galleries_test_util.h"
+#include "chrome/browser/system_monitor/media_storage_util.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_manifest_constants.h"
+#include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "chrome/test/base/testing_profile.h"
+#include "content/public/browser/render_process_host_factory.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/mock_render_process_host.h"
+#include "content/public/test/test_browser_thread.h"
+#include "sync/api/string_ordinal.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace chrome {
+
+class TestMediaFileSystemContext : public MediaFileSystemContext {
+ public:
+ struct FSInfo {
+ FSInfo() {};
Lei Zhang 2012/11/09 09:14:53 nit: no ;
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ FSInfo(const std::string& device_id, const FilePath& path,
+ const std::string& fsid);
+
+ bool operator<(const FSInfo& other) const;
+
+ std::string device_id;
+ FilePath path;
+ std::string fsid;
+ };
+
+ explicit TestMediaFileSystemContext(MediaFileSystemRegistry* registry);
+ virtual ~TestMediaFileSystemContext() {}
+
+ // MediaFileSystemContext implementation.
+ virtual std::string RegisterFileSystemForMassStorage(
+ const std::string& device_id, const FilePath& path) OVERRIDE;
+
+#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM)
+ virtual std::string RegisterFileSystemForMTPDevice(
+ const std::string& device_id, const FilePath& path,
+ scoped_refptr<ScopedMTPDeviceMapEntry>* entry) OVERRIDE;
+#endif
+
+ virtual void RevokeFileSystem(const std::string& fsid) OVERRIDE;
+
+ private:
+ std::string AddFSEntry(const std::string& device_id, const FilePath& path);
+
+ MediaFileSystemRegistry* registry_;
+ int fsid_;
Lei Zhang 2012/11/09 09:14:53 Looks a bit weird when fsid_ is an int but fsid is
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ std::map<std::string /*fsid*/, FSInfo> file_systems_by_id_;
+};
+
+TestMediaFileSystemContext::FSInfo::FSInfo(const std::string& device_id,
+ const FilePath& path,
+ const std::string& fsid)
+ : device_id(device_id),
+ path(path),
+ fsid(fsid) {
+}
+
+bool TestMediaFileSystemContext::FSInfo::operator<(const FSInfo& other) const {
+ if (device_id != other.device_id)
+ return device_id < other.device_id;
+ if (path.value() != other.path.value())
+ return path.value() < other.path.value();
+ return fsid < other.fsid;
+}
+
+TestMediaFileSystemContext::TestMediaFileSystemContext(
+ MediaFileSystemRegistry* registry)
+ : registry_(registry),
+ fsid_(0) {
+ registry_->file_system_context_.reset(this);
+}
+
+std::string TestMediaFileSystemContext::RegisterFileSystemForMassStorage(
+ const std::string& device_id, const FilePath& path) {
+ CHECK(MediaStorageUtil::IsMassStorageDevice(device_id));
+ return AddFSEntry(device_id, path);
+}
+
+#if defined(SUPPORT_MTP_DEVICE_FILESYSTEM)
+std::string TestMediaFileSystemContext::RegisterFileSystemForMTPDevice(
+ const std::string& device_id, const FilePath& path,
+ scoped_refptr<ScopedMTPDeviceMapEntry>* entry) {
+ CHECK(!MediaStorageUtil::IsMassStorageDevice(device_id));
+ DCHECK(entry);
Lei Zhang 2012/11/09 09:14:53 No need for this. If we crash on the next line, it
vandebo (ex-Chrome) 2012/11/13 06:50:18 The segfault might end up being somewhat mysteriou
+ *entry = registry_->GetOrCreateScopedMTPDeviceMapEntry(path.value());
+ return AddFSEntry(device_id, path);
+}
+#endif
+
+void TestMediaFileSystemContext::RevokeFileSystem(const std::string& fsid) {
+ if (!ContainsKey(file_systems_by_id_, fsid))
+ return;
+ EXPECT_EQ(1U, file_systems_by_id_.erase(fsid));
+}
+
+std::string TestMediaFileSystemContext::AddFSEntry(const std::string& device_id,
+ const FilePath& path) {
+ CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Lei Zhang 2012/11/09 09:14:53 we usually dcheck these.
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ CHECK(path.IsAbsolute());
+ CHECK(!path.ReferencesParent());
+
+ std::string fsid = base::StringPrintf("FSID:%d", ++fsid_);
+ FSInfo info(device_id, path, fsid);
+ file_systems_by_id_[fsid] = info;
+ return fsid;
+}
+
+namespace {
+
+class MediaStorageUtilTest : public MediaStorageUtil {
+ public:
+ static void SetTestingMode();
+
+ static bool GetDeviceInfoFromPathTestFunction(const FilePath& path,
+ std::string* device_id,
+ string16* device_name,
+ FilePath* relative_path);
+};
+
+class MockProfileSharedRenderProcessHostFactory
+ : public content::RenderProcessHostFactory {
+ public:
+ MockProfileSharedRenderProcessHostFactory() {}
+ virtual ~MockProfileSharedRenderProcessHostFactory();
+
+ // RPH created with this factory are owned by it. If the RPH is destroyed
+ // for testing purposes, it must be removed from the factory first.
+ content::MockRenderProcessHost* ReleaseRPH(
+ content::BrowserContext* browser_context);
+
+ virtual content::RenderProcessHost* CreateRenderProcessHost(
+ content::BrowserContext* browser_context) const OVERRIDE;
+
+ private:
+ typedef std::map<content::BrowserContext*, content::MockRenderProcessHost*>
+ ProfileRPHMap;
+ mutable ProfileRPHMap rph_map_;
Lei Zhang 2012/11/09 09:14:53 why mutable?
vandebo (ex-Chrome) 2012/11/13 06:50:18 Because RenderProcessHostFactory::CreateRenderProc
+
+ DISALLOW_COPY_AND_ASSIGN(MockProfileSharedRenderProcessHostFactory);
+};
+
+class ProfileState {
+ public:
+ ProfileState();
+ ~ProfileState();
+
+ MediaGalleriesPreferences* GetPrefs();
Lei Zhang 2012/11/09 09:14:53 GetMediaGalleryPrefs? I usually think GetPrefs wou
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+
+ scoped_ptr<TestingProfile> profile;
+
+ scoped_ptr<content::WebContents> single_web_contents;
+ scoped_ptr<content::WebContents> shared_web_contents1;
+ scoped_ptr<content::WebContents> shared_web_contents2;
+
+ // The RenderProcessHosts are freed when their respective WebContents /
+ // RenderViewHosts go away.
+ content::MockRenderProcessHost* single_rph;
+ content::MockRenderProcessHost* shared_rph;
+
+ scoped_refptr<extensions::Extension> all_permission_extension;
+ scoped_refptr<extensions::Extension> regular_permission_extension;
+ scoped_refptr<extensions::Extension> no_permissions_extension;
+
+ private:
+ scoped_refptr<extensions::Extension> AddApp(
+ std::string name,
Lei Zhang 2012/11/09 09:14:53 const ref both parameters?
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ std::vector<std::string> media_galleries_permissions);
+
+ ExtensionService* extension_service_;
+
+ DISALLOW_COPY_AND_ASSIGN(ProfileState);
+};
+
+class MediaFileSystemRegistryTest : public ChromeRenderViewHostTestHarness {
+ public:
+ MediaFileSystemRegistryTest();
+ virtual ~MediaFileSystemRegistryTest() {}
+
+ void CreateProfileState(int profile_count);
+
+ ProfileState* GetProfileState(int i);
+
+ FilePath empty_dir() {
+ return empty_dir_;
+ }
+
+ FilePath dcim_dir() {
+ return dcim_dir_;
+ }
+
+ // Create a user added gallery based on the information passed and add it to
+ // |profiles|. Returns the device id.
+ std::string AddUserGallery(MediaStorageUtil::Type type,
+ const std::string& unique_id,
+ const FilePath& path);
+
+ void AttachDevice(MediaStorageUtil::Type type, const std::string& unique_id,
+ const FilePath& location);
+
+ void DetachDevice(const std::string& device_id);
+
+ void SetGalleryPermission(size_t profile, extensions::Extension* extension,
+ const std::string& device_id, bool has_access);
+
+ void AssertAllAutoAddedGalleries();
+
+ std::vector<MediaFileSystemInfo> GetAutoAddedGalleries(size_t profile);
+
+ void CompareResults(const std::string& test,
+ const std::vector<MediaFileSystemInfo>& expected,
+ const std::vector<MediaFileSystemInfo>& actual);
+
+ int GetAndClearComparisonCount();
+
+ void CheckGalleriesForProfile(size_t profile, const std::string& test,
+ const std::vector<MediaFileSystemInfo>& regular_extension_galleries,
+ const std::vector<MediaFileSystemInfo>& all_extension_galleries);
+
+ protected:
+ void SetUp();
+ void TearDown();
+
+ private:
+ // This makes sure that at least one default gallery exists on the file
+ // system.
+ EnsureMediaDirectoriesExists media_directories_;
+
+ // Some test gallery directories.
+ ScopedTempDir galleries_dir_;
+ FilePath empty_dir_;
Lei Zhang 2012/11/09 09:14:53 Can you mention these are inside |galleries_dir_|
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ FilePath dcim_dir_;
+
+ // MediaFileSystemRegistry owns this.
+ TestMediaFileSystemContext* test_file_system_context_;
+
+ // Needed for extension service & friends to work.
+ content::TestBrowserThread ui_thread_;
+ content::TestBrowserThread file_thread_;
+
+ MockProfileSharedRenderProcessHostFactory rph_factory_;
+
+ ScopedVector<ProfileState> profile_state_;
Lei Zhang 2012/11/09 09:14:53 nit: profile_states_
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+
+ int num_comparisons_;
+
+ DISALLOW_COPY_AND_ASSIGN(MediaFileSystemRegistryTest);
+};
+
+bool MediaFileSystemInfoComparator(const MediaFileSystemInfo& a,
+ const MediaFileSystemInfo& b) {
+ if (a.name != b.name)
+ return a.name < b.name;
+ if (a.path.value() != b.path.value())
+ return a.path.value() < b.path.value();
+ return a.fsid < b.fsid;
+}
+
+//////////////////////////
+// MediaStorageUtilTest //
+//////////////////////////
+
+// static
+void MediaStorageUtilTest::SetTestingMode() {
+ SetGetDeviceInfoFromPathFunctionForTesting(
+ &GetDeviceInfoFromPathTestFunction);
+}
+
+// static
+bool MediaStorageUtilTest::GetDeviceInfoFromPathTestFunction(
+ const FilePath& path, std::string* device_id, string16* device_name,
+ FilePath* relative_path) {
+ if (device_id)
+ *device_id = MakeDeviceId(FIXED_MASS_STORAGE, path.AsUTF8Unsafe());
+ if (device_name)
+ *device_name = path.BaseName().LossyDisplayName();
+ if (relative_path)
+ *relative_path = FilePath();
+ return true;
+}
+
+///////////////////////////////////////////////
+// MockProfileSharedRenderProcessHostFactory //
+///////////////////////////////////////////////
+
+MockProfileSharedRenderProcessHostFactory::
+ ~MockProfileSharedRenderProcessHostFactory() {
+ for (ProfileRPHMap::const_iterator it = rph_map_.begin();
Lei Zhang 2012/11/09 09:14:53 This entire dtor is just a call to STLDeleteValues
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ it != rph_map_.end();
+ ++it) {
+ delete it->second;
+ }
+ rph_map_.clear();
+}
+
+content::MockRenderProcessHost*
+MockProfileSharedRenderProcessHostFactory::ReleaseRPH(
+ content::BrowserContext* browser_context) {
+ ProfileRPHMap::iterator existing = rph_map_.find(browser_context);
+ if (existing == rph_map_.end())
+ return NULL;
+ content::MockRenderProcessHost* result = existing->second;
+ rph_map_.erase(existing);
+ return result;
+}
+
+content::RenderProcessHost*
+MockProfileSharedRenderProcessHostFactory::CreateRenderProcessHost(
+ content::BrowserContext* browser_context) const {
+ ProfileRPHMap::const_iterator existing = rph_map_.find(browser_context);
+ if (existing != rph_map_.end())
+ return existing->second;
+ rph_map_[browser_context] =
+ new content::MockRenderProcessHost(browser_context);
+ return rph_map_[browser_context];
+}
+
+//////////////////
+// ProfileState //
+//////////////////
+
+ProfileState::ProfileState()
+ : profile(new TestingProfile()),
+ extension_service_(NULL) {
+ extensions::TestExtensionSystem* extension_system(
+ static_cast<extensions::TestExtensionSystem*>(
+ extensions::ExtensionSystem::Get(profile.get())));
+ extension_service_ = extension_system->CreateExtensionService(
+ CommandLine::ForCurrentProcess(), FilePath(), false);
+
+ std::vector<std::string> all_permissions;
+ all_permissions.push_back("allAutoDetected");
+ all_permissions.push_back("read");
+ std::vector<std::string> read_permissions;
+ read_permissions.push_back("read");
+
+ all_permission_extension = AddApp("all", all_permissions);
+ regular_permission_extension = AddApp("regular", read_permissions);
+ no_permissions_extension = AddApp("no", read_permissions);
+}
+
+ProfileState::~ProfileState() {
+ // TestExtensionSystem uses DeleteSoon, so we need to delete the profiles
+ // and then run the message queue to clean up. But first we have to
+ // delete everything that references the profile.
+ single_web_contents.reset();
+ shared_web_contents1.reset();
+ shared_web_contents2.reset();
+ profile.reset();
+
+ MessageLoop::current()->RunUntilIdle();
+}
+
+MediaGalleriesPreferences* ProfileState::GetPrefs() {
+ return MediaGalleriesPreferencesFactory::GetForProfile(profile.get());
+}
+
+scoped_refptr<extensions::Extension> ProfileState::AddApp(
Lei Zhang 2012/11/09 09:14:53 Don't we have something similar to this in chrome/
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ std::string name,
+ std::vector<std::string> media_galleries_permissions) {
+ scoped_ptr<DictionaryValue> manifest(new DictionaryValue);
+ manifest->SetString(extension_manifest_keys::kName, name);
+ manifest->SetString(extension_manifest_keys::kVersion, "0.1");
+ manifest->SetInteger(extension_manifest_keys::kManifestVersion, 2);
+ ListValue* background_script_list = new ListValue;
+ background_script_list->Append(Value::CreateStringValue("background.js"));
+ manifest->Set(extension_manifest_keys::kPlatformAppBackgroundScripts,
+ background_script_list);
+
+ ListValue* permission_detail_list = new ListValue;
+ for (size_t i = 0; i < media_galleries_permissions.size(); i++)
+ permission_detail_list->Append(
+ Value::CreateStringValue(media_galleries_permissions[i]));
+ DictionaryValue* media_galleries_permission = new DictionaryValue();
+ media_galleries_permission->Set("mediaGalleries", permission_detail_list);
+ ListValue* permission_list = new ListValue;
+ permission_list->Append(media_galleries_permission);
+ manifest->Set(extension_manifest_keys::kPermissions, permission_list);
+
+ FilePath path = profile->GetPath().Append(name);
+ std::string errors;
+ scoped_refptr<extensions::Extension> extension =
+ extensions::Extension::Create(path, extensions::Extension::INTERNAL,
+ *manifest.get(),
+ extensions::Extension::NO_FLAGS, &errors);
+ EXPECT_TRUE(extension.get() != NULL) << errors;
+ EXPECT_TRUE(extensions::Extension::IdIsValid(extension->id()));
+ if (!extension.get() || !extensions::Extension::IdIsValid(extension->id()))
+ return NULL;
+
+ extension_service_->extension_prefs()->OnExtensionInstalled(
+ extension.get(), extensions::Extension::ENABLED,
+ syncer::StringOrdinal::CreateInitialOrdinal());
+
+ extension_service_->AddExtension(extension);
+ extension_service_->EnableExtension(extension->id());
+
+ return extension;
+}
+
+/////////////////////////////////
+// MediaFileSystemRegistryTest //
+/////////////////////////////////
+
+MediaFileSystemRegistryTest::MediaFileSystemRegistryTest()
+ : ui_thread_(content::BrowserThread::UI, MessageLoop::current()),
+ file_thread_(content::BrowserThread::FILE, MessageLoop::current()),
+ num_comparisons_(0) {
+}
+
+void MediaFileSystemRegistryTest::CreateProfileState(int profile_count) {
+ for (int i = 0; i < profile_count; i++) {
+ ProfileState * state = new ProfileState;
+ profile_state_.push_back(state);
+
+ // Temporarily set the profile while we use it.
+ content::BrowserContext* profile = state->profile.get();
+ browser_context_.reset(profile);
Lei Zhang 2012/11/09 09:14:53 Do you have to do this? Can you use WebContentsTes
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+
+ state->single_web_contents.reset(CreateTestWebContents());
+ state->single_rph = rph_factory_.ReleaseRPH(profile);
+
+ state->shared_web_contents1.reset(CreateTestWebContents());
+ state->shared_web_contents2.reset(CreateTestWebContents());
+ state->shared_rph = rph_factory_.ReleaseRPH(profile);
+
+ // And release it when we're done, assign it to appease the compile.
+ profile = browser_context_.release();
+ }
+}
+
+ProfileState* MediaFileSystemRegistryTest::GetProfileState(int i) {
+ return profile_state_[i];
+}
+
+// Create a user added gallery based on the information passed and add it to
Lei Zhang 2012/11/09 09:14:53 no need for a second copy of comments.
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+// |profiles|. Returns the device id.
+std::string MediaFileSystemRegistryTest::AddUserGallery(
+ MediaStorageUtil::Type type,
+ const std::string& unique_id,
+ const FilePath& path) {
+ std::string device_id = MediaStorageUtil::MakeDeviceId(type, unique_id);
+ string16 name = path.LossyDisplayName();
+ DCHECK(!MediaStorageUtil::IsMediaDevice(device_id));
+
+ for (size_t i = 0; i < profile_state_.size(); i++) {
+ profile_state_[i]->GetPrefs()->AddGallery(device_id, name, FilePath(),
+ true /*user_added*/);
+ }
+ return device_id;
+}
+
+void MediaFileSystemRegistryTest::AttachDevice(MediaStorageUtil::Type type,
+ const std::string& unique_id,
+ const FilePath& location) {
+ std::string device_id = MediaStorageUtil::MakeDeviceId(type, unique_id);
+ DCHECK(MediaStorageUtil::IsRemovableDevice(device_id));
+ string16 name = location.LossyDisplayName();
+ base::SystemMonitor::Get()->ProcessRemovableStorageAttached(device_id, name,
+ location.value());
Lei Zhang 2012/11/09 09:14:53 indentation
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+}
+
+void MediaFileSystemRegistryTest::DetachDevice(const std::string& device_id) {
+ DCHECK(MediaStorageUtil::IsRemovableDevice(device_id));
+ base::SystemMonitor::Get()->ProcessRemovableStorageDetached(device_id);
+}
+
+void MediaFileSystemRegistryTest::SetGalleryPermission(
+ size_t profile, extensions::Extension* extension,
+ const std::string& device_id, bool has_access) {
+ MediaGalleriesPreferences* preferences = GetProfileState(profile)->GetPrefs();
+ MediaGalleryPrefIdSet pref_id =
+ preferences->LookUpGalleriesByDeviceId(device_id);
+ DCHECK_EQ(1U, pref_id.size());
+ preferences->SetGalleryPermissionForExtension(*extension, *pref_id.begin(),
+ has_access);
+}
+
+void MediaFileSystemRegistryTest::AssertAllAutoAddedGalleries() {
+ for (size_t i = 0; i < profile_state_.size(); i++) {
+ MediaGalleriesPreferences* prefs = profile_state_[0]->GetPrefs();
+
+ // Make sure that we have at least one gallery and that they are all
+ // auto added galleries.
+ const MediaGalleriesPrefInfoMap& galleries = prefs->known_galleries();
+ ASSERT_LT(0U, galleries.size());
Lei Zhang 2012/11/09 09:14:53 Unlike _EQ, there's not "expected" value here. So
vandebo (ex-Chrome) 2012/11/13 06:50:18 Done.
+ for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
+ it != galleries.end();
+ ++it) {
+ ASSERT_EQ(MediaGalleryPrefInfo::kAutoDetected, it->second.type);
+ }
+ }
+}
+
+std::vector<MediaFileSystemInfo>
+MediaFileSystemRegistryTest::GetAutoAddedGalleries(size_t profile) {
+ DCHECK_LT(profile, profile_state_.size());
+ const MediaGalleriesPrefInfoMap& galleries =
+ GetProfileState(profile)->GetPrefs()->known_galleries();
+ std::vector<MediaFileSystemInfo> result;
+ for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
+ it != galleries.end();
+ ++it) {
+ if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) {
+ FilePath path = it->second.AbsolutePath();
+ MediaFileSystemInfo info(std::string(), path, std::string());
+ result.push_back(info);
+ }
+ }
+ std::sort(result.begin(), result.end(), MediaFileSystemInfoComparator);
+ return result;
+}
+
+void MediaFileSystemRegistryTest::CompareResults(
+ const std::string& test,
+ const std::vector<MediaFileSystemInfo>& expected,
+ const std::vector<MediaFileSystemInfo>& actual) {
+ // Order isn't important, so sort the results. Assume that expected
+ // is already sorted.
+ std::vector<MediaFileSystemInfo> sorted(actual);
+ std::sort(sorted.begin(), sorted.end(), MediaFileSystemInfoComparator);
+
+ num_comparisons_++;
+ EXPECT_EQ(expected.size(), actual.size()) << test;
+ for (size_t i = 0; i < expected.size(); i++) {
+ EXPECT_EQ(expected[i].path.value(), actual[i].path.value()) << test;
+ EXPECT_FALSE(actual[i].fsid.empty()) << test;
+ if (!expected[i].fsid.empty())
+ EXPECT_EQ(expected[i].fsid, actual[i].fsid) << test;
+ }
+}
+
+int MediaFileSystemRegistryTest::GetAndClearComparisonCount() {
+ int result = num_comparisons_;
+ num_comparisons_ = 0;
+ return result;
+}
+
+void MediaFileSystemRegistryTest::CheckGalleriesForProfile(
+ size_t profile,
+ const std::string& test,
+ const std::vector<MediaFileSystemInfo>& regular_extension_galleries,
+ const std::vector<MediaFileSystemInfo>& all_extension_galleries) {
+ content::RenderViewHost* rvh =
+ GetProfileState(profile)->single_web_contents->GetRenderViewHost();
+
+ // No Media Galleries permissions.
+ std::vector<MediaFileSystemInfo> empty_expectation;
+ MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
+ rvh, GetProfileState(profile)->no_permissions_extension.get(),
+ base::Bind(&MediaFileSystemRegistryTest::CompareResults,
+ base::Unretained(this),
+ StringPrintf("%s (no permission)", test.c_str()),
+ base::ConstRef(empty_expectation)));
+ MessageLoop::current()->RunUntilIdle();
+ EXPECT_EQ(1, GetAndClearComparisonCount());
+
+ // Read permission only.
+ MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
+ rvh, GetProfileState(profile)->regular_permission_extension.get(),
+ base::Bind(&MediaFileSystemRegistryTest::CompareResults,
+ base::Unretained(this),
+ StringPrintf("%s (regular permission)", test.c_str()),
+ base::ConstRef(regular_extension_galleries)));
+ MessageLoop::current()->RunUntilIdle();
+ EXPECT_EQ(1, GetAndClearComparisonCount());
+
+ // All galleries permission.
+ MediaFileSystemRegistry::GetInstance()->GetMediaFileSystemsForExtension(
+ rvh, GetProfileState(profile)->all_permission_extension.get(),
+ base::Bind(&MediaFileSystemRegistryTest::CompareResults,
+ base::Unretained(this),
+ StringPrintf("%s (all permission)", test.c_str()),
+ base::ConstRef(all_extension_galleries)));
+ MessageLoop::current()->RunUntilIdle();
+ EXPECT_EQ(1, GetAndClearComparisonCount());
+}
+
+void MediaFileSystemRegistryTest::SetUp() {
+ ChromeRenderViewHostTestHarness::SetUp();
+ DeleteContents();
+ SetRenderProcessHostFactory(&rph_factory_);
+
+ MediaStorageUtilTest::SetTestingMode();
+ test_file_system_context_ =
+ new TestMediaFileSystemContext(MediaFileSystemRegistry::GetInstance());
+
+ ASSERT_TRUE(galleries_dir_.CreateUniqueTempDir());
+ empty_dir_ = galleries_dir_.path().Append(FILE_PATH_LITERAL("empty"));
+ ASSERT_TRUE(file_util::CreateDirectory(empty_dir_));
+ dcim_dir_ = galleries_dir_.path().Append(FILE_PATH_LITERAL("with_dcim"));
+ ASSERT_TRUE(file_util::CreateDirectory(dcim_dir_));
+ ASSERT_TRUE(file_util::CreateDirectory(dcim_dir_.Append("DCIM")));
+}
+
+void MediaFileSystemRegistryTest::TearDown() {
+ profile_state_.clear();
+ ChromeRenderViewHostTestHarness::TearDown();
+ MediaFileSystemRegistry* registry = MediaFileSystemRegistry::GetInstance();
+ EXPECT_EQ(0U, registry->GetExtensionHostCountForTests());
+}
+
+///////////
+// Tests //
+///////////
+
+TEST_F(MediaFileSystemRegistryTest, Basic) {
+ CreateProfileState(1);
+ AssertAllAutoAddedGalleries();
+
+ std::vector<MediaFileSystemInfo> empty_expectation;
+ std::vector<MediaFileSystemInfo> auto_galleries = GetAutoAddedGalleries(0);
+ CheckGalleriesForProfile(0, "basic", empty_expectation, auto_galleries);
+}
+
+TEST_F(MediaFileSystemRegistryTest, UserAddedGallery) {
+ CreateProfileState(1);
+ AssertAllAutoAddedGalleries();
+
+ std::vector<MediaFileSystemInfo> added_galleries;
+ std::vector<MediaFileSystemInfo> auto_galleries = GetAutoAddedGalleries(0);
+ CheckGalleriesForProfile(0, "user added init", added_galleries,
+ auto_galleries);
+
+ // Add a user gallery to the regular permission extension.
+ std::string device_id = AddUserGallery(MediaStorageUtil::FIXED_MASS_STORAGE,
+ empty_dir().AsUTF8Unsafe(),
+ empty_dir());
+ SetGalleryPermission(0,
+ GetProfileState(0)->regular_permission_extension.get(),
+ device_id,
+ true /*has access*/);
+ MediaFileSystemInfo added_info(empty_dir().AsUTF8Unsafe(), empty_dir(),
+ std::string());
+ added_galleries.push_back(added_info);
+ CheckGalleriesForProfile(0, "user added regular", added_galleries,
+ auto_galleries);
+
+ // Add it to the all galleries extension.
+ SetGalleryPermission(0, GetProfileState(0)->all_permission_extension.get(),
+ device_id, true /*has access*/);
+ auto_galleries.push_back(added_info);
+ CheckGalleriesForProfile(0, "user added all", added_galleries,
+ auto_galleries);
+}
+
+} // namespace
+
+} // namespace chrome

Powered by Google App Engine
This is Rietveld 408576698