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