10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
20f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
30f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// found in the LICENSE file.
40f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
50f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <string>
60f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <vector>
70f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
80f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/bind.h"
90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/files/file_path.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/files/scoped_temp_dir.h"
120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/format_macros.h"
130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/logging.h"
140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/message_loop/message_loop.h"
160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/run_loop.h"
170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/stl_util.h"
180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/strings/stringprintf.h"
190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/iphoto_data_provider.h"
200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "url/gurl.h"
250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)using base::FilePath;
270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace iphoto {
290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class TestIPhotoDataProvider : public IPhotoDataProvider {
310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  TestIPhotoDataProvider(const base::FilePath& xml_library_path,
330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                         const base::Closure& callback)
340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      : IPhotoDataProvider(xml_library_path),
350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        callback_(callback) {
360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ~TestIPhotoDataProvider() {}
380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void OnLibraryChanged(const base::FilePath& path,
410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                bool error) OVERRIDE {
420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    IPhotoDataProvider::OnLibraryChanged(path, error);
430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    callback_.Run();
440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::Closure callback_;
470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestIPhotoDataProvider);
490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class IPhotoDataProviderTest : public InProcessBrowserTest {
520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  IPhotoDataProviderTest() {}
540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ~IPhotoDataProviderTest() {}
550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) protected:
570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ASSERT_TRUE(library_dir_.CreateUniqueTempDir());
590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    WriteLibraryInternal();
600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // The ImportedMediaGalleryRegistry is created on which ever thread calls
610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // GetInstance() first.  It shouldn't matter what thread creates, however
620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // in practice it is always created on the UI thread, so this calls
630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // GetInstance here to mirror those real conditions.
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ImportedMediaGalleryRegistry::GetInstance();
650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    InProcessBrowserTest::SetUp();
660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void RunTest() {
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    base::RunLoop loop;
710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    quit_closure_ = loop.QuitClosure();
720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        FROM_HERE,
740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        base::Bind(&IPhotoDataProviderTest::StartTestOnMediaTaskRunner,
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   base::Unretained(this)));
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    loop.Run();
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void WriteLibrary(const base::Closure& callback) {
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    SetLibraryChangeCallback(callback);
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    WriteLibraryInternal();
820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void SetLibraryChangeCallback(const base::Closure& callback) {
850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(library_changed_callback_.is_null());
860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    library_changed_callback_ = callback;
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  IPhotoDataProvider* data_provider() const {
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return ImportedMediaGalleryRegistry::IPhotoDataProvider();
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  const base::FilePath& library_dir() const {
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return library_dir_.path();
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::FilePath XmlFile() const {
980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return library_dir_.path().AppendASCII("library.xml");
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Start the test. The data provider is refreshed before calling StartTest
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // and the result of the refresh is passed in.
1030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void StartTest(bool parse_success) = 0;
1040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void TestDone() {
1060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ImportedMediaGalleryRegistry* imported_registry =
1080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ImportedMediaGalleryRegistry::GetInstance();
1090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    imported_registry->iphoto_data_provider_.reset();
1100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
1110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                     quit_closure_);
1120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Override to provide a full library string.
1150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual std::string GetLibraryString() {
1160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return "<plist><dict>\n</dict></plist>\n";
1170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
1200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void StartTestOnMediaTaskRunner() {
1210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ImportedMediaGalleryRegistry* imported_registry =
1230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        ImportedMediaGalleryRegistry::GetInstance();
1240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    imported_registry->iphoto_data_provider_.reset(
1250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        new TestIPhotoDataProvider(
1260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            XmlFile(),
1270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)            base::Bind(&IPhotoDataProviderTest::OnLibraryChanged,
1280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                       base::Unretained(this))));
1290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    data_provider()->RefreshData(base::Bind(&IPhotoDataProviderTest::StartTest,
1300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                                            base::Unretained(this)));
1310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  };
1320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void OnLibraryChanged() {
1340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
1350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (!library_changed_callback_.is_null()) {
1360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      library_changed_callback_.Run();
1370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      library_changed_callback_.Reset();
1380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
1390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void WriteLibraryInternal() {
1420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::string xml = GetLibraryString();
1430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    ASSERT_EQ(static_cast<int>(xml.size()),
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)              base::WriteFile(XmlFile(), xml.c_str(), xml.size()));
1450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
1460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::ScopedTempDir library_dir_;
1480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::Closure library_changed_callback_;
1500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  base::Closure quit_closure_;
1520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderTest);
1540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
1550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class IPhotoDataProviderBasicTest : public IPhotoDataProviderTest {
1570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
1580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  IPhotoDataProviderBasicTest() {}
1590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ~IPhotoDataProviderBasicTest() {}
1600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
1610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual std::string GetLibraryString() OVERRIDE {
1620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return "<plist><dict>\n"
1630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<key>List of Albums</key>\n"
1640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<array>"
1650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <dict>\n"
1660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumId</key>"
1670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <integer>14</integer>"
1680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumName</key>"
1690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>Album1</string>"
1700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>KeyList</key>"
1710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <array>"
1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>1</string>"
1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>3</string>"  // [3] and [4] are name dupes
1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>4</string>"
1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      </array>"
1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    </dict>\n"
1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <dict>\n"
1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumId</key>"
1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <integer>15</integer>"
1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumName</key>"
1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>Album2</string>"
1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>KeyList</key>"
1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <array>"
1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>2</string>"
1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      </array>"
1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    </dict>\n"
1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <dict>\n"
1880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumId</key>"
1890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <integer>16</integer>"
1900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumName</key>"
1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>Album5</string>"
1920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>KeyList</key>"
1930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <array>"
1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>5</string>"  // A name dupe of [2], but in another album.
1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      </array>"
1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    </dict>\n"
1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</array>\n"
1980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<key>Master Image List</key>\n"
1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<dict>\n"
2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>1</key>\n"
2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
2040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption</key>"
2050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption</string>"
2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid1</string>"
2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/path1.jpg</string>"
2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/thumb1.jpg</string>"
2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
2130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>2</key>\n"
2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
2150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
2160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
2170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption</key>"
2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption2</string>"
2190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
2200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid2</string>"
2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/path2.jpg</string>"
2230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/thumb2.jpg</string>"
2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
2260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>3</key>\n"
2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
2280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption</key>"
2310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption3</string>"
2320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
2330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid3</string>"
2340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
2350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/path3.jpg</string>"
2360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
2370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/thumb3.jpg</string>"
2380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
2390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>4</key>\n"  // A name duplicate of [3] in another path.
2400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
2410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
2420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
2430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption</key>"
2440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption</string>"
2450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
2460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid3</string>"
2470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
2480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/dupe/path3.jpg</string>"
2490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
2500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/dupe/thumb3.jpg</string>"
2510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
2520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>5</key>\n"  // A name duplicate of [2] in another path.
2530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
2540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
2550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
2560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption</key>"
2570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption5</string>"
2580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
2590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid2</string>"
2600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
2610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/dupe/path2.jpg</string>"
2620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
2630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/dupe/thumb2.jpg</string>"
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "    <key>OriginalPath</key>"             \
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "    <string>/original/vol/another2.jpg</string>"  \
2660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
2670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</dict>\n"
2680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</dict></plist>\n";
2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
2700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
2720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(parse_success);
2730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
2750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(3U, names.size());
2760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
2770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg").value(),
2790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album1", "path1.jpg").value());
2810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path3.jpg").value(),
2820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album1", "path3.jpg").value());
2840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path3.jpg").value(),
2850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album1", "path3(4).jpg").value());
2870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath().value(),
2880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album1", "path5.jpg").value());
2900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
2910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // path2.jpg is name-duped, but in different albums, and so should not
2920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // be mangled.
2930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path2.jpg").value(),
2940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album5", "path2.jpg").value());
2960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path2.jpg").value(),
2970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum(
2980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                  "Album2", "path2.jpg").value());
2990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::map<std::string, base::FilePath> photos =
3010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        data_provider()->GetAlbumContents("nonexistent");
3020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(0U, photos.size());
3030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    photos = data_provider()->GetAlbumContents("Album1");
3040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(3U, photos.size());
3050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(photos, "path1.jpg"));
3060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_FALSE(ContainsKey(photos, "path2.jpg"));
3070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(photos, "path3.jpg"));
3080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(photos, "path3(4).jpg"));
3090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg").value(), photos["path1.jpg"].value());
3100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path3.jpg").value(),
3110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        photos["path3.jpg"].value());
3120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/dupe/path3.jpg").value(),
3130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        photos["path3(4).jpg"].value());
3140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    photos = data_provider()->GetAlbumContents("Album2");
3160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(1U, photos.size());
3170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(ContainsKey(photos, "path2.jpg"));
3180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(data_provider()->HasOriginals("Album1"));
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(data_provider()->HasOriginals("Album5"));
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    std::map<std::string, base::FilePath> originals =
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        data_provider()->GetOriginals("Album1");
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(0U, originals.size());
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    originals = data_provider()->GetOriginals("Album5");
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(1U, originals.size());
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_TRUE(ContainsKey(originals, "path2.jpg"));
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_FALSE(ContainsKey(originals, "path1.jpg"));
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(FilePath("/original/vol/another2.jpg").value(),
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              originals["path2.jpg"].value());
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    base::FilePath original_path =
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        data_provider()->GetOriginalPhotoLocation("Album5", "path2.jpg");
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(FilePath("/original/vol/another2.jpg").value(),
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              original_path.value());
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    TestDone();
3360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
3370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
3390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderBasicTest);
3400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
3410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class IPhotoDataProviderRefreshTest : public IPhotoDataProviderTest {
3430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
3440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  IPhotoDataProviderRefreshTest() {}
3450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ~IPhotoDataProviderRefreshTest() {}
3460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  std::string another_album;
3480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual std::string GetLibraryString() OVERRIDE {
3500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    return "<plist><dict>\n"
3510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<key>List of Albums</key>\n"
3520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<array>"
3530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <dict>"
3540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumId</key>"
3550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <integer>14</integer>"
3560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumName</key>"
3570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>Album1</string>"
3580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>KeyList</key>"
3590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <array>"
3600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>1</string>"
3610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      </array>"
3620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    </dict>\n" +
3630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      another_album +
3640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</array>\n"
3650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<key>Master Image List</key>\n"
3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "<dict>\n"
3670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <key>1</key>\n"
3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  <dict>\n"
3690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>MediaType</key>"
3700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>Image</string>"
3710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>Caption1</key>"
3720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>caption</string>"
3730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>GUID</key>\n"
3740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>guid1</string>"
3750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ImagePath</key>"
3760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/path1.jpg</string>"
3770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <key>ThumbPath</key>"
3780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <string>/vol/thumb1.jpg</string>"
3790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "  </dict>\n"
3800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</dict>\n"
3810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "</dict></plist>\n";
3820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
3830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
3850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(parse_success);
3860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
3880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
3890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
3900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(1U, names.size());
3910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
3920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
3930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    another_album =
3940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    <dict>"
3950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumId</key>"
3960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <integer>14</integer>"
3970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>AlbumName</key>"
3980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>Another Album</string>"
3990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <key>KeyList</key>"
4000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <array>"
4010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      <string>1</string>"
4020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "      </array>"
4030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      "    </dict>\n";
4040f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4050f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    WriteLibrary(base::Bind(&IPhotoDataProviderRefreshTest::CheckAfterWrite,
4060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                            base::Unretained(this)));
4070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void CheckAfterWrite() {
4100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    // No change -- data has not been parsed.
4110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
4120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
4130f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
4140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(1U, names.size());
4150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ("Album1", names[0]);
4160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    data_provider()->RefreshData(
4180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        base::Bind(&IPhotoDataProviderRefreshTest::CheckRefresh,
4190f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   base::Unretained(this)));
4200f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void CheckRefresh(bool is_valid) {
4230f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(is_valid);
4240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(FilePath("/vol/path1.jpg"),
4260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)              data_provider()->GetPhotoLocationInAlbum("Album1", "path1.jpg"));
4270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    std::vector<std::string> names = data_provider()->GetAlbumNames();
4280f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_EQ(2U, names.size());
4290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    if (names.size() == 2U) {
4300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ("Album1", names[0]);
4310f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      EXPECT_EQ("Another Album", names[1]);
4320f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    }
4330f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    TestDone();
4350f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4360f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4370f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
4380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderRefreshTest);
4390f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
4400f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4410f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)class IPhotoDataProviderInvalidTest : public IPhotoDataProviderTest {
4420f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) public:
4430f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  IPhotoDataProviderInvalidTest() {}
4440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual ~IPhotoDataProviderInvalidTest() {}
4450f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4460f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void StartTest(bool parse_success) OVERRIDE {
4470f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_TRUE(parse_success);
4480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    SetLibraryChangeCallback(
4500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)        base::Bind(&IPhotoDataProvider::RefreshData,
4510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   base::Unretained(data_provider()),
4520f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                   base::Bind(&IPhotoDataProviderInvalidTest::CheckInvalid,
4530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)                              base::Unretained(this))));
454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(1L, base::WriteFile(XmlFile(), " ", 1));
4550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4560f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4570f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void CheckInvalid(bool is_valid) {
4580f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    EXPECT_FALSE(is_valid);
4590f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)    TestDone();
4600f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  }
4610f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4620f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) private:
4630f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(IPhotoDataProviderInvalidTest);
4640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)};
4650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderBasicTest, BasicTest) {
4670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RunTest();
4680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
4690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderRefreshTest, RefreshTest) {
4710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RunTest();
4720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
4730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(IPhotoDataProviderInvalidTest, InvalidTest) {
4750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  RunTest();
4760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
4770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
4780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}  // namespace iphoto
479