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"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/file_util.h"
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/json/json_writer.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/path_service.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/safe_numerics.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/values.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/apps/app_browsertest_util.h"
14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/browser_process.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_test_util.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/storage_monitor/storage_info.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/storage_monitor/storage_monitor.h"
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "chrome/common/chrome_paths.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/picasa_finder.h"
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_test_util.h"
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_types.h"
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chrome/common/media_galleries/pmp_test_util.h"
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using extensions::PlatformAppBrowserTest;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Dummy device properties.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDeviceId[] = "testDeviceId";
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kDeviceName[] = "foobar";
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(FILE_PATH_USES_DRIVE_LETTERS)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("C:\\qux");
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::FilePath::CharType kDevicePath[] = FILE_PATH_LITERAL("/qux");
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaGalleriesPlatformAppBrowserTest() : test_jpg_size_(0) {}
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~MediaGalleriesPlatformAppBrowserTest() {}
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::SetUpOnMainThread();
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int64 file_size;
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::GetFileSize(GetCommonDataDir().AppendASCII("test.jpg"),
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                  &file_size));
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    test_jpg_size_ = base::checked_numeric_cast<int>(file_size);
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset();
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::TearDownOnMainThread();
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTest(const std::string& extension_name) {
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    base::ListValue empty_list_value;
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return RunMediaGalleriesTestWithArg(extension_name, empty_list_value);
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTestWithArg(const std::string& extension_name,
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    const base::ListValue& custom_arg_value) {
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Copy the test data for this test into a temporary directory. Then add
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // a common_injected.js to the temporary copy and run it.
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char kTestDir[] = "api_test/media_galleries/";
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath from_dir =
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_data_dir_.AppendASCII(kTestDir + extension_name);
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    from_dir = from_dir.NormalizePathSeparators();
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::ScopedTempDir temp_dir;
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!temp_dir.CreateUniqueTempDir())
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyDirectory(from_dir, temp_dir.path(), true))
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath common_js_path(
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        GetCommonDataDir().AppendASCII("common_injected.js"));
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath inject_js_path(
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        temp_dir.path().AppendASCII(extension_name)
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       .AppendASCII("common_injected.js"));
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyFile(common_js_path, inject_js_path))
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const char* custom_arg = NULL;
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string json_string;
9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!custom_arg_value.empty()) {
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::JSONWriter::Write(&custom_arg_value, &json_string);
9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      custom_arg = json_string.c_str();
10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::AutoReset<base::FilePath> reset(&test_data_dir_, temp_dir.path());
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return RunPlatformAppTestWithArg(extension_name, custom_arg);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AttachFakeDevice() {
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    device_id_ = StorageInfo::MakeDeviceId(
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessAttach(
11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        StorageInfo(device_id_, base::string16(), kDevicePath,
11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    ASCIIToUTF16(kDeviceName), base::string16(),
11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    base::string16(), 0));
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DetachFakeDevice() {
118d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Called if test only wants a single gallery it creates.
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void RemoveAllGalleries() {
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    // Make a copy, as the iterator would be invalidated otherwise.
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const MediaGalleriesPrefInfoMap galleries =
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        preferences->known_galleries();
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    for (MediaGalleriesPrefInfoMap::const_iterator it = galleries.begin();
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         it != galleries.end(); ++it) {
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      preferences->ForgetGalleryById(it->first);
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // This function makes a single fake gallery. This is needed to test platforms
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // with no default media galleries, such as CHROMEOS. This fake gallery is
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // pre-populated with a test.jpg and test.txt.
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void MakeSingleFakeGallery() {
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(fake_gallery_temp_dir_.CreateUniqueTempDir());
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences = GetAndInitializePreferences();
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleryPrefInfo gallery_info;
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_FALSE(preferences->LookUpGalleryByPath(fake_gallery_temp_dir_.path(),
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                  &gallery_info));
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    preferences->AddGallery(gallery_info.device_id,
147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.path,
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            false /* user_added */,
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.volume_label,
150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.vendor_name,
151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.model_name,
152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.total_size_in_bytes,
153a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            gallery_info.last_attach_time);
154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    content::RunAllPendingInMessageLoop();
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath test_data_path(GetCommonDataDir());
158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::FilePath write_path = fake_gallery_temp_dir_.path();
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Valid file, should show up in JS as a FileEntry.
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_data_path.AppendASCII("test.jpg"),
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               write_path.AppendASCII("test.jpg")));
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Invalid file, should not show up as a FileEntry in JS at all.
16568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_data_path.AppendASCII("test.txt"),
16668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               write_path.AppendASCII("test.txt")));
16768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
1701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void PopulatePicasaTestData(const base::FilePath& picasa_app_data_root) {
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_database_path =
1721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa::MakePicasaDatabasePath(picasa_app_data_root);
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_temp_dir_path =
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa_database_path.DirName().AppendASCII(picasa::kPicasaTempDirName);
175a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(picasa_database_path));
176a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(picasa_temp_dir_path));
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Create fake folder directories.
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath folders_root =
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ensure_media_directories_exists_->GetFakePicasaFoldersRootPath();
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_1 = folders_root.AppendASCII("folder1");
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_2 = folders_root.AppendASCII("folder2");
183a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(fake_folder_1));
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(fake_folder_2));
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Write folder and album contents.
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumTable(
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        picasa_database_path, fake_folder_1, fake_folder_2);
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumsImagesIndex(fake_folder_1, fake_folder_2);
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InBoth.jpg")));
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InSecondAlbumOnly.jpg")));
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_2.AppendASCII("InFirstAlbumOnly.jpg")));
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::FilePath GetCommonDataDir() const {
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return test_data_dir_.AppendASCII("api_test")
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("media_galleries")
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("common");
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_galleries() const {
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_->num_galleries();
20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
21068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
21168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size() const { return test_jpg_size_; }
21268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EnsureMediaDirectoriesExists* ensure_media_directories_exists() const {
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_.get();
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MediaGalleriesPreferences* GetAndInitializePreferences() {
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MediaGalleriesPreferences* preferences =
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        g_browser_process->media_file_system_registry()->GetPreferences(
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)            browser()->profile());
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop runloop;
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    preferences->EnsureInitialized(runloop.QuitClosure());
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    runloop.Run();
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    return preferences;
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string device_id_;
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ScopedTempDir fake_gallery_temp_dir_;
23068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size_;
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MediaGalleriesNoAccess) {
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MakeSingleFakeGallery();
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
23868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
24068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("no_access", custom_args))
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << message_;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, NoGalleriesRead) {
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries")) << message_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
250558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       NoGalleriesCopyTo) {
25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries_copy_to")) << message_;
252558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
253558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
254558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MediaGalleriesRead) {
256a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoveAllGalleries();
257a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MakeSingleFakeGallery();
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("read_access", custom_args))
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
266c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                       MediaGalleriesCopyTo) {
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  RemoveAllGalleries();
268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MakeSingleFakeGallery();
26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("copy_to_access")) << message_;
270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       MediaGalleriesDelete) {
274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MakeSingleFakeGallery();
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  base::ListValue custom_args;
276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("delete_access", custom_args))
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      << message_;
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MediaGalleriesAccessAttached) {
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachFakeDevice();
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendString(kDeviceName);
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("access_attached", custom_args))
29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << message_;
291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DetachFakeDevice();
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)|| defined(OS_MACOSX)
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaDefaultLocation) {
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeLocalAppDataPath());
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_MACOSX)
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeAppDataPath());
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
305a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
306a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ListValue custom_args;
307a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaCustomLocation) {
3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ScopedTempDir custom_picasa_app_data_root;
3141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(custom_picasa_app_data_root.CreateUniqueTempDir());
3151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ensure_media_directories_exists()->SetCustomPicasaAppDataPath(
3161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      custom_picasa_app_data_root.path());
3171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(custom_picasa_app_data_root.path());
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::ListValue custom_args;
320a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("picasa", custom_args)) << message_;
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
324