15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/auto_reset.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/callback.h"
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/json/json_writer.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/numerics/safe_conversions.h"
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/path_service.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string_util.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/values.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/browser_process.h"
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/extensions/api/media_galleries/media_galleries_api.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_folder_finder.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_scan_result_controller.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_test_util.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_scan_manager.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_info.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/storage_monitor.h"
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/public/browser/web_contents.h"
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/common/extension.h"
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/test_data_util.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_test_util.h"
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_types.h"
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/pmp_test_util.h"
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/mac/foundation_util.h"
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/sys_string_conversions.h"
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/iapps_finder_impl.h"
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // OS_MACOSX
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
47a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if !defined(DISABLE_NACL)
48a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/command_line.h"
49a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chrome/browser/ui/extensions/application_launch.h"
50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "ppapi/shared_impl/ppapi_switches.h"
51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PlatformAppBrowserTest;
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageInfo;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)using storage_monitor::StorageMonitor;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Dummy device properties.
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDeviceId[] = "testDeviceId";
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDeviceName[] = "foobar";
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(FILE_PATH_USES_DRIVE_LETTERS)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("C:\\qux");
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux");
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class DoNothingMediaFolderFinder : public MediaFolderFinder {
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit DoNothingMediaFolderFinder(
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const MediaFolderFinderResultsCallback& callback)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : MediaFolderFinder(callback) {
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual ~DoNothingMediaFolderFinder() {}
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static MediaFolderFinder* CreateDoNothingMediaFolderFinder(
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const MediaFolderFinderResultsCallback& callback) {
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return new DoNothingMediaFolderFinder(callback);
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void StartScan() OVERRIDE {}
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class TestMediaGalleriesAddScanResultsFunction
89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public extensions::MediaGalleriesAddScanResultsFunction {
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static ExtensionFunction* Factory() {
92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return new TestMediaGalleriesAddScanResultsFunction;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
95a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) protected:
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~TestMediaGalleriesAddScanResultsFunction() {}
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
98a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Accepts the dialog as soon as it is created.
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual MediaGalleriesScanResultController* MakeDialog(
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      content::WebContents* web_contents,
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const extensions::Extension& extension,
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const base::Closure& on_finish) OVERRIDE {
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    MediaGalleriesScanResultController* controller =
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        extensions::MediaGalleriesAddScanResultsFunction::MakeDialog(
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            web_contents, extension, on_finish);
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    controller->dialog_->AcceptDialogForTesting();
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // The dialog is closing or closed so don't return it.
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return NULL;
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaGalleriesPlatformAppBrowserTest() : test_jpg_size_(0) {}
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~MediaGalleriesPlatformAppBrowserTest() {}
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::SetUpOnMainThread();
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int64 file_size;
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::GetFileSize(GetCommonDataDir().AppendASCII("test.jpg"),
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  &file_size));
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    test_jpg_size_ = base::checked_cast<int>(file_size);
12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset();
12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::TearDownOnMainThread();
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTest(const std::string& extension_name) {
13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    base::ListValue empty_list_value;
13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return RunMediaGalleriesTestWithArg(extension_name, empty_list_value);
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTestWithArg(const std::string& extension_name,
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    const base::ListValue& custom_arg_value) {
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Copy the test data for this test into a temporary directory. Then add
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // a common_injected.js to the temporary copy and run it.
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char kTestDir[] = "api_test/media_galleries/";
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath from_dir =
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_data_dir_.AppendASCII(kTestDir + extension_name);
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    from_dir = from_dir.NormalizePathSeparators();
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::ScopedTempDir temp_dir;
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!temp_dir.CreateUniqueTempDir())
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyDirectory(from_dir, temp_dir.path(), true))
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath common_js_path(
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        GetCommonDataDir().AppendASCII("common_injected.js"));
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath inject_js_path(
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        temp_dir.path().AppendASCII(extension_name)
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       .AppendASCII("common_injected.js"));
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyFile(common_js_path, inject_js_path))
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const char* custom_arg = NULL;
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string json_string;
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!custom_arg_value.empty()) {
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::JSONWriter::Write(&custom_arg_value, &json_string);
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      custom_arg = json_string.c_str();
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::AutoReset<base::FilePath> reset(&test_data_dir_, temp_dir.path());
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool result = RunPlatformAppTestWithArg(extension_name, custom_arg);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    content::RunAllPendingInMessageLoop();  // avoid race on exit in registry.
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return result;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AttachFakeDevice() {
175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    device_id_ = StorageInfo::MakeDeviceId(
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessAttach(
179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        StorageInfo(device_id_, kDevicePath, base::ASCIIToUTF16(kDeviceName),
180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                    base::string16(), base::string16(), 0));
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DetachFakeDevice() {
185d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called if test only wants a single gallery it creates.
190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RemoveAllGalleries() {
191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
192a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
193a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Make a copy, as the iterator would be invalidated otherwise.
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const MediaGalleriesPrefInfoMap galleries =
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        preferences->known_galleries();
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
197a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         it != galleries.end(); ++it) {
198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      preferences->ForgetGalleryById(it->first);
199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
200a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // This function makes a single fake gallery. This is needed to test platforms
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // with no default media galleries, such as CHROMEOS. This fake gallery is
204a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // pre-populated with a test.jpg and test.txt.
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void MakeSingleFakeGallery(MediaGalleryPrefId* pref_id) {
206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(fake_gallery_temp_dir_.IsValid());
207a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(fake_gallery_temp_dir_.CreateUniqueTempDir());
208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
211a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleryPrefInfo gallery_info;
212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_FALSE(preferences->LookUpGalleryByPath(fake_gallery_temp_dir_.path(),
213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                  &gallery_info));
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    MediaGalleryPrefId id = preferences->AddGallery(
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.device_id,
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.path,
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        MediaGalleryPrefInfo::kAutoDetected,
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.volume_label,
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.vendor_name,
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.model_name,
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.total_size_in_bytes,
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        gallery_info.last_attach_time,
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        0, 0, 0);
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (pref_id)
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      *pref_id = id;
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
22868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Valid file, should show up in JS as a FileEntry.
230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AddFileToSingleFakeGallery(GetCommonDataDir().AppendASCII("test.jpg"));
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
23268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Invalid file, should not show up as a FileEntry in JS at all.
233a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    AddFileToSingleFakeGallery(GetCommonDataDir().AppendASCII("test.txt"));
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
236a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void AddFileToSingleFakeGallery(const base::FilePath& source_path) {
237a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(fake_gallery_temp_dir_.IsValid());
238a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
240a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        source_path,
241a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        fake_gallery_temp_dir_.path().Append(source_path.BaseName())));
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
2451e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void PopulatePicasaTestData(const base::FilePath& picasa_app_data_root) {
2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_database_path =
2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa::MakePicasaDatabasePath(picasa_app_data_root);
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_temp_dir_path =
2491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa_database_path.DirName().AppendASCII(picasa::kPicasaTempDirName);
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(picasa_database_path));
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(picasa_temp_dir_path));
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Create fake folder directories.
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath folders_root =
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ensure_media_directories_exists_->GetFakePicasaFoldersRootPath();
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_1 = folders_root.AppendASCII("folder1");
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_2 = folders_root.AppendASCII("folder2");
258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(fake_folder_1));
259a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(fake_folder_2));
2604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Write folder and album contents.
2624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumTable(
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        picasa_database_path, fake_folder_1, fake_folder_2);
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumsImagesIndex(fake_folder_1, fake_folder_2);
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InBoth.jpg")));
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InSecondAlbumOnly.jpg")));
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_2.AppendASCII("InFirstAlbumOnly.jpg")));
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void PopulateIPhotoTestData(const base::FilePath& iphoto_data_root) {
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string xml_contents = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "<plist version=\"1.0\">"
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "<dict>\n"
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>List of Albums</key>"
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <array>\n"
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <dict>\n"
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>AlbumId</key>"
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <integer>1</integer>"
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>AlbumName</key>"
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <string>Album1</string>"
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>KeyList</key>\n"
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <array>"
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <string>1</string>"
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <string>2</string>"
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      </array>\n"
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    </dict>\n"
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <dict>\n"
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>AlbumId</key>"
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <integer>2</integer>"
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>AlbumName</key>"
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <string>Album2</string>"
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <key>KeyList</key>\n"
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <array>"
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      <string>2</string>"
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "      </array>\n"
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    </dict>\n"
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    </array>\n"
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "   <key>Master Image List</key>\n"
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "   <dict>\n"
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  <key>1</key>"
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  <dict>\n"
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>MediaType</key>"
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>Image</string>"
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>Caption</key>"
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>caption 1</string>"
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>GUID</key>"
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>1</string>"
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ModDateAsTimerInterval</key>"
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>386221543.0000</string>"
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>DateAsTimerInterval</key>"
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>386221543.0000</string>"
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>DateAsTimerIntervalGMT</key>"
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>385123456.00</string>"
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ImagePath</key>"
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>$path1</string>"
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ThumbPath</key>"
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>/thumb/path</string>\n"
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  </dict>\n"
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  <key>2</key>\n"
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  <dict>\n"
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>MediaType</key>"
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>Image</string>"
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>Caption</key>"
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>caption 2</string>"
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>GUID</key>"
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>2</string>"
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ModDateAsTimerInterval</key>"
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>386221543.0000</string>"
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>DateAsTimerInterval</key>"
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>386221543.0000</string>"
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>DateAsTimerIntervalGMT</key>"
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>385123456.00</string>"
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ImagePath</key>"
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>$path2</string>"
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <key>ThumbPath</key>"
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    <string>/thumb/path2</string>\n"
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  </dict>\n"
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "   </dict>\n"  // Master Image List
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "</dict>\n"
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "</plist>";
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(iphoto_data_root));
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath first_only_jpg =
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        iphoto_data_root.AppendASCII("InFirstAlbumOnly.jpg");
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath in_both_jpg = iphoto_data_root.AppendASCII("InBoth.jpg");
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_jpg_path, first_only_jpg));
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_jpg_path, in_both_jpg));
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ReplaceFirstSubstringAfterOffset(
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &xml_contents, 0, std::string("$path1"), first_only_jpg.value());
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ReplaceFirstSubstringAfterOffset(
3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &xml_contents, 0, std::string("$path2"), in_both_jpg.value());
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::FilePath album_xml = iphoto_data_root.AppendASCII("AlbumData.xml");
371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_NE(-1, base::WriteFile(album_xml,
372a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  xml_contents.c_str(), xml_contents.size()));
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_MACOSX)
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::FilePath GetCommonDataDir() const {
3774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return test_data_dir_.AppendASCII("api_test")
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("media_galleries")
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("common");
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
382a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::FilePath GetWallpaperTestDataDir() const {
383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return test_data_dir_.AppendASCII("api_test")
384a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         .AppendASCII("wallpaper");
385a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
386a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_galleries() const {
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_->num_galleries();
38968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
39068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
39168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size() const { return test_jpg_size_; }
39268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EnsureMediaDirectoriesExists* ensure_media_directories_exists() const {
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_.get();
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void InstallDoNothingFolderFinder() {
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaScanManager * scan_manager =
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        g_browser_process->media_file_system_registry()->media_scan_manager();
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    scan_manager->SetMediaFolderFinderFactory(base::Bind(
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &DoNothingMediaFolderFinder::CreateDoNothingMediaFolderFinder));
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
404a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void SetRootsForFolderFinder(const std::vector<base::FilePath>& roots) {
405a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MediaScanManager* scan_manager =
406a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        g_browser_process->media_file_system_registry()->media_scan_manager();
407a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    scan_manager->SetMediaFolderFinderFactory(base::Bind(
408a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        &MediaGalleriesPlatformAppBrowserTest::CreateMediaFolderFinderWithRoots,
409a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        roots));
410a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
411a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
413a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  static MediaFolderFinder* CreateMediaFolderFinderWithRoots(
414a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const std::vector<base::FilePath>& roots,
415a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const MediaFolderFinder::MediaFolderFinderResultsCallback& callback) {
416a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MediaFolderFinder* finder = new MediaFolderFinder(callback);
417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    finder->SetRootsForTesting(roots);
418a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return finder;
419a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
420a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MediaGalleriesPreferences* GetAndInitializePreferences() {
422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences =
423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        g_browser_process->media_file_system_registry()->GetPreferences(
424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            browser()->profile());
425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop runloop;
426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    preferences->EnsureInitialized(runloop.QuitClosure());
427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    runloop.Run();
428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return preferences;
429a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
431c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string device_id_;
432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ScopedTempDir fake_gallery_temp_dir_;
43368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size_;
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
437a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if !defined(DISABLE_NACL)
438a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochclass MediaGalleriesPlatformAppPpapiTest
439a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : public MediaGalleriesPlatformAppBrowserTest {
440a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch protected:
441a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
442a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MediaGalleriesPlatformAppBrowserTest::SetUpCommandLine(command_line);
443a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    command_line->AppendSwitch(switches::kEnablePepperTesting);
444a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
445a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
446a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  virtual void SetUpOnMainThread() OVERRIDE {
447a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    MediaGalleriesPlatformAppBrowserTest::SetUpOnMainThread();
448a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
449a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ASSERT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &app_dir_));
450a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    app_dir_ = app_dir_.AppendASCII("ppapi")
451a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                       .AppendASCII("tests")
452a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                       .AppendASCII("extensions")
453a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                       .AppendASCII("media_galleries")
454a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                       .AppendASCII("newlib");
455a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
456a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
457a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const base::FilePath& app_dir() const {
458a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    return app_dir_;
459a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
460a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
461a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch private:
462a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::FilePath app_dir_;
463a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch};
464a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
465a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppPpapiTest, SendFilesystem) {
466a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  RemoveAllGalleries();
467a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  MakeSingleFakeGallery(NULL);
468a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
469a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  const extensions::Extension* extension = LoadExtension(app_dir());
470a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(extension);
471a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  extensions::ResultCatcher catcher;
473a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AppLaunchParams params(browser()->profile(),
474a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         extension,
475a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         extensions::LAUNCH_CONTAINER_NONE,
476a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                         NEW_WINDOW);
477a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  params.command_line = *CommandLine::ForCurrentProcess();
478a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  OpenApplication(params);
479a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
480a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  bool result = true;
481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  if (!catcher.GetNextResult()) {
482a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    message_ = catcher.message();
483a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    result = false;
484a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  }
485a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  content::RunAllPendingInMessageLoop();  // avoid race on exit in registry.
486a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ASSERT_TRUE(result) << message_;
487a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
488a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
489a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif  // !defined(DISABLE_NACL)
490a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
491e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Test is flaky, it fails on certain bots, namely WinXP Tests(1) and Linux
492e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// (dbg)(1)(32).  See crbug.com/354425.
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX)
49423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define MAYBE_MediaGalleriesNoAccess DISABLED_MediaGalleriesNoAccess
49523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else
49623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define MAYBE_MediaGalleriesNoAccess MediaGalleriesNoAccess
49723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
498868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
49923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       MAYBE_MediaGalleriesNoAccess) {
500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(NULL);
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
50268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
50468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("no_access", custom_args))
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << message_;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
509868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, NoGalleriesRead) {
51068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries")) << message_;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       NoGalleriesCopyTo) {
51568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries_copy_to")) << message_;
516558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
517558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test is flaky. crbug.com/416128
519558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                       DISABLED_MediaGalleriesRead) {
521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoveAllGalleries();
522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(NULL);
52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
52468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
52568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
52668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("read_access", custom_args))
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
530e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// Test is flaky, it fails on certain bots, namely WinXP Tests(1) and Linux
531e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch// (dbg)(1)(32).  See crbug.com/354425.
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_LINUX)
53323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define MAYBE_MediaGalleriesCopyTo DISABLED_MediaGalleriesCopyTo
53423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else
53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define MAYBE_MediaGalleriesCopyTo MediaGalleriesCopyTo
53623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif
537868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
53823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                       MAYBE_MediaGalleriesCopyTo) {
539a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoveAllGalleries();
540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(NULL);
54168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("copy_to_access")) << message_;
542a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
543a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
544a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       MediaGalleriesDelete) {
546effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(NULL);
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::ListValue custom_args;
548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("delete_access", custom_args))
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << message_;
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MediaGalleriesAccessAttached) {
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachFakeDevice();
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
55868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
55968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendString(kDeviceName);
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("access_attached", custom_args))
56268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << message_;
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DetachFakeDevice();
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)|| defined(OS_MACOSX)
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaDefaultLocation) {
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
5711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
5721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeLocalAppDataPath());
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_MACOSX)
5741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
5751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeAppDataPath());
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ListValue custom_args;
579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaCustomLocation) {
5851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ScopedTempDir custom_picasa_app_data_root;
5861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(custom_picasa_app_data_root.CreateUniqueTempDir());
5871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ensure_media_directories_exists()->SetCustomPicasaAppDataPath(
5881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      custom_picasa_app_data_root.path());
5891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(custom_picasa_app_data_root.path());
590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ListValue custom_args;
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
5965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_MACOSX)
5985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       IPhotoTest) {
6005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PopulateIPhotoTestData(
6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeIPhotoRootPath());
6025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ListValue custom_args;
6045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
6055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("iphoto", custom_args)) << message_;
6065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  iapps::SetMacPreferencesForTesting(NULL);
6085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // defined(OS_MACOSX)
6105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
611a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, CancelScan) {
6125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InstallDoNothingFolderFinder();
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("cancel_scan")) << message_;
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
615a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
616a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, Scan) {
617a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ScopedTempDir scan_root;
618a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(scan_root.CreateUniqueTempDir());
619a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::vector<base::FilePath> roots;
620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  roots.push_back(scan_root.path());
621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SetRootsForFolderFinder(roots);
622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Override addScanResults so that the dialog is accepted as soon as it is
624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // created.
625e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  ASSERT_TRUE(extensions::ExtensionFunctionDispatcher::OverrideFunction(
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "mediaGalleries.addScanResults",
627a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      &TestMediaGalleriesAddScanResultsFunction::Factory));
628a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
629a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Add some files and directories to the scan root for testing. Only the
630a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // "f" directory should be found.
631a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  std::string dummy_data;
632a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dummy_data.resize(1);
633a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("a/b")));
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(static_cast<int>(dummy_data.size()),
635a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::WriteFile(scan_root.path().AppendASCII("a/b/c.jpg"),
636a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            dummy_data.c_str(), dummy_data.size()));
637a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("a/d")));
638a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dummy_data.resize(201 * 1024);  // 200k is the min size for the folder finder.
639a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(static_cast<int>(dummy_data.size()),
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::WriteFile(scan_root.path().AppendASCII("a/d/e.txt"),
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            dummy_data.c_str(), dummy_data.size()));
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(base::CreateDirectory(scan_root.path().AppendASCII("f")));
643a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_EQ(static_cast<int>(dummy_data.size()),
644a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)            base::WriteFile(scan_root.path().AppendASCII("f/g.jpg"),
645a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            dummy_data.c_str(), dummy_data.size()));
646a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("scan")) << message_;
6485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
650effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, ToURL) {
651effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  RemoveAllGalleries();
652effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MediaGalleryPrefId pref_id;
653effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(&pref_id);
654effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
655effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::ListValue custom_args;
656effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  custom_args.AppendInteger(base::checked_cast<int>(pref_id));
657effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  custom_args.AppendString(
658effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      browser()->profile()->GetPath().BaseName().MaybeAsASCII());
659effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
660effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(RunMediaGalleriesTestWithArg("tourl", custom_args)) << message_;
661effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
662effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
663a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, GetMetadata) {
664a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  RemoveAllGalleries();
665effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MakeSingleFakeGallery(NULL);
666a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
667a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddFileToSingleFakeGallery(media::GetTestDataFilePath("90rotation.mp4"));
668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  AddFileToSingleFakeGallery(media::GetTestDataFilePath("id3_png_test.mp3"));
669a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  AddFileToSingleFakeGallery(GetWallpaperTestDataDir().AppendASCII("test.jpg"));
670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  base::ListValue custom_args;
672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS)
673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  custom_args.AppendBoolean(true);
674a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
675a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  custom_args.AppendBoolean(false);
676a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
677a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("media_metadata", custom_args))
678a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      << message_;
679a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
680