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/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_prefs.h"
     17 #include "chrome/browser/extensions/extension_service.h"
     18 #include "chrome/browser/extensions/extension_system.h"
     19 #include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
     20 #include "chrome/browser/profiles/profile.h"
     21 #include "chrome/common/chrome_paths.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<DictionaryValue> manifest(new 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   ListValue* background_script_list = new ListValue;
     47   background_script_list->Append(Value::CreateStringValue("background.js"));
     48   manifest->Set(extensions::manifest_keys::kPlatformAppBackgroundScripts,
     49                 background_script_list);
     50 
     51   ListValue* permission_detail_list = new ListValue;
     52   for (size_t i = 0; i < media_galleries_permissions.size(); i++)
     53     permission_detail_list->Append(
     54         Value::CreateStringValue(media_galleries_permissions[i]));
     55   DictionaryValue* media_galleries_permission = new DictionaryValue();
     56   media_galleries_permission->Set("mediaGalleries", permission_detail_list);
     57   ListValue* permission_list = new ListValue;
     58   permission_list->Append(media_galleries_permission);
     59   manifest->Set(extensions::manifest_keys::kPermissions, permission_list);
     60 
     61   extensions::ExtensionPrefs* extension_prefs =
     62       extensions::ExtensionPrefs::Get(profile);
     63   base::FilePath path = extension_prefs->install_directory().AppendASCII(name);
     64   std::string errors;
     65   scoped_refptr<extensions::Extension> extension =
     66       extensions::Extension::Create(path, extensions::Manifest::INTERNAL,
     67                                     *manifest.get(),
     68                                     extensions::Extension::NO_FLAGS, &errors);
     69   EXPECT_TRUE(extension.get() != NULL) << errors;
     70   EXPECT_TRUE(extensions::Extension::IdIsValid(extension->id()));
     71   if (!extension.get() || !extensions::Extension::IdIsValid(extension->id()))
     72     return NULL;
     73 
     74   extension_prefs->OnExtensionInstalled(
     75       extension.get(),
     76       extensions::Extension::ENABLED,
     77       false,
     78       syncer::StringOrdinal::CreateInitialOrdinal());
     79   ExtensionService* extension_service =
     80       extensions::ExtensionSystem::Get(profile)->extension_service();
     81   extension_service->AddExtension(extension.get());
     82   extension_service->EnableExtension(extension->id());
     83 
     84   return extension;
     85 }
     86 
     87 EnsureMediaDirectoriesExists::EnsureMediaDirectoriesExists()
     88     : num_galleries_(0) {
     89   Init();
     90 }
     91 
     92 EnsureMediaDirectoriesExists::~EnsureMediaDirectoriesExists() {
     93 #if defined(OS_MACOSX)
     94   iapps::SetMacPreferencesForTesting(NULL);
     95   picasa::SetMacPreferencesForTesting(NULL);
     96 #endif  // OS_MACOSX
     97 }
     98 
     99 base::FilePath EnsureMediaDirectoriesExists::GetFakeAppDataPath() const {
    100   DCHECK(fake_dir_.IsValid());
    101   return fake_dir_.path().AppendASCII("appdata");
    102 }
    103 
    104 #if defined(OS_WIN)
    105 base::FilePath EnsureMediaDirectoriesExists::GetFakeLocalAppDataPath() const {
    106   DCHECK(fake_dir_.IsValid());
    107   return fake_dir_.path().AppendASCII("localappdata");
    108 }
    109 
    110 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath(
    111     const base::FilePath& path) {
    112   base::win::RegKey key(HKEY_CURRENT_USER, picasa::kPicasaRegistryPath,
    113                         KEY_SET_VALUE);
    114   key.WriteValue(picasa::kPicasaRegistryAppDataPathKey, path.value().c_str());
    115 }
    116 #endif  // OS_WIN
    117 
    118 #if defined(OS_MACOSX)
    119 void EnsureMediaDirectoriesExists::SetCustomPicasaAppDataPath(
    120     const base::FilePath& path) {
    121   mac_preferences_->AddTestItem(
    122       base::mac::NSToCFCast(picasa::kPicasaAppDataPathMacPreferencesKey),
    123       base::SysUTF8ToNSString(path.value()),
    124       false);
    125 }
    126 #endif // OS_MACOSX
    127 
    128 #if defined(OS_WIN) || defined(OS_MACOSX)
    129 base::FilePath
    130 EnsureMediaDirectoriesExists::GetFakePicasaFoldersRootPath() const {
    131   DCHECK(fake_dir_.IsValid());
    132   return fake_dir_.path().AppendASCII("picasa_folders");
    133 }
    134 #endif  // OS_WIN || OS_MACOSX
    135 
    136 void EnsureMediaDirectoriesExists::Init() {
    137 #if defined(OS_CHROMEOS) || defined(OS_ANDROID)
    138   return;
    139 #else
    140 
    141   ASSERT_TRUE(fake_dir_.CreateUniqueTempDir());
    142 
    143 #if defined(OS_WIN) || defined(OS_MACOSX)
    144   // This is to control whether or not tests think iTunes (on Windows) and
    145   // Picasa are installed.
    146   app_data_override_.reset(new base::ScopedPathOverride(
    147       base::DIR_APP_DATA, GetFakeAppDataPath()));
    148 #endif  // OS_WIN || OS_MACOSX
    149 
    150 #if defined(OS_WIN)
    151   // Picasa on Windows is by default in the DIR_LOCAL_APP_DATA directory.
    152   local_app_data_override_.reset(new base::ScopedPathOverride(
    153       base::DIR_LOCAL_APP_DATA, GetFakeLocalAppDataPath()));
    154   // Picasa also looks in the registry for an alternate path.
    155   registry_override_.OverrideRegistry(HKEY_CURRENT_USER, L"hkcu_picasa");
    156 #endif  // OS_WIN
    157 
    158 #if defined(OS_MACOSX)
    159   mac_preferences_.reset(new MockPreferences);
    160   iapps::SetMacPreferencesForTesting(mac_preferences_.get());
    161   picasa::SetMacPreferencesForTesting(mac_preferences_.get());
    162 
    163   // iTunes override.
    164   mac_preferences_->AddTestItem(
    165       base::mac::NSToCFCast(iapps::kITunesRecentDatabasePathsKey),
    166       base::SysUTF8ToNSString(fake_dir_.path().AppendASCII("itunes").value()),
    167       false);
    168 
    169   // iPhoto override.
    170   mac_preferences_->AddTestItem(
    171       base::mac::NSToCFCast(iapps::kIPhotoRecentDatabasesKey),
    172       base::SysUTF8ToNSString(fake_dir_.path().AppendASCII("iphoto").value()),
    173       false);
    174 #endif // OS_MACOSX
    175 
    176   music_override_.reset(new base::ScopedPathOverride(
    177       chrome::DIR_USER_MUSIC, fake_dir_.path().AppendASCII("music")));
    178   pictures_override_.reset(new base::ScopedPathOverride(
    179       chrome::DIR_USER_PICTURES, fake_dir_.path().AppendASCII("pictures")));
    180   video_override_.reset(new base::ScopedPathOverride(
    181       chrome::DIR_USER_VIDEOS, fake_dir_.path().AppendASCII("videos")));
    182   num_galleries_ = 3;
    183 #endif  // OS_CHROMEOS || OS_ANDROID
    184 }
    185