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 #include "chrome/browser/media_galleries/media_galleries_test_util.h" 6 7 #if defined(OS_WIN) 8 #include <windows.h> 9 #endif 10 11 #include "base/base_paths.h" 12 #include "base/file_util.h" 13 #include "base/files/file_path.h" 14 #include "base/path_service.h" 15 #include "base/strings/stringprintf.h" 16 #include "chrome/browser/extensions/extension_service.h" 17 #include "chrome/browser/media_galleries/fileapi/picasa_finder.h" 18 #include "chrome/browser/profiles/profile.h" 19 #include "chrome/common/chrome_paths.h" 20 #include "extensions/browser/extension_prefs.h" 21 #include "extensions/browser/extension_system.h" 22 #include "extensions/common/extension.h" 23 #include "extensions/common/manifest_constants.h" 24 #include "testing/gtest/include/gtest/gtest.h" 25 26 #if defined(OS_MACOSX) 27 #include "base/mac/foundation_util.h" 28 #include "base/strings/sys_string_conversions.h" 29 #include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h" 30 #include "components/policy/core/common/preferences_mock_mac.h" 31 #endif // OS_MACOSX 32 33 #if defined(OS_WIN) 34 #include "base/test/test_reg_util_win.h" 35 #include "base/win/registry.h" 36 #endif // OS_WIN 37 38 scoped_refptr<extensions::Extension> AddMediaGalleriesApp( 39 const std::string& name, 40 const std::vector<std::string>& media_galleries_permissions, 41 Profile* profile) { 42 scoped_ptr<base::DictionaryValue> manifest(new base::DictionaryValue); 43 manifest->SetString(extensions::manifest_keys::kName, name); 44 manifest->SetString(extensions::manifest_keys::kVersion, "0.1"); 45 manifest->SetInteger(extensions::manifest_keys::kManifestVersion, 2); 46 base::ListValue* background_script_list = new base::ListValue; 47 background_script_list->Append( 48 base::Value::CreateStringValue("background.js")); 49 manifest->Set(extensions::manifest_keys::kPlatformAppBackgroundScripts, 50 background_script_list); 51 52 base::ListValue* permission_detail_list = new base::ListValue; 53 for (size_t i = 0; i < media_galleries_permissions.size(); i++) 54 permission_detail_list->Append( 55 base::Value::CreateStringValue(media_galleries_permissions[i])); 56 base::DictionaryValue* media_galleries_permission = 57 new base::DictionaryValue(); 58 media_galleries_permission->Set("mediaGalleries", permission_detail_list); 59 base::ListValue* permission_list = new base::ListValue; 60 permission_list->Append(media_galleries_permission); 61 manifest->Set(extensions::manifest_keys::kPermissions, permission_list); 62 63 extensions::ExtensionPrefs* extension_prefs = 64 extensions::ExtensionPrefs::Get(profile); 65 base::FilePath path = extension_prefs->install_directory().AppendASCII(name); 66 std::string errors; 67 scoped_refptr<extensions::Extension> extension = 68 extensions::Extension::Create(path, extensions::Manifest::INTERNAL, 69 *manifest.get(), 70 extensions::Extension::NO_FLAGS, &errors); 71 EXPECT_TRUE(extension.get() != NULL) << errors; 72 EXPECT_TRUE(extensions::Extension::IdIsValid(extension->id())); 73 if (!extension.get() || !extensions::Extension::IdIsValid(extension->id())) 74 return NULL; 75 76 extension_prefs->OnExtensionInstalled( 77 extension.get(), 78 extensions::Extension::ENABLED, 79 syncer::StringOrdinal::CreateInitialOrdinal(), 80 std::string()); 81 ExtensionService* extension_service = 82 extensions::ExtensionSystem::Get(profile)->extension_service(); 83 extension_service->AddExtension(extension.get()); 84 extension_service->EnableExtension(extension->id()); 85 86 return extension; 87 } 88 89 EnsureMediaDirectoriesExists::EnsureMediaDirectoriesExists() 90 : num_galleries_(0) { 91 Init(); 92 } 93 94 EnsureMediaDirectoriesExists::~EnsureMediaDirectoriesExists() { 95 #if defined(OS_MACOSX) 96 iapps::SetMacPreferencesForTesting(NULL); 97 picasa::SetMacPreferencesForTesting(NULL); 98 #endif // OS_MACOSX 99 } 100 101 base::FilePath EnsureMediaDirectoriesExists::GetFakeAppDataPath() const { 102 DCHECK(fake_dir_.IsValid()); 103 return fake_dir_.path().AppendASCII("appdata"); 104 } 105 106 #if defined(OS_WIN) 107 base::FilePath EnsureMediaDirectoriesExists::GetFakeLocalAppDataPath() const { 108 DCHECK(fake_dir_.IsValid()); 109 return fake_dir_.path().AppendASCII("localappdata"); 110 } 111 112 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath( 113 const base::FilePath& path) { 114 base::win::RegKey key(HKEY_CURRENT_USER, picasa::kPicasaRegistryPath, 115 KEY_SET_VALUE); 116 key.WriteValue(picasa::kPicasaRegistryAppDataPathKey, path.value().c_str()); 117 } 118 #endif // OS_WIN 119 120 #if defined(OS_MACOSX) 121 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath( 122 const base::FilePath& path) { 123 mac_preferences_->AddTestItem( 124 base::mac::NSToCFCast(picasa::kPicasaAppDataPathMacPreferencesKey), 125 base::SysUTF8ToNSString(path.value()), 126 false); 127 } 128 #endif // OS_MACOSX 129 130 #if defined(OS_WIN) || defined(OS_MACOSX) 131 base::FilePath 132 EnsureMediaDirectoriesExists::GetFakePicasaFoldersRootPath() const { 133 DCHECK(fake_dir_.IsValid()); 134 return fake_dir_.path().AppendASCII("picasa_folders"); 135 } 136 #endif // OS_WIN || OS_MACOSX 137 138 #if defined(OS_MACOSX) 139 base::FilePath EnsureMediaDirectoriesExists::GetFakeITunesRootPath() const { 140 DCHECK(fake_dir_.IsValid()); 141 return fake_dir_.path().AppendASCII("itunes"); 142 } 143 144 base::FilePath EnsureMediaDirectoriesExists::GetFakeIPhotoRootPath() const { 145 DCHECK(fake_dir_.IsValid()); 146 return fake_dir_.path().AppendASCII("iphoto"); 147 } 148 #endif // OS_MACOSX 149 150 void EnsureMediaDirectoriesExists::Init() { 151 #if defined(OS_CHROMEOS) || defined(OS_ANDROID) 152 return; 153 #else 154 155 ASSERT_TRUE(fake_dir_.CreateUniqueTempDir()); 156 157 #if defined(OS_WIN) || defined(OS_MACOSX) 158 // This is to control whether or not tests think iTunes (on Windows) and 159 // Picasa are installed. 160 app_data_override_.reset(new base::ScopedPathOverride( 161 base::DIR_APP_DATA, GetFakeAppDataPath())); 162 #endif // OS_WIN || OS_MACOSX 163 164 #if defined(OS_WIN) 165 // Picasa on Windows is by default in the DIR_LOCAL_APP_DATA directory. 166 local_app_data_override_.reset(new base::ScopedPathOverride( 167 base::DIR_LOCAL_APP_DATA, GetFakeLocalAppDataPath())); 168 // Picasa also looks in the registry for an alternate path. 169 registry_override_.OverrideRegistry(HKEY_CURRENT_USER, L"hkcu_picasa"); 170 #endif // OS_WIN 171 172 #if defined(OS_MACOSX) 173 mac_preferences_.reset(new MockPreferences); 174 175 // iTunes override. 176 base::FilePath itunes_xml = 177 GetFakeITunesRootPath().AppendASCII("iTunes Library.xml"); 178 mac_preferences_->AddTestItem( 179 base::mac::NSToCFCast(iapps::kITunesRecentDatabasePathsKey), 180 base::mac::NSToCFCast(iapps::NSArrayFromFilePath(itunes_xml)), 181 false); 182 183 // iPhoto override. 184 base::FilePath iphoto_xml = 185 GetFakeIPhotoRootPath().AppendASCII("AlbumData.xml"); 186 mac_preferences_->AddTestItem( 187 base::mac::NSToCFCast(iapps::kIPhotoRecentDatabasesKey), 188 base::mac::NSToCFCast(iapps::NSArrayFromFilePath(iphoto_xml)), 189 false); 190 191 iapps::SetMacPreferencesForTesting(mac_preferences_.get()); 192 picasa::SetMacPreferencesForTesting(mac_preferences_.get()); 193 #endif // OS_MACOSX 194 195 music_override_.reset(new base::ScopedPathOverride( 196 chrome::DIR_USER_MUSIC, fake_dir_.path().AppendASCII("music"))); 197 pictures_override_.reset(new base::ScopedPathOverride( 198 chrome::DIR_USER_PICTURES, fake_dir_.path().AppendASCII("pictures"))); 199 video_override_.reset(new base::ScopedPathOverride( 200 chrome::DIR_USER_VIDEOS, fake_dir_.path().AppendASCII("videos"))); 201 num_galleries_ = 3; 202 #endif // OS_CHROMEOS || OS_ANDROID 203 } 204 205 base::FilePath MakeMediaGalleriesTestingPath(const std::string& dir) { 206 #if defined(OS_WIN) 207 return base::FilePath(FILE_PATH_LITERAL("C:\\")).AppendASCII(dir); 208 #elif defined(OS_POSIX) 209 return base::FilePath(FILE_PATH_LITERAL("/")).Append(dir); 210 #else 211 NOTREACHED(); 212 #endif 213 } 214