Chromium Code Reviews| Index: chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider_browsertest.cc |
| diff --git a/chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider_browsertest.cc b/chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider_browsertest.cc |
| index 0a5190517798a6f0441ebcfe8f7737b2d92f3df7..ad0eb127ea6e2bc00238e04a4d82b248fcd813a0 100644 |
| --- a/chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider_browsertest.cc |
| +++ b/chrome/browser/media_galleries/fileapi/picasa/picasa_data_provider_browsertest.cc |
| @@ -3,6 +3,7 @@ |
| // found in the LICENSE file. |
| #include "base/file_util.h" |
| +#include "base/files/file_enumerator.h" |
| #include "base/files/scoped_temp_dir.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| @@ -175,6 +176,61 @@ void VerifyAlbumsImagesIndex(PicasaDataProvider* data_provider, |
| } // namespace |
| +class TestPicasaDataProvider : public PicasaDataProvider { |
| + public: |
| + explicit TestPicasaDataProvider(const base::FilePath& database_path, |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
Yea, it seems like it wouldn't be too much trouble
tommycli
2013/09/03 20:20:43
Done.
|
| + const base::FilePath& temp_dir_path) |
| + : PicasaDataProvider(database_path, temp_dir_path), |
| + temp_dir_path_(temp_dir_path) {} |
| + |
| + virtual ~TestPicasaDataProvider() {} |
| + |
| + // Simulates the actual writing process of moving all the database files |
| + // from the temporary directory to the database directory in a loop. |
| + void MoveTempFilesToDatabase() { |
| + DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| + |
| + base::FileEnumerator file_enumerator( |
| + temp_dir_path_, false /* recursive */, base::FileEnumerator::FILES); |
| + |
| + for (base::FilePath src_path = file_enumerator.Next(); !src_path.empty(); |
| + src_path = file_enumerator.Next()) { |
| + ASSERT_TRUE( |
| + base::Move(src_path, database_path_.Append(src_path.BaseName()))); |
| + } |
| + } |
| + |
| + void SetInvalidateCallback(const base::Closure& callback) { |
| + DCHECK(!invalidate_callback_.get()); |
| + invalidate_callback_.reset(new base::Closure(callback)); |
| + } |
| + |
| + virtual void InvalidateData() OVERRIDE { |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
Should this be private?
tommycli
2013/09/03 20:20:43
No. This is explicitly called by a few tests. (I c
|
| + PicasaDataProvider::InvalidateData(); |
| + |
| + if (invalidate_callback_.get()) { |
| + invalidate_callback_->Run(); |
| + invalidate_callback_.reset(); |
| + } |
| + } |
| + |
| + // Methods are used in the browser test to tweak internal data for testing. |
| + void SetDatabasePathForTesting(const base::FilePath& database_path) { |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
Do you still need this?
tommycli
2013/09/03 20:20:43
Done.
|
| + database_path_ = database_path; |
| + } |
| + |
| + void SetAlbumMapsForTesting(const AlbumMap& album_map, |
| + const AlbumMap& folder_map) { |
| + album_map_ = album_map; |
| + folder_map_ = folder_map; |
| + } |
| + |
| + private: |
| + scoped_ptr<base::Closure> invalidate_callback_; |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
You don't need a scoped_ptr for Closure, just take
tommycli
2013/09/03 20:20:43
Done.
|
| + |
| + base::FilePath temp_dir_path_; |
| +}; |
| + |
| class PicasaDataProviderTest : public InProcessBrowserTest { |
| public: |
| PicasaDataProviderTest() : test_helper_(kPicasaAlbumTableName) {} |
| @@ -226,7 +282,7 @@ class PicasaDataProviderTest : public InProcessBrowserTest { |
| PmpTestHelper* test_helper() { return &test_helper_; } |
| - PicasaDataProvider* data_provider() const { |
| + TestPicasaDataProvider* data_provider() const { |
| return picasa_data_provider_.get(); |
| } |
| @@ -235,18 +291,21 @@ class PicasaDataProviderTest : public InProcessBrowserTest { |
| DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| ASSERT_TRUE(test_folder_1_.CreateUniqueTempDir()); |
| ASSERT_TRUE(test_folder_2_.CreateUniqueTempDir()); |
| + ASSERT_TRUE(database_dir_.CreateUniqueTempDir()); |
| ASSERT_TRUE(test_helper_.Init()); |
| - picasa_data_provider_.reset( |
| - new PicasaDataProvider(test_helper_.GetTempDirPath())); |
| + picasa_data_provider_.reset(new TestPicasaDataProvider( |
| + database_dir_.path(), test_helper_.GetTempDirPath())); |
| } |
| virtual void StartTestOnMediaTaskRunner() { |
| DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| - data_provider()->RefreshData( |
| - RequestedDataType(), |
| - base::Bind(&PicasaDataProviderTest::VerifyRefreshResults, |
| - base::Unretained(this))); |
| + data_provider()->MoveTempFilesToDatabase(); |
| + |
| + data_provider() |
| + ->RefreshData(RequestedDataType(), |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
Don't change this formatting.
tommycli
2013/09/03 20:20:43
Done.
|
| + base::Bind(&PicasaDataProviderTest::VerifyRefreshResults, |
| + base::Unretained(this))); |
| } |
| void DestructDataProviderThenQuit() { |
| @@ -258,9 +317,10 @@ class PicasaDataProviderTest : public InProcessBrowserTest { |
| base::ScopedTempDir test_folder_1_; |
| base::ScopedTempDir test_folder_2_; |
| + base::ScopedTempDir database_dir_; |
| PmpTestHelper test_helper_; |
| - scoped_ptr<PicasaDataProvider> picasa_data_provider_; |
| + scoped_ptr<TestPicasaDataProvider> picasa_data_provider_; |
| base::Closure quit_closure_; |
| @@ -397,6 +457,8 @@ class PicasaDataProviderMultipleMixedCallbacksTest |
| virtual void StartTestOnMediaTaskRunner() OVERRIDE { |
| DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| + data_provider()->MoveTempFilesToDatabase(); |
| + |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
There's a race here - you want to wait until it's
tommycli
2013/09/03 20:20:43
Move is synchronous I believe.
vandebo (ex-Chrome)
2013/09/05 16:49:38
The move is synchronous, but the invalidation trig
tommycli
2013/09/05 21:37:37
Oh, I see what you're saying. I took your recommen
|
| data_provider()->RefreshData( |
| PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA, |
| base::Bind(&PicasaDataProviderMultipleMixedCallbacksTest::ListCallback, |
| @@ -430,52 +492,39 @@ IN_PROC_BROWSER_TEST_F(PicasaDataProviderMultipleMixedCallbacksTest, |
| RunTest(); |
| } |
| -class PicasaDataProviderInvalidateSimpleTest : public PicasaDataProviderTest { |
| +class PicasaDataProviderFileWatcherInvalidateTest |
| + : public PicasaDataProviderGetListTest { |
| protected: |
| - virtual void FirstListCallback(bool parse_success) { |
| + virtual void ListCallback(bool parse_success) { |
| ASSERT_FALSE(parse_success); |
| - WriteTestAlbumTable( |
| - test_helper(), test_folder_1_path(), test_folder_2_path()); |
| - // TODO(tommycli): Remove this line once database is under file watch. |
| - data_provider()->InvalidateData(); |
| - |
| - // Have to post this, otherwise this will run the callback immediately. |
| - MediaFileSystemBackend::MediaTaskRunner()->PostTask( |
| - FROM_HERE, |
| + // Validate the list after the file move triggers an invalidate. |
| + data_provider()->SetInvalidateCallback(base::Bind( |
| + &PicasaDataProvider::RefreshData, |
| + base::Unretained(data_provider()), |
| + RequestedDataType(), |
| base::Bind( |
| - &PicasaDataProvider::RefreshData, |
| - base::Unretained(data_provider()), |
| - RequestedDataType(), |
| - base::Bind( |
| - &PicasaDataProviderInvalidateSimpleTest::SecondListCallback, |
| - base::Unretained(this)))); |
| - } |
| + &PicasaDataProviderFileWatcherInvalidateTest::VerifyRefreshResults, |
| + base::Unretained(this)))); |
| - virtual void SecondListCallback(bool parse_success) { |
| - ASSERT_TRUE(parse_success); |
| - VerifyAlbumTable( |
| - data_provider(), test_folder_1_path(), test_folder_2_path()); |
| - TestDone(); |
| - } |
| - |
| - virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE { |
| - return PicasaDataProvider::ALBUMS_IMAGES_DATA; |
| + data_provider()->MoveTempFilesToDatabase(); |
| } |
| private: |
| virtual void StartTestOnMediaTaskRunner() OVERRIDE { |
| DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| + // Refresh before moving album table to database dir, guaranteeing failure. |
| data_provider()->RefreshData( |
| RequestedDataType(), |
| - base::Bind(&PicasaDataProviderInvalidateSimpleTest::FirstListCallback, |
| - base::Unretained(this))); |
| + base::Bind( |
| + &PicasaDataProviderFileWatcherInvalidateTest::ListCallback, |
| + base::Unretained(this))); |
| } |
| }; |
| -IN_PROC_BROWSER_TEST_F(PicasaDataProviderInvalidateSimpleTest, |
| - InvalidateSimpleTest) { |
| +IN_PROC_BROWSER_TEST_F(PicasaDataProviderFileWatcherInvalidateTest, |
| + FileWatcherInvalidateTest) { |
| RunTest(); |
| } |
| @@ -514,7 +563,7 @@ class PicasaDataProviderInvalidateInflightAlbumsIndexerTest |
| ASSERT_TRUE(parse_success); |
| // Empty the album maps to guarantee that the first utility process will |
| - // give incorrect results. |
| + // fail to get the correct albums-images index. |
| data_provider()->SetAlbumMapsForTesting(AlbumMap(), AlbumMap()); |
| data_provider()->RefreshData( |
| PicasaDataProvider::ALBUMS_IMAGES_DATA, |
| @@ -532,6 +581,8 @@ class PicasaDataProviderInvalidateInflightAlbumsIndexerTest |
| virtual void StartTestOnMediaTaskRunner() OVERRIDE { |
| DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread()); |
| + data_provider()->MoveTempFilesToDatabase(); |
| + |
|
vandebo (ex-Chrome)
2013/08/29 23:19:22
And here
tommycli
2013/09/03 20:20:43
See above.
|
| data_provider()->RefreshData( |
| PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA, |
| base::Bind(&PicasaDataProviderInvalidateInflightAlbumsIndexerTest:: |