media_galleries_apitest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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)
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// This function is to ensure at least one (fake) media gallery exists for
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// testing platforms with no default media galleries, such as CHROMEOS.
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)void MakeFakeMediaGalleryForTest(Profile* profile, const base::FilePath& path) {
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleriesPreferences* preferences =
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      g_browser_process->media_file_system_registry()->GetPreferences(profile);
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::RunLoop runloop;
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  preferences->EnsureInitialized(runloop.QuitClosure());
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  runloop.Run();
52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MediaGalleryPrefInfo gallery_info;
54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_FALSE(preferences->LookUpGalleryByPath(path, &gallery_info));
55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  preferences->AddGallery(gallery_info.device_id,
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.path,
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          false /* user_added */,
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.volume_label,
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.vendor_name,
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.model_name,
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.total_size_in_bytes,
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                          gallery_info.last_attach_time);
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  content::RunAllPendingInMessageLoop();
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}  // namespace
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MediaGalleriesPlatformAppBrowserTest : public PlatformAppBrowserTest {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  MediaGalleriesPlatformAppBrowserTest() : test_jpg_size_(0) {}
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual ~MediaGalleriesPlatformAppBrowserTest() {}
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE {
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::SetUpOnMainThread();
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset(new EnsureMediaDirectoriesExists);
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PopulatePicturesDirectoryTestData();
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void TearDownOnMainThread() OVERRIDE {
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ensure_media_directories_exists_.reset();
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    PlatformAppBrowserTest::TearDownOnMainThread();
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTest(const std::string& extension_name) {
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    base::ListValue empty_list_value;
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return RunMediaGalleriesTestWithArg(extension_name, empty_list_value);
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool RunMediaGalleriesTestWithArg(const std::string& extension_name,
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                    const base::ListValue& custom_arg_value) {
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Copy the test data for this test into a temporary directory. Then add
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // a common_injected.js to the temporary copy and run it.
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const char kTestDir[] = "api_test/media_galleries/";
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath from_dir =
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_data_dir_.AppendASCII(kTestDir + extension_name);
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    from_dir = from_dir.NormalizePathSeparators();
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::ScopedTempDir temp_dir;
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!temp_dir.CreateUniqueTempDir())
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyDirectory(from_dir, temp_dir.path(), true))
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath common_js_path(
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        GetCommonDataDir().AppendASCII("common_injected.js"));
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath inject_js_path(
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        temp_dir.path().AppendASCII(extension_name)
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       .AppendASCII("common_injected.js"));
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!base::CopyFile(common_js_path, inject_js_path))
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return false;
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    const char* custom_arg = NULL;
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    std::string json_string;
11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    if (!custom_arg_value.empty()) {
11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      base::JSONWriter::Write(&custom_arg_value, &json_string);
11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      custom_arg = json_string.c_str();
11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    }
12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::AutoReset<base::FilePath> reset(&test_data_dir_, temp_dir.path());
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return RunPlatformAppTestWithArg(extension_name, custom_arg);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AttachFakeDevice() {
126d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    device_id_ = StorageInfo::MakeDeviceId(
127d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, kDeviceId);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
129d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessAttach(
13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        StorageInfo(device_id_, base::string16(), kDevicePath,
13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    ASCIIToUTF16(kDeviceName), base::string16(),
13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                    base::string16(), 0));
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DetachFakeDevice() {
137d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    StorageMonitor::GetInstance()->receiver()->ProcessDetach(device_id_);
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content::RunAllPendingInMessageLoop();
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void PopulatePicturesDirectoryTestData() {
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (ensure_media_directories_exists_->num_galleries() == 0)
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return;
14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath test_data_path(GetCommonDataDir());
14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    base::FilePath write_path;
14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(PathService::Get(chrome::DIR_USER_PICTURES, &write_path));
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Valid file, should show up in JS as a FileEntry.
15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_data_path.AppendASCII("test.jpg"),
15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               write_path.AppendASCII("test.jpg")));
15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // Invalid file, should not show up as a FileEntry in JS at all.
15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(base::CopyFile(test_data_path.AppendASCII("test.txt"),
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                               write_path.AppendASCII("test.txt")));
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    int64 file_size;
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_TRUE(file_util::GetFileSize(test_data_path.AppendASCII("test.jpg"),
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                       &file_size));
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    test_jpg_size_ = base::checked_numeric_cast<int>(file_size);
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) || defined(OS_MACOSX)
1641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  void PopulatePicasaTestData(const base::FilePath& picasa_app_data_root) {
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_database_path =
1661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa::MakePicasaDatabasePath(picasa_app_data_root);
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath picasa_temp_dir_path =
1681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        picasa_database_path.DirName().AppendASCII(picasa::kPicasaTempDirName);
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(picasa_database_path));
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(picasa_temp_dir_path));
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Create fake folder directories.
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath folders_root =
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ensure_media_directories_exists_->GetFakePicasaFoldersRootPath();
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_1 = folders_root.AppendASCII("folder1");
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath fake_folder_2 = folders_root.AppendASCII("folder2");
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(fake_folder_1));
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(file_util::CreateDirectory(fake_folder_2));
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    // Write folder and album contents.
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumTable(
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        picasa_database_path, fake_folder_1, fake_folder_2);
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    picasa::WriteTestAlbumsImagesIndex(fake_folder_1, fake_folder_2);
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::FilePath test_jpg_path = GetCommonDataDir().AppendASCII("test.jpg");
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InBoth.jpg")));
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_1.AppendASCII("InSecondAlbumOnly.jpg")));
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(base::CopyFile(
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        test_jpg_path, fake_folder_2.AppendASCII("InFirstAlbumOnly.jpg")));
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::FilePath GetCommonDataDir() const {
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return test_data_dir_.AppendASCII("api_test")
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("media_galleries")
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         .AppendASCII("common");
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int num_galleries() const {
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_->num_galleries();
20368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size() const { return test_jpg_size_; }
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EnsureMediaDirectoriesExists* ensure_media_directories_exists() const {
2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return ensure_media_directories_exists_.get();
2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string device_id_;
21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int test_jpg_size_;
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<EnsureMediaDirectoriesExists> ensure_media_directories_exists_;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       MediaGalleriesNoAccess) {
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::ScopedTempDir temp_dir;
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  MakeFakeMediaGalleryForTest(browser()->profile(), temp_dir.path());
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
22368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
22568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
22668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("no_access", custom_args))
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      << message_;
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest, NoGalleriesRead) {
23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries")) << message_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
235558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch                       NoGalleriesCopyTo) {
23668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("no_galleries_copy_to")) << message_;
237558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch}
238558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
239558790d6acca3451cf3a6b497803a5f07d0bec58Ben MurdochIN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       MediaGalleriesRead) {
24168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
24268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(num_galleries());
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(test_jpg_size());
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("read_access", custom_args))
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      << message_;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
250c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch                       MediaGalleriesCopyTo) {
251a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  base::ScopedTempDir temp_dir;
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MakeFakeMediaGalleryForTest(browser()->profile(), temp_dir.path());
25468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("copy_to_access")) << message_;
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       MediaGalleriesAccessAttached) {
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachFakeDevice();
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  base::ListValue custom_args;
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendInteger(num_galleries() + 1);
26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  custom_args.AppendString(kDeviceName);
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTestWithArg("access_attached", custom_args))
26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      << message_;
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DetachFakeDevice();
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       GetFilesystemMetadata) {
27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("metadata")) << message_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)|| defined(OS_MACOSX)
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaDefaultLocation) {
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN)
2801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
2811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeLocalAppDataPath());
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#elif defined(OS_MACOSX)
2831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(
2841e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      ensure_media_directories_exists()->GetFakeAppDataPath());
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("picasa")) << message_;
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(MediaGalleriesPlatformAppBrowserTest,
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       PicasaCustomLocation) {
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::ScopedTempDir custom_picasa_app_data_root;
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ASSERT_TRUE(custom_picasa_app_data_root.CreateUniqueTempDir());
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ensure_media_directories_exists()->SetCustomPicasaAppDataPath(
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      custom_picasa_app_data_root.path());
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  PopulatePicasaTestData(custom_picasa_app_data_root.path());
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  ASSERT_TRUE(RunMediaGalleriesTest("picasa")) << message_;
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif  // defined(OS_WIN) || defined(OS_MACOSX)
299