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 "base/auto_reset.h"
      6 #include "base/callback.h"
      7 #include "base/file_util.h"
      8 #include "base/files/scoped_temp_dir.h"
      9 #include "base/json/json_writer.h"
     10 #include "base/numerics/safe_conversions.h"
     11 #include "base/path_service.h"
     12 #include "base/strings/string_util.h"
     13 #include "base/strings/utf_string_conversions.h"
     14 #include "base/values.h"
     15 #include "chrome/browser/apps/app_browsertest_util.h"
     16 #include "chrome/browser/browser_process.h"
     17 #include "chrome/browser/extensions/api/media_galleries/media_galleries_api.h"
     18 #include "chrome/browser/media_galleries/media_file_system_registry.h"
     19 #include "chrome/browser/media_galleries/media_folder_finder.h"
     20 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
     21 #include "chrome/browser/media_galleries/media_galleries_scan_result_controller.h"
     22 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
     23 #include "chrome/browser/media_galleries/media_scan_manager.h"
     24 #include "chrome/common/chrome_paths.h"
     25 #include "components/storage_monitor/storage_info.h"
     26 #include "components/storage_monitor/storage_monitor.h"
     27 #include "content/public/browser/web_contents.h"
     28 #include "content/public/test/test_utils.h"
     29 #include "extensions/browser/extension_system.h"
     30 #include "extensions/common/extension.h"
     31 #include "media/base/test_data_util.h"
     32 
     33 #if defined(OS_WIN) || defined(OS_MACOSX)
     34 #include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
     35 #include "chrome/common/media_galleries/picasa_test_util.h"
     36 #include "chrome/common/media_galleries/picasa_types.h"
     37 #include "chrome/common/media_galleries/pmp_test_util.h"
     38 #endif
     39 
     40 #if defined(OS_MACOSX)
     41 #include "base/mac/foundation_util.h"
     42 #include "base/strings/sys_string_conversions.h"
     43 #include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h"
     44 #endif  // OS_MACOSX
     45 
     46 #if !defined(DISABLE_NACL)
     47 #include "base/command_line.h"
     48 #include "chrome/browser/ui/extensions/application_launch.h"
     49 #include "ppapi/shared_impl/ppapi_switches.h"
     50 #endif
     51 
     52 using extensions::PlatformAppBrowserTest;
     53 using storage_monitor::StorageInfo;
     54 using storage_monitor::StorageMonitor;
     55 
     56 namespace {
     57 
     58 // Dummy device properties.
     59 const char kDeviceId[] = "testDeviceId";
     60 const char kDeviceName[] = "foobar";
     61 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
     62 base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("C:\\qux");
     63 #else
     64 base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux");
     65 #endif
     66 
     67 class DoNothingMediaFolderFinder : public MediaFolderFinder {
     68  public:
     69   explicit DoNothingMediaFolderFinder(
     70       const MediaFolderFinderResultsCallback& callback)
     71       : MediaFolderFinder(callback) {
     72   }
     73   virtual ~DoNothingMediaFolderFinder() {}
     74 
     75   static MediaFolderFinder* CreateDoNothingMediaFolderFinder(
     76       const MediaFolderFinderResultsCallback& callback) {
     77     return new DoNothingMediaFolderFinder(callback);
     78   }
     79 
     80   virtual void StartScan() OVERRIDE {}
     81 
     82  private:
     83 };
     84 
     85 }  // namespace
     86 
     87 class TestMediaGalleriesAddScanResultsFunction
     88     : public extensions::MediaGalleriesAddScanResultsFunction {
     89  public:
     90   static ExtensionFunction* Factory() {
     91     return new TestMediaGalleriesAddScanResultsFunction;
     92   }
     93 
     94  protected:
     95   virtual ~TestMediaGalleriesAddScanResultsFunction() {}
     96 
     97   // Accepts the dialog as soon as it is created.
     98   virtual MediaGalleriesScanResultController* MakeDialog(
     99       content::WebContents* web_contents,
    100       const extensions::Extension& extension,
    101       const base::Closure& on_finish) OVERRIDE {
    102     MediaGalleriesScanResultController* controller =
    103         extensions::MediaGalleriesAddScanResultsFunction::MakeDialog(
    104             web_contents, extension, on_finish);
    105     controller->dialog_->AcceptDialogForTesting();
    106     // The dialog is closing or closed so don't return it.
    107     return NULL;
    108   }
    109 };
    110 
    111 class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest {
    112  protected:
    113   MediaGalleriesPlatformAppBrowserTest() : test_jpg_size_(0) {}
    114   virtual ~MediaGalleriesPlatformAppBrowserTest() {}
    115 
    116   virtual void SetUpOnMainThread() OVERRIDE {
    117     PlatformAppBrowserTest::SetUpOnMainThread();
    118     ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
    119 
    120     int64 file_size;
    121     ASSERT_TRUE(base::GetFileSize(GetCommonDataDir().AppendASCII("test.jpg"),
    122                                   &file_size));
    123     test_jpg_size_ = base::checked_cast<int>(file_size);
    124   }
    125 
    126   virtual void TearDownOnMainThread() OVERRIDE {
    127     ensure_media_directories_exists_.reset();
    128     PlatformAppBrowserTest::TearDownOnMainThread();
    129   }
    130 
    131   bool RunMediaGalleriesTest(const std::string& extension_name) {
    132     base::ListValue empty_list_value;
    133     return RunMediaGalleriesTestWithArg(extension_name, empty_list_value);
    134   }
    135 
    136   bool RunMediaGalleriesTestWithArg(const std::string& extension_name,
    137                                     const base::ListValue& custom_arg_value) {
    138     // Copy the test data for this test into a temporary directory. Then add
    139     // a common_injected.js to the temporary copy and run it.
    140     const char kTestDir[] = "api_test/media_galleries/";
    141     base::FilePath from_dir =
    142         test_data_dir_.AppendASCII(kTestDir + extension_name);
    143     from_dir = from_dir.NormalizePathSeparators();
    144 
    145     base::ScopedTempDir temp_dir;
    146     if (!temp_dir.CreateUniqueTempDir())
    147       return false;
    148 
    149     if (!base::CopyDirectory(from_dir, temp_dir.path(), true))
    150       return false;
    151 
    152     base::FilePath common_js_path(
    153         GetCommonDataDir().AppendASCII("common_injected.js"));
    154     base::FilePath inject_js_path(
    155         temp_dir.path().AppendASCII(extension_name)
    156                        .AppendASCII("common_injected.js"));
    157     if (!base::CopyFile(common_js_path, inject_js_path))
    158       return false;
    159 
    160     const char* custom_arg = NULL;
    161     std::string json_string;
    162     if (!custom_arg_value.empty()) {
    163       base::JSONWriter::Write(&custom_arg_value, &json_string);
    164       custom_arg = json_string.c_str();
    165     }
    166 
    167     base::AutoReset<base::FilePath> reset(&test_data_dir_, temp_dir.path());
    168     bool result = RunPlatformAppTestWithArg(extension_name, custom_arg);
    169     content::RunAllPendingInMessageLoop();  // avoid race on exit in registry.
    170     return result;
    171   }
    172 
    173   void AttachFakeDevice() {
    174     device_id_ = StorageInfo::MakeDeviceId(
    175         StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
    176 
    177     StorageMonitor::GetInstance()->receiver()->ProcessAttach(
    178         StorageInfo(device_id_, kDevicePath, base::ASCIIToUTF16(kDeviceName),
    179                     base::string16(), base::string16(), 0));
    180     content::RunAllPendingInMessageLoop();
    181   }
    182 
    183   void DetachFakeDevice() {
    184     StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
    185     content::RunAllPendingInMessageLoop();
    186   }
    187 
    188   // Called if test only wants a single gallery it creates.
    189   void RemoveAllGalleries() {
    190     MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
    191 
    192     // Make a copy, as the iterator would be invalidated otherwise.
    193     const MediaGalleriesPrefInfoMap galleries =
    194         preferences->known_galleries();
    195     for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
    196          it != galleries.end(); ++it) {
    197       preferences->ForgetGalleryById(it->first);
    198     }
    199   }
    200 
    201   // This function makes a single fake gallery. This is needed to test platforms
    202   // with no default media galleries, such as CHROMEOS. This fake gallery is
    203   // pre-populated with a test.jpg and test.txt.
    204   void MakeSingleFakeGallery(MediaGalleryPrefId* pref_id) {
    205     ASSERT_FALSE(fake_gallery_temp_dir_.IsValid());
    206     ASSERT_TRUE(fake_gallery_temp_dir_.CreateUniqueTempDir());
    207 
    208     MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
    209 
    210     MediaGalleryPrefInfo gallery_info;
    211     ASSERT_FALSE(preferences->LookUpGalleryByPath(fake_gallery_temp_dir_.path(),
    212                                                   &gallery_info));
    213     MediaGalleryPrefId id = preferences->AddGallery(
    214         gallery_info.device_id,
    215         gallery_info.path,
    216         MediaGalleryPrefInfo::kAutoDetected,
    217         gallery_info.volume_label,
    218         gallery_info.vendor_name,
    219         gallery_info.model_name,
    220         gallery_info.total_size_in_bytes,
    221         gallery_info.last_attach_time,
    222         0, 0, 0);
    223     if (pref_id)
    224       *pref_id = id;
    225 
    226     content::RunAllPendingInMessageLoop();
    227 
    228     // Valid file, should show up in JS as a FileEntry.
    229     AddFileToSingleFakeGallery(GetCommonDataDir().AppendASCII("test.jpg"));
    230 
    231     // Invalid file, should not show up as a FileEntry in JS at all.
    232     AddFileToSingleFakeGallery(GetCommonDataDir().AppendASCII("test.txt"));
    233   }
    234 
    235   void AddFileToSingleFakeGallery(const base::FilePath& source_path) {
    236     ASSERT_TRUE(fake_gallery_temp_dir_.IsValid());
    237 
    238     ASSERT_TRUE(base::CopyFile(
    239         source_path,
    240         fake_gallery_temp_dir_.path().Append(source_path.BaseName())));
    241   }
    242 
    243 #if defined(OS_WIN) || defined(OS_MACOSX)
    244   void PopulatePicasaTestData(const base::FilePath& picasa_app_data_root) {
    245     base::FilePath picasa_database_path =
    246         picasa::MakePicasaDatabasePath(picasa_app_data_root);
    247     base::FilePath picasa_temp_dir_path =
    248         picasa_database_path.DirName().AppendASCII(picasa::kPicasaTempDirName);
    249     ASSERT_TRUE(base::CreateDirectory(picasa_database_path));
    250     ASSERT_TRUE(base::CreateDirectory(picasa_temp_dir_path));
    251 
    252     // Create fake folder directories.
    253     base::FilePath folders_root =
    254         ensure_media_directories_exists_->GetFakePicasaFoldersRootPath();
    255     base::FilePath fake_folder_1 = folders_root.AppendASCII("folder1");
    256     base::FilePath fake_folder_2 = folders_root.AppendASCII("folder2");
    257     ASSERT_TRUE(base::CreateDirectory(fake_folder_1));
    258     ASSERT_TRUE(base::CreateDirectory(fake_folder_2));
    259 
    260     // Write folder and album contents.
    261     picasa::WriteTestAlbumTable(
    262         picasa_database_path, fake_folder_1, fake_folder_2);
    263     picasa::WriteTestAlbumsImagesIndex(fake_folder_1, fake_folder_2);
    264 
    265     base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
    266     ASSERT_TRUE(base::CopyFile(
    267         test_jpg_path, fake_folder_1.AppendASCII("InBoth.jpg")));
    268     ASSERT_TRUE(base::CopyFile(
    269         test_jpg_path, fake_folder_1.AppendASCII("InSecondAlbumOnly.jpg")));
    270     ASSERT_TRUE(base::CopyFile(
    271         test_jpg_path, fake_folder_2.AppendASCII("InFirstAlbumOnly.jpg")));
    272   }
    273 #endif  // defined(OS_WIN) || defined(OS_MACOSX)
    274 
    275 #if defined(OS_MACOSX)
    276   void PopulateIPhotoTestData(const base::FilePath& iphoto_data_root) {
    277     std::string xml_contents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
    278     "<plist version=\"1.0\">"
    279     "<dict>\n"
    280 
    281     "    <key>List of Albums</key>"
    282     "    <array>\n"
    283 
    284     "    <dict>\n"
    285     "      <key>AlbumId</key>"
    286     "      <integer>1</integer>"
    287     "      <key>AlbumName</key>"
    288     "      <string>Album1</string>"
    289     "      <key>KeyList</key>\n"
    290     "      <array>"
    291     "      <string>1</string>"
    292     "      <string>2</string>"
    293     "      </array>\n"
    294     "    </dict>\n"
    295 
    296     "    <dict>\n"
    297     "      <key>AlbumId</key>"
    298     "      <integer>2</integer>"
    299     "      <key>AlbumName</key>"
    300     "      <string>Album2</string>"
    301     "      <key>KeyList</key>\n"
    302     "      <array>"
    303     "      <string>2</string>"
    304     "      </array>\n"
    305     "    </dict>\n"
    306 
    307     "    </array>\n"
    308 
    309     "   <key>Master Image List</key>\n"
    310     "   <dict>\n"
    311 
    312     "  <key>1</key>"
    313     "  <dict>\n"
    314     "    <key>MediaType</key>"
    315     "    <string>Image</string>"
    316     "    <key>Caption</key>"
    317     "    <string>caption 1</string>"
    318     "    <key>GUID</key>"
    319     "    <string>1</string>"
    320     "    <key>ModDateAsTimerInterval</key>"
    321     "    <string>386221543.0000</string>"
    322     "    <key>DateAsTimerInterval</key>"
    323     "    <string>386221543.0000</string>"
    324     "    <key>DateAsTimerIntervalGMT</key>"
    325     "    <string>385123456.00</string>"
    326     "    <key>ImagePath</key>"
    327     "    <string>$path1</string>"
    328     "    <key>ThumbPath</key>"
    329     "    <string>/thumb/path</string>\n"
    330     "  </dict>\n"
    331 
    332     "  <key>2</key>\n"
    333     "  <dict>\n"
    334     "    <key>MediaType</key>"
    335     "    <string>Image</string>"
    336     "    <key>Caption</key>"
    337     "    <string>caption 2</string>"
    338     "    <key>GUID</key>"
    339     "    <string>2</string>"
    340     "    <key>ModDateAsTimerInterval</key>"
    341     "    <string>386221543.0000</string>"
    342     "    <key>DateAsTimerInterval</key>"
    343     "    <string>386221543.0000</string>"
    344     "    <key>DateAsTimerIntervalGMT</key>"
    345     "    <string>385123456.00</string>"
    346     "    <key>ImagePath</key>"
    347     "    <string>$path2</string>"
    348     "    <key>ThumbPath</key>"
    349     "    <string>/thumb/path2</string>\n"
    350     "  </dict>\n"
    351 
    352     "   </dict>\n"  // Master Image List
    353 
    354     "</dict>\n"
    355     "</plist>";
    356 
    357     base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
    358     ASSERT_TRUE(base::CreateDirectory(iphoto_data_root));
    359     base::FilePath first_only_jpg =
    360         iphoto_data_root.AppendASCII("InFirstAlbumOnly.jpg");
    361     base::FilePath in_both_jpg = iphoto_data_root.AppendASCII("InBoth.jpg");
    362     ASSERT_TRUE(base::CopyFile(test_jpg_path, first_only_jpg));
    363     ASSERT_TRUE(base::CopyFile(test_jpg_path, in_both_jpg));
    364     ReplaceFirstSubstringAfterOffset(
    365         &xml_contents, 0, std::string("$path1"), first_only_jpg.value());
    366     ReplaceFirstSubstringAfterOffset(
    367         &xml_contents, 0, std::string("$path2"), in_both_jpg.value());
    368 
    369     base::FilePath album_xml = iphoto_data_root.AppendASCII("AlbumData.xml");
    370     ASSERT_NE(-1, base::WriteFile(album_xml,
    371                                   xml_contents.c_str(), xml_contents.size()));
    372   }
    373 #endif  // defined(OS_MACOSX)
    374 
    375   base::FilePath GetCommonDataDir() const {
    376     return test_data_dir_.AppendASCII("api_test")
    377                          .AppendASCII("media_galleries")
    378                          .AppendASCII("common");
    379   }
    380 
    381   base::FilePath GetWallpaperTestDataDir() const {
    382     return test_data_dir_.AppendASCII("api_test")
    383                          .AppendASCII("wallpaper");
    384   }
    385 
    386   int num_galleries() const {
    387     return ensure_media_directories_exists_->num_galleries();
    388   }
    389 
    390   int test_jpg_size() const { return test_jpg_size_; }
    391 
    392   EnsureMediaDirectoriesExists* ensure_media_directories_exists() const {
    393     return ensure_media_directories_exists_.get();
    394   }
    395 
    396   void InstallDoNothingFolderFinder() {
    397     MediaScanManager * scan_manager =
    398         g_browser_process->media_file_system_registry()->media_scan_manager();
    399     scan_manager->SetMediaFolderFinderFactory(base::Bind(
    400         &DoNothingMediaFolderFinder::CreateDoNothingMediaFolderFinder));
    401   }
    402 
    403   void SetRootsForFolderFinder(const std::vector<base::FilePath>& roots) {
    404     MediaScanManager* scan_manager =
    405         g_browser_process->media_file_system_registry()->media_scan_manager();
    406     scan_manager->SetMediaFolderFinderFactory(base::Bind(
    407         &MediaGalleriesPlatformAppBrowserTest::CreateMediaFolderFinderWithRoots,
    408         roots));
    409   }
    410 
    411  private:
    412   static MediaFolderFinder* CreateMediaFolderFinderWithRoots(
    413       const std::vector<base::FilePath>& roots,
    414       const MediaFolderFinder::MediaFolderFinderResultsCallback& callback) {
    415     MediaFolderFinder* finder = new MediaFolderFinder(callback);
    416     finder->SetRootsForTesting(roots);
    417     return finder;
    418   }
    419 
    420   MediaGalleriesPreferences* GetAndInitializePreferences() {
    421     MediaGalleriesPreferences* preferences =
    422         g_browser_process->media_file_system_registry()->GetPreferences(
    423             browser()->profile());
    424     base::RunLoop runloop;
    425     preferences->EnsureInitialized(runloop.QuitClosure());
    426     runloop.Run();
    427     return preferences;
    428   }
    429 
    430   std::string device_id_;
    431   base::ScopedTempDir fake_gallery_temp_dir_;
    432   int test_jpg_size_;
    433   scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
    434 };
    435 
    436 #if !defined(DISABLE_NACL)
    437 class MediaGalleriesPlatformAppPpapiTest
    438     : public MediaGalleriesPlatformAppBrowserTest {
    439  protected:
    440   virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
    441     MediaGalleriesPlatformAppBrowserTest::SetUpCommandLine(command_line);
    442     command_line->AppendSwitch(switches::kEnablePepperTesting);
    443   }
    444 
    445   virtual void SetUpOnMainThread() OVERRIDE {
    446     MediaGalleriesPlatformAppBrowserTest::SetUpOnMainThread();
    447 
    448     ASSERT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &app_dir_));
    449     app_dir_ = app_dir_.AppendASCII("ppapi")
    450                        .AppendASCII("tests")
    451                        .AppendASCII("extensions")
    452                        .AppendASCII("media_galleries")
    453                        .AppendASCII("newlib");
    454   }
    455 
    456   const base::FilePath& app_dir() const {
    457     return app_dir_;
    458   }
    459 
    460  private:
    461   base::FilePath app_dir_;
    462 };
    463 
    464 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppPpapiTest, SendFilesystem) {
    465   RemoveAllGalleries();
    466   MakeSingleFakeGallery(NULL);
    467 
    468   const extensions::Extension* extension = LoadExtension(app_dir());
    469   ASSERT_TRUE(extension);
    470 
    471   ResultCatcher catcher;
    472   AppLaunchParams params(browser()->profile(),
    473                          extension,
    474                          extensions::LAUNCH_CONTAINER_NONE,
    475                          NEW_WINDOW);
    476   params.command_line = *CommandLine::ForCurrentProcess();
    477   OpenApplication(params);
    478 
    479   bool result = true;
    480   if (!catcher.GetNextResult()) {
    481     message_ = catcher.message();
    482     result = false;
    483   }
    484   content::RunAllPendingInMessageLoop();  // avoid race on exit in registry.
    485   ASSERT_TRUE(result) << message_;
    486 }
    487 
    488 #endif  // !defined(DISABLE_NACL)
    489 
    490 // Test is flaky, it fails on certain bots, namely WinXP Tests(1) and Linux
    491 // (dbg)(1)(32).  See crbug.com/354425.
    492 #if (defined(ARCH_CPU_X86)) && (defined(OS_WIN) || defined(OS_LINUX))
    493 #define MAYBE_MediaGalleriesNoAccess DISABLED_MediaGalleriesNoAccess
    494 #else
    495 #define MAYBE_MediaGalleriesNoAccess MediaGalleriesNoAccess
    496 #endif
    497 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    498                        MAYBE_MediaGalleriesNoAccess) {
    499   MakeSingleFakeGallery(NULL);
    500 
    501   base::ListValue custom_args;
    502   custom_args.AppendInteger(num_galleries() + 1);
    503 
    504   ASSERT_TRUE(RunMediaGalleriesTestWithArg("no_access", custom_args))
    505       << message_;
    506 }
    507 
    508 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, NoGalleriesRead) {
    509   ASSERT_TRUE(RunMediaGalleriesTest("no_galleries")) << message_;
    510 }
    511 
    512 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    513                        NoGalleriesCopyTo) {
    514   ASSERT_TRUE(RunMediaGalleriesTest("no_galleries_copy_to")) << message_;
    515 }
    516 
    517 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    518                        MediaGalleriesRead) {
    519   RemoveAllGalleries();
    520   MakeSingleFakeGallery(NULL);
    521   base::ListValue custom_args;
    522   custom_args.AppendInteger(test_jpg_size());
    523 
    524   ASSERT_TRUE(RunMediaGalleriesTestWithArg("read_access", custom_args))
    525       << message_;
    526 }
    527 
    528 // Test is flaky, it fails on certain bots, namely WinXP Tests(1) and Linux
    529 // (dbg)(1)(32).  See crbug.com/354425.
    530 #if (defined(ARCH_CPU_X86)) && (defined(OS_WIN) || defined(OS_LINUX))
    531 #define MAYBE_MediaGalleriesCopyTo DISABLED_MediaGalleriesCopyTo
    532 #else
    533 #define MAYBE_MediaGalleriesCopyTo MediaGalleriesCopyTo
    534 #endif
    535 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    536                        MAYBE_MediaGalleriesCopyTo) {
    537   RemoveAllGalleries();
    538   MakeSingleFakeGallery(NULL);
    539   ASSERT_TRUE(RunMediaGalleriesTest("copy_to_access")) << message_;
    540 }
    541 
    542 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    543                        MediaGalleriesDelete) {
    544   MakeSingleFakeGallery(NULL);
    545   base::ListValue custom_args;
    546   custom_args.AppendInteger(num_galleries() + 1);
    547   ASSERT_TRUE(RunMediaGalleriesTestWithArg("delete_access", custom_args))
    548       << message_;
    549 }
    550 
    551 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    552                        MediaGalleriesAccessAttached) {
    553   AttachFakeDevice();
    554 
    555   base::ListValue custom_args;
    556   custom_args.AppendInteger(num_galleries() + 1);
    557   custom_args.AppendString(kDeviceName);
    558 
    559   ASSERT_TRUE(RunMediaGalleriesTestWithArg("access_attached", custom_args))
    560       << message_;
    561 
    562   DetachFakeDevice();
    563 }
    564 
    565 #if defined(OS_WIN)|| defined(OS_MACOSX)
    566 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    567                        PicasaDefaultLocation) {
    568 #if defined(OS_WIN)
    569   PopulatePicasaTestData(
    570       ensure_media_directories_exists()->GetFakeLocalAppDataPath());
    571 #elif defined(OS_MACOSX)
    572   PopulatePicasaTestData(
    573       ensure_media_directories_exists()->GetFakeAppDataPath());
    574 #endif
    575 
    576   base::ListValue custom_args;
    577   custom_args.AppendInteger(test_jpg_size());
    578   ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
    579 }
    580 
    581 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    582                        PicasaCustomLocation) {
    583   base::ScopedTempDir custom_picasa_app_data_root;
    584   ASSERT_TRUE(custom_picasa_app_data_root.CreateUniqueTempDir());
    585   ensure_media_directories_exists()->SetCustomPicasaAppDataPath(
    586       custom_picasa_app_data_root.path());
    587   PopulatePicasaTestData(custom_picasa_app_data_root.path());
    588 
    589   base::ListValue custom_args;
    590   custom_args.AppendInteger(test_jpg_size());
    591   ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
    592 }
    593 #endif  // defined(OS_WIN) || defined(OS_MACOSX)
    594 
    595 #if defined(OS_MACOSX)
    596 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
    597                        IPhotoTest) {
    598   PopulateIPhotoTestData(
    599       ensure_media_directories_exists()->GetFakeIPhotoRootPath());
    600 
    601   base::ListValue custom_args;
    602   custom_args.AppendInteger(test_jpg_size());
    603   ASSERT_TRUE(RunMediaGalleriesTestWithArg("iphoto", custom_args)) << message_;
    604 
    605   iapps::SetMacPreferencesForTesting(NULL);
    606 }
    607 #endif  // defined(OS_MACOSX)
    608 
    609 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, CancelScan) {
    610   InstallDoNothingFolderFinder();
    611   ASSERT_TRUE(RunMediaGalleriesTest("cancel_scan")) << message_;
    612 }
    613 
    614 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, Scan) {
    615   base::ScopedTempDir scan_root;
    616   ASSERT_TRUE(scan_root.CreateUniqueTempDir());
    617   std::vector<base::FilePath> roots;
    618   roots.push_back(scan_root.path());
    619   SetRootsForFolderFinder(roots);
    620 
    621   // Override addScanResults so that the dialog is accepted as soon as it is
    622   // created.
    623   ASSERT_TRUE(extensions::ExtensionFunctionDispatcher::OverrideFunction(
    624       "mediaGalleries.addScanResults",
    625       &TestMediaGalleriesAddScanResultsFunction::Factory));
    626 
    627   // Add some files and directories to the scan root for testing. Only the
    628   // "f" directory should be found.
    629   std::string dummy_data;
    630   dummy_data.resize(1);
    631   ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("a/b")));
    632   ASSERT_EQ(static_cast<int>(dummy_data.size()),
    633             base::WriteFile(scan_root.path().AppendASCII("a/b/c.jpg"),
    634                             dummy_data.c_str(), dummy_data.size()));
    635   ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("a/d")));
    636   dummy_data.resize(201 * 1024);  // 200k is the min size for the folder finder.
    637   ASSERT_EQ(static_cast<int>(dummy_data.size()),
    638             base::WriteFile(scan_root.path().AppendASCII("a/d/e.txt"),
    639                             dummy_data.c_str(), dummy_data.size()));
    640   ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("f")));
    641   ASSERT_EQ(static_cast<int>(dummy_data.size()),
    642             base::WriteFile(scan_root.path().AppendASCII("f/g.jpg"),
    643                             dummy_data.c_str(), dummy_data.size()));
    644 
    645   ASSERT_TRUE(RunMediaGalleriesTest("scan")) << message_;
    646 }
    647 
    648 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, ToURL) {
    649   RemoveAllGalleries();
    650   MediaGalleryPrefId pref_id;
    651   MakeSingleFakeGallery(&pref_id);
    652 
    653   base::ListValue custom_args;
    654   custom_args.AppendInteger(base::checked_cast<int>(pref_id));
    655   custom_args.AppendString(
    656       browser()->profile()->GetPath().BaseName().MaybeAsASCII());
    657 
    658   ASSERT_TRUE(RunMediaGalleriesTestWithArg("tourl", custom_args)) << message_;
    659 }
    660 
    661 IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, GetMetadata) {
    662   RemoveAllGalleries();
    663   MakeSingleFakeGallery(NULL);
    664 
    665   AddFileToSingleFakeGallery(media::GetTestDataFilePath("90rotation.mp4"));
    666   AddFileToSingleFakeGallery(media::GetTestDataFilePath("id3_png_test.mp3"));
    667   AddFileToSingleFakeGallery(GetWallpaperTestDataDir().AppendASCII("test.jpg"));
    668 
    669   base::ListValue custom_args;
    670 #if defined(USE_PROPRIETARY_CODECS)
    671   custom_args.AppendBoolean(true);
    672 #else
    673   custom_args.AppendBoolean(false);
    674 #endif
    675   ASSERT_TRUE(RunMediaGalleriesTestWithArg("media_metadata", custom_args))
    676       << message_;
    677 }
    678