Home | History | Annotate | Download | only in media_galleries
      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/files/file_path.h"
     13 #include "base/files/file_util.h"
     14 #include "base/path_service.h"
     15 #include "base/strings/string_number_conversions.h"
     16 #include "base/strings/stringprintf.h"
     17 #include "chrome/browser/extensions/extension_service.h"
     18 #include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
     19 #include "chrome/browser/profiles/profile.h"
     20 #include "chrome/common/chrome_paths.h"
     21 #include "components/crx_file/id_util.h"
     22 #include "extensions/browser/extension_prefs.h"
     23 #include "extensions/browser/extension_system.h"
     24 #include "extensions/common/manifest_constants.h"
     25 #include "testing/gtest/include/gtest/gtest.h"
     26 
     27 #if defined(OS_MACOSX)
     28 #include "base/mac/foundation_util.h"
     29 #include "base/strings/sys_string_conversions.h"
     30 #include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h"
     31 #include "components/policy/core/common/preferences_mock_mac.h"
     32 #endif  // OS_MACOSX
     33 
     34 #if defined(OS_WIN)
     35 #include "base/test/test_reg_util_win.h"
     36 #include "base/win/registry.h"
     37 #endif  // OS_WIN
     38 
     39 scoped_refptr<extensions::Extension> AddMediaGalleriesApp(
     40     const std::string& name,
     41     const std::vector<std::string>& media_galleries_permissions,
     42     Profile* profile) {
     43   scoped_ptr<base::DictionaryValue> manifest(new base::DictionaryValue);
     44   manifest->SetString(extensions::manifest_keys::kName, name);
     45   manifest->SetString(extensions::manifest_keys::kVersion, "0.1");
     46   manifest->SetInteger(extensions::manifest_keys::kManifestVersion, 2);
     47   base::ListValue* background_script_list = new base::ListValue;
     48   background_script_list->Append(new base::StringValue("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         new base::StringValue(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(crx_file::id_util::IdIsValid(extension->id()));
     73   if (!extension.get() || !crx_file::id_util::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), times_overrides_changed_(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 void EnsureMediaDirectoriesExists::ChangeMediaPathOverrides() {
    102   // Each pointer must be reset an extra time so as to destroy the existing
    103   // override prior to creating a new one. This is because the PathService,
    104   // which supports these overrides, only allows one override to exist per path
    105   // in its internal bookkeeping; attempting to add a second override invokes
    106   // a CHECK crash.
    107   music_override_.reset();
    108   std::string music_path_string("music");
    109   music_path_string.append(base::IntToString(times_overrides_changed_));
    110   music_override_.reset(new base::ScopedPathOverride(
    111       chrome::DIR_USER_MUSIC,
    112       fake_dir_.path().AppendASCII(music_path_string)));
    113 
    114   pictures_override_.reset();
    115   std::string pictures_path_string("pictures");
    116   pictures_path_string.append(base::IntToString(times_overrides_changed_));
    117   pictures_override_.reset(new base::ScopedPathOverride(
    118       chrome::DIR_USER_PICTURES,
    119       fake_dir_.path().AppendASCII(pictures_path_string)));
    120 
    121   video_override_.reset();
    122   std::string videos_path_string("videos");
    123   videos_path_string.append(base::IntToString(times_overrides_changed_));
    124   video_override_.reset(new base::ScopedPathOverride(
    125       chrome::DIR_USER_VIDEOS,
    126       fake_dir_.path().AppendASCII(videos_path_string)));
    127 
    128   times_overrides_changed_++;
    129 
    130   num_galleries_ = 3;
    131 }
    132 
    133 base::FilePath EnsureMediaDirectoriesExists::GetFakeAppDataPath() const {
    134   DCHECK(fake_dir_.IsValid());
    135   return fake_dir_.path().AppendASCII("appdata");
    136 }
    137 
    138 #if defined(OS_WIN)
    139 base::FilePath EnsureMediaDirectoriesExists::GetFakeLocalAppDataPath() const {
    140   DCHECK(fake_dir_.IsValid());
    141   return fake_dir_.path().AppendASCII("localappdata");
    142 }
    143 
    144 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath(
    145     const base::FilePath& path) {
    146   base::win::RegKey key(HKEY_CURRENT_USER, picasa::kPicasaRegistryPath,
    147                         KEY_SET_VALUE);
    148   key.WriteValue(picasa::kPicasaRegistryAppDataPathKey, path.value().c_str());
    149 }
    150 #endif  // OS_WIN
    151 
    152 #if defined(OS_MACOSX)
    153 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath(
    154     const base::FilePath& path) {
    155   mac_preferences_->AddTestItem(
    156       base::mac::NSToCFCast(picasa::kPicasaAppDataPathMacPreferencesKey),
    157       base::SysUTF8ToNSString(path.value()),
    158       false);
    159 }
    160 #endif  // OS_MACOSX
    161 
    162 #if defined(OS_WIN) || defined(OS_MACOSX)
    163 base::FilePath
    164 EnsureMediaDirectoriesExists::GetFakePicasaFoldersRootPath() const {
    165   DCHECK(fake_dir_.IsValid());
    166   return fake_dir_.path().AppendASCII("picasa_folders");
    167 }
    168 #endif  // OS_WIN || OS_MACOSX
    169 
    170 #if defined(OS_MACOSX)
    171 base::FilePath EnsureMediaDirectoriesExists::GetFakeITunesRootPath() const {
    172   DCHECK(fake_dir_.IsValid());
    173   return fake_dir_.path().AppendASCII("itunes");
    174 }
    175 
    176 base::FilePath EnsureMediaDirectoriesExists::GetFakeIPhotoRootPath() const {
    177   DCHECK(fake_dir_.IsValid());
    178   return fake_dir_.path().AppendASCII("iphoto");
    179 }
    180 #endif  // OS_MACOSX
    181 
    182 void EnsureMediaDirectoriesExists::Init() {
    183 #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
    184   return;
    185 #else
    186 
    187   ASSERT_TRUE(fake_dir_.CreateUniqueTempDir());
    188 
    189 #if defined(OS_WIN) || defined(OS_MACOSX)
    190   // This is to control whether or not tests think iTunes (on Windows) and
    191   // Picasa are installed.
    192   app_data_override_.reset(new base::ScopedPathOverride(
    193       base::DIR_APP_DATA, GetFakeAppDataPath()));
    194 #endif  // OS_WIN || OS_MACOSX
    195 
    196 #if defined(OS_WIN)
    197   // Picasa on Windows is by default in the DIR_LOCAL_APP_DATA directory.
    198   local_app_data_override_.reset(new base::ScopedPathOverride(
    199       base::DIR_LOCAL_APP_DATA, GetFakeLocalAppDataPath()));
    200   // Picasa also looks in the registry for an alternate path.
    201   registry_override_.OverrideRegistry(HKEY_CURRENT_USER);
    202 #endif  // OS_WIN
    203 
    204 #if defined(OS_MACOSX)
    205   mac_preferences_.reset(new MockPreferences);
    206 
    207   // iTunes override.
    208   base::FilePath itunes_xml =
    209       GetFakeITunesRootPath().AppendASCII("iTunes Library.xml");
    210   mac_preferences_->AddTestItem(
    211       base::mac::NSToCFCast(iapps::kITunesRecentDatabasePathsKey),
    212       base::mac::NSToCFCast(iapps::NSArrayFromFilePath(itunes_xml)),
    213       false);
    214 
    215   // iPhoto override.
    216   base::FilePath iphoto_xml =
    217       GetFakeIPhotoRootPath().AppendASCII("AlbumData.xml");
    218   mac_preferences_->AddTestItem(
    219       base::mac::NSToCFCast(iapps::kIPhotoRecentDatabasesKey),
    220       base::mac::NSToCFCast(iapps::NSArrayFromFilePath(iphoto_xml)),
    221       false);
    222 
    223   iapps::SetMacPreferencesForTesting(mac_preferences_.get());
    224   picasa::SetMacPreferencesForTesting(mac_preferences_.get());
    225 #endif  // OS_MACOSX
    226 
    227   ChangeMediaPathOverrides();
    228 #endif  // OS_CHROMEOS || OS_ANDROID
    229 }
    230 
    231 base::FilePath MakeMediaGalleriesTestingPath(const std::string& dir) {
    232 #if defined(OS_WIN)
    233   return base::FilePath(FILE_PATH_LITERAL("C:\\")).AppendASCII(dir);
    234 #elif defined(OS_POSIX)
    235   return base::FilePath(FILE_PATH_LITERAL("/")).Append(dir);
    236 #else
    237   NOTREACHED();
    238 #endif
    239 }
    240