15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 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)
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_util.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/format_macros.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/logging.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h"
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/run_loop.h"
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/stl_util.h"
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/stringprintf.h"
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h"
20c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "url/gurl.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::FilePath;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace iphoto {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestIPhotoDataProvider : public IPhotoDataProvider {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestIPhotoDataProvider(const base::FilePath& xml_library_path,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const base::Closure& callback)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : IPhotoDataProvider(xml_library_path),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        callback_(callback) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestIPhotoDataProvider() {}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnLibraryChanged(const base::FilePath& path,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool error) OVERRIDE {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IPhotoDataProvider::OnLibraryChanged(path, error);
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    callback_.Run();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure callback_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestIPhotoDataProvider);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPhotoDataProviderTest : public InProcessBrowserTest {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPhotoDataProviderTest() {}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IPhotoDataProviderTest() {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(library_dir_.CreateUniqueTempDir());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteLibraryInternal();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The ImportedMediaGalleryRegistry is created on which ever thread calls
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetInstance() first.  It shouldn't matter what thread creates, however
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // in practice it is always created on the UI thread, so this calls
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // GetInstance here to mirror those real conditions.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportedMediaGalleryRegistry::GetInstance();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InProcessBrowserTest::SetUp();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RunTest() {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::RunLoop loop;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    quit_closure_ = loop.QuitClosure();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IPhotoDataProviderTest::StartTestOnMediaTaskRunner,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    loop.Run();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteLibrary(const base::Closure& callback) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLibraryChangeCallback(callback);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteLibraryInternal();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLibraryChangeCallback(const base::Closure& callback) {
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(library_changed_callback_.is_null());
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    library_changed_callback_ = callback;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPhotoDataProvider* data_provider() const {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ImportedMediaGalleryRegistry::IPhotoDataProvider();
91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::FilePath& library_dir() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return library_dir_.path();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FilePath XmlFile() const {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return library_dir_.path().AppendASCII("library.xml");
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Start the test. The data provider is refreshed before calling StartTest
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and the result of the refresh is passed in.
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartTest(bool parse_success) = 0;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void TestDone() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportedMediaGalleryRegistry* imported_registry =
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ImportedMediaGalleryRegistry::GetInstance();
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    imported_registry->iphoto_data_provider_.reset();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     quit_closure_);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Override to provide a full library string.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetLibraryString() {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<plist><dict>\n</dict></plist>\n";
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartTestOnMediaTaskRunner() {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ImportedMediaGalleryRegistry* imported_registry =
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ImportedMediaGalleryRegistry::GetInstance();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    imported_registry->iphoto_data_provider_.reset(
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        new TestIPhotoDataProvider(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            XmlFile(),
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            base::Bind(&IPhotoDataProviderTest::OnLibraryChanged,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::Unretained(this))));
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_provider()->RefreshData(base::Bind(&IPhotoDataProviderTest::StartTest,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            base::Unretained(this)));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnLibraryChanged() {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!library_changed_callback_.is_null()) {
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      library_changed_callback_.Run();
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      library_changed_callback_.Reset();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void WriteLibraryInternal() {
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string xml = GetLibraryString();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(static_cast<int>(xml.size()),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              base::WriteFile(XmlFile(), xml.c_str(), xml.size()));
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::ScopedTempDir library_dir_;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure library_changed_callback_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Closure quit_closure_;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderTest);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPhotoDataProviderBasicTest : public IPhotoDataProviderTest {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPhotoDataProviderBasicTest() {}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IPhotoDataProviderBasicTest() {}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetLibraryString() OVERRIDE {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<plist><dict>\n"
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<key>List of Albums</key>\n"
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<array>"
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <dict>\n"
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumId</key>"
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <integer>14</integer>"
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumName</key>"
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>Album1</string>"
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>KeyList</key>"
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <array>"
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>1</string>"
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>3</string>"  // [3] and [4] are name dupes
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>4</string>"
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      </array>"
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    </dict>\n"
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <dict>\n"
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumId</key>"
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <integer>15</integer>"
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumName</key>"
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>Album2</string>"
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>KeyList</key>"
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <array>"
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>2</string>"
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      </array>"
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    </dict>\n"
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <dict>\n"
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumId</key>"
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <integer>16</integer>"
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumName</key>"
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>Album5</string>"
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>KeyList</key>"
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <array>"
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>5</string>"  // A name dupe of [2], but in another album.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      </array>"
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    </dict>\n"
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</array>\n"
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<key>Master Image List</key>\n"
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<dict>\n"
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>1</key>\n"
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption</key>"
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption</string>"
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid1</string>"
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/path1.jpg</string>"
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/thumb1.jpg</string>"
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>2</key>\n"
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption</key>"
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption2</string>"
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid2</string>"
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/path2.jpg</string>"
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/thumb2.jpg</string>"
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>3</key>\n"
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption</key>"
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption3</string>"
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid3</string>"
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/path3.jpg</string>"
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/thumb3.jpg</string>"
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>4</key>\n"  // A name duplicate of [3] in another path.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption</key>"
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption</string>"
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid3</string>"
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/dupe/path3.jpg</string>"
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/dupe/thumb3.jpg</string>"
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>5</key>\n"  // A name duplicate of [2] in another path.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption</key>"
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption5</string>"
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid2</string>"
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/dupe/path2.jpg</string>"
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/dupe/thumb2.jpg</string>"
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>OriginalPath</key>"             \
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/original/vol/another2.jpg</string>"  \
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</dict>\n"
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</dict></plist>\n";
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(parse_success);
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3U, names.size());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg").value(),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album1", "path1.jpg").value());
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path3.jpg").value(),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album1", "path3.jpg").value());
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path3.jpg").value(),
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album1", "path3(4).jpg").value());
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath().value(),
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album1", "path5.jpg").value());
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // path2.jpg is name-duped, but in different albums, and so should not
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // be mangled.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path2.jpg").value(),
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album5", "path2.jpg").value());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path2.jpg").value(),
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  "Album2", "path2.jpg").value());
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::map<std::string, base::FilePath> photos =
301ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch        data_provider()->GetAlbumContents("nonexistent");
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, photos.size());
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    photos = data_provider()->GetAlbumContents("Album1");
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(3U, photos.size());
305ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(ContainsKey(photos, "path1.jpg"));
306ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_FALSE(ContainsKey(photos, "path2.jpg"));
307ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(ContainsKey(photos, "path3.jpg"));
308ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    EXPECT_TRUE(ContainsKey(photos, "path3(4).jpg"));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg").value(), photos["path1.jpg"].value());
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path3.jpg").value(),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        photos["path3.jpg"].value());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path3.jpg").value(),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        photos["path3(4).jpg"].value());
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    photos = data_provider()->GetAlbumContents("Album2");
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, photos.size());
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(photos, "path2.jpg"));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(data_provider()->HasOriginals("Album1"));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(data_provider()->HasOriginals("Album5"));
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::map<std::string, base::FilePath> originals =
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_provider()->GetOriginals("Album1");
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, originals.size());
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    originals = data_provider()->GetOriginals("Album5");
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, originals.size());
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(originals, "path2.jpg"));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(ContainsKey(originals, "path1.jpg"));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/original/vol/another2.jpg").value(),
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              originals["path2.jpg"].value());
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::FilePath original_path =
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        data_provider()->GetOriginalPhotoLocation("Album5", "path2.jpg");
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/original/vol/another2.jpg").value(),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              original_path.value());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDone();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderBasicTest);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPhotoDataProviderRefreshTest : public IPhotoDataProviderTest {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
344868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  IPhotoDataProviderRefreshTest() {}
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IPhotoDataProviderRefreshTest() {}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string another_album;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetLibraryString() OVERRIDE {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return "<plist><dict>\n"
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<key>List of Albums</key>\n"
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<array>"
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <dict>"
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumId</key>"
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <integer>14</integer>"
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumName</key>"
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>Album1</string>"
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>KeyList</key>"
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <array>"
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>1</string>"
361868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "      </array>"
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    </dict>\n" +
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      another_album +
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</array>\n"
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<key>Master Image List</key>\n"
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<dict>\n"
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <key>1</key>\n"
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <dict>\n"
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>MediaType</key>"
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>Image</string>"
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>Caption1</key>"
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>caption</string>"
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>GUID</key>\n"
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>guid1</string>"
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ImagePath</key>"
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/path1.jpg</string>"
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <key>ThumbPath</key>"
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <string>/vol/thumb1.jpg</string>"
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  </dict>\n"
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</dict>\n"
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</dict></plist>\n";
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(parse_success);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, names.size());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    another_album =
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    <dict>"
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumId</key>"
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <integer>14</integer>"
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>AlbumName</key>"
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>Another Album</string>"
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <key>KeyList</key>"
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <array>"
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      <string>1</string>"
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      </array>"
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    </dict>\n";
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WriteLibrary(base::Bind(&IPhotoDataProviderRefreshTest::CheckAfterWrite,
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            base::Unretained(this)));
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckAfterWrite() {
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No change -- data has not been parsed.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1U, names.size());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_provider()->RefreshData(
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IPhotoDataProviderRefreshTest::CheckRefresh,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(this)));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckRefresh(bool is_valid) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(is_valid);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(2U, names.size());
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (names.size() == 2U) {
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ("Album1", names[0]);
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ("Another Album", names[1]);
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDone();
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderRefreshTest);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class IPhotoDataProviderInvalidTest : public IPhotoDataProviderTest {
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  IPhotoDataProviderInvalidTest() {}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~IPhotoDataProviderInvalidTest() {}
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(parse_success);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLibraryChangeCallback(
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&IPhotoDataProvider::RefreshData,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Unretained(data_provider()),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   base::Bind(&IPhotoDataProviderInvalidTest::CheckInvalid,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              base::Unretained(this))));
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(1L, base::WriteFile(XmlFile(), " ", 1));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckInvalid(bool is_valid) {
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(is_valid);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TestDone();
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderInvalidTest);
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderBasicTest, BasicTest) {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderRefreshTest, RefreshTest) {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderInvalidTest, InvalidTest) {
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTest();
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace iphoto
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)