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