158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file.
458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <vector>
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/files/file_enumerator.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/ref_counted.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/message_loop/message_loop.h"
1358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/run_loop.h"
1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "build/build_config.h"
1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/media_galleries/fileapi/picasa_data_provider.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_test_util.h"
1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/common/media_galleries/picasa_types.h"
1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/test_browser_thread.h"
2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace picasa {
2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace {
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void VerifyTestAlbumTable(PicasaDataProvider* data_provider,
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                          base::FilePath test_folder_1_path,
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                          base::FilePath test_folder_2_path) {
2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AlbumMap> folders = data_provider->GetFolders();
3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(folders.get());
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(2u, folders->size());
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AlbumMap::const_iterator folder_1 = folders->find(
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      test_folder_1_path.BaseName().AsUTF8Unsafe() + " 1899-12-30");
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(folders->end(), folder_1);
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_1_path.BaseName().AsUTF8Unsafe(),
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            folder_1->second.name);
3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_1_path, folder_1->second.path);
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("uid1", folder_1->second.uid);
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AlbumMap::const_iterator folder_2 = folders->find(
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      test_folder_2_path.BaseName().AsUTF8Unsafe() + " 1899-12-30");
4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(folders->end(), folder_2);
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_2_path.BaseName().AsUTF8Unsafe(),
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            folder_2->second.name);
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_2_path, folder_2->second.path);
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("uid4", folder_2->second.uid);
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AlbumMap> albums = data_provider->GetAlbums();
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(albums.get());
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(2u, albums->size());
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AlbumMap::const_iterator album_1 = albums->find("Album 1 Name 1899-12-30");
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(albums->end(), album_1);
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("Album 1 Name", album_1->second.name);
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(base::FilePath(), album_1->second.path);
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("uid3", album_1->second.uid);
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AlbumMap::const_iterator album_2 = albums->find("Album 2 Name 1899-12-30");
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(albums->end(), album_2);
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("Album 2 Name", album_2->second.name);
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(base::FilePath(), album_2->second.path);
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ("uid5", album_2->second.uid);
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)void VerifyTestAlbumsImagesIndex(PicasaDataProvider* data_provider,
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 base::FilePath test_folder_1_path,
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 base::FilePath test_folder_2_path) {
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::File::Error error;
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AlbumImages> album_1_images =
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data_provider->FindAlbumImages("uid3", &error);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(album_1_images);
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, error);
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(2u, album_1_images->size());
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(album_1_images->end(), album_1_images->find("InBoth.jpg"));
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_1_path.AppendASCII("InBoth.jpg"),
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            (*album_1_images)["InBoth.jpg"]);
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(album_1_images->end(),
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            album_1_images->find("InFirstAlbumOnly.jpg"));
8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_2_path.AppendASCII("InFirstAlbumOnly.jpg"),
8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            (*album_1_images)["InFirstAlbumOnly.jpg"]);
8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<AlbumImages> album_2_images =
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      data_provider->FindAlbumImages("uid5", &error);
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(album_2_images);
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, error);
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(2u, album_2_images->size());
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(album_2_images->end(), album_2_images->find("InBoth.jpg"));
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_1_path.AppendASCII("InBoth.jpg"),
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            (*album_2_images)["InBoth.jpg"]);
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_NE(album_2_images->end(),
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            album_2_images->find("InSecondAlbumOnly.jpg"));
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_EQ(test_folder_1_path.AppendASCII("InSecondAlbumOnly.jpg"),
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            (*album_2_images)["InSecondAlbumOnly.jpg"]);
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class TestPicasaDataProvider : public PicasaDataProvider {
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  explicit TestPicasaDataProvider(const base::FilePath& database_path)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      : PicasaDataProvider(database_path),
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        file_watch_request_returned_(false)  {
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~TestPicasaDataProvider() {}
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // |ready_callback| called with true if and when the file watch is started
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // successfully. If the file watch fails, it's called with false.
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void EnsureFileWatchStartedForTesting(const ReadyCallback& ready_callback) {
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    if (!file_watch_request_returned_) {
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      file_watch_started_callbacks_.push_back(ready_callback);
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return;
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ready_callback.Run(temp_dir_watcher_.get() != NULL);
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Simulates the actual writing process of moving all the database files
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // from the temporary directory to the database directory in a loop.
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void MoveTempFilesToDatabase() {
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::FileEnumerator file_enumerator(
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        database_path_.DirName().AppendASCII(kPicasaTempDirName),
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        false /* recursive */,
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::FileEnumerator::FILES);
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    for (base::FilePath src_path = file_enumerator.Next(); !src_path.empty();
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)         src_path = file_enumerator.Next()) {
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ASSERT_TRUE(
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          base::Move(src_path, database_path_.Append(src_path.BaseName())));
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetInvalidateCallback(const base::Closure& callback) {
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(invalidate_callback_.is_null());
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    invalidate_callback_ = callback;
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InvalidateData() OVERRIDE {
14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PicasaDataProvider::InvalidateData();
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (!invalidate_callback_.is_null()) {
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      invalidate_callback_.Run();
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      invalidate_callback_.Reset();
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    }
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetAlbumMapsForTesting(const AlbumMap& album_map,
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                              const AlbumMap& folder_map) {
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    album_map_ = album_map;
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    folder_map_ = folder_map;
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnTempDirWatchStarted(
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      scoped_ptr<base::FilePathWatcher> temp_dir_watcher) OVERRIDE {
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    PicasaDataProvider::OnTempDirWatchStarted(temp_dir_watcher.Pass());
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file_watch_request_returned_ = true;
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    for (std::vector<ReadyCallback>::const_iterator it =
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)             file_watch_started_callbacks_.begin();
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)         it != file_watch_started_callbacks_.end();
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)         ++it) {
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      it->Run(temp_dir_watcher_.get() != NULL);
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    file_watch_started_callbacks_.clear();
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Used for test that utilizes file watch
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  bool file_watch_request_returned_;
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  std::vector<ReadyCallback> file_watch_started_callbacks_;
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure invalidate_callback_;
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderTest : public InProcessBrowserTest {
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  PicasaDataProviderTest() {}
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~PicasaDataProviderTest() {}
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Runs on the MediaTaskRunner and designed to be overridden by subclasses.
18458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeTestData() {}
18558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void RunTest() {
187e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    base::RunLoop loop;
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    quit_closure_ = loop.QuitClosure();
19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderTest::SetupFoldersAndDataProvider,
19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderTest::InitializeTestData,
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderTest::StartTestOnMediaTaskRunner,
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    loop.Run();
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const = 0;
20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Start the test. The data provider is refreshed before calling StartTest
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // and the result of the refresh is passed in.
20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void VerifyRefreshResults(bool parse_success) {};
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void TestDone() {
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // The data provider must be destructed on the MediaTaskRunner. This is done
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // in a posted task rather than directly because TestDone is called by
21658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // PicasaDataProvider. The callee should not destroy the caller.
21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    MediaFileSystemBackend::MediaTaskRunner()->PostTask(
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        FROM_HERE,
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderTest::DestructDataProviderThenQuit,
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const base::FilePath& test_folder_1_path() { return test_folder_1_.path(); }
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const base::FilePath& test_folder_2_path() { return test_folder_2_.path(); }
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TestPicasaDataProvider* data_provider() const {
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return picasa_data_provider_.get();
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  const base::FilePath GetTempDirPath() const {
231d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return picasa_root_dir_.path().AppendASCII(kPicasaTempDirName);
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual base::FilePath GetColumnFileDestination() const {
235d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return picasa_root_dir_.path().AppendASCII(kPicasaDatabaseDirName);
236d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
237d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
238d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetupFoldersAndDataProvider() {
24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(test_folder_1_.CreateUniqueTempDir());
24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(test_folder_2_.CreateUniqueTempDir());
243d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_TRUE(picasa_root_dir_.CreateUniqueTempDir());
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
245d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        picasa_root_dir_.path().AppendASCII(kPicasaDatabaseDirName)));
246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ASSERT_TRUE(base::CreateDirectory(
247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        picasa_root_dir_.path().AppendASCII(kPicasaTempDirName)));
248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    picasa_data_provider_.reset(new TestPicasaDataProvider(
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)        picasa_root_dir_.path().AppendASCII(kPicasaDatabaseDirName)));
25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StartTestOnMediaTaskRunner() {
25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        RequestedDataType(),
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderTest::VerifyRefreshResults,
25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DestructDataProviderThenQuit() {
26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    picasa_data_provider_.reset();
26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    content::BrowserThread::PostTask(
26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        content::BrowserThread::UI, FROM_HERE, quit_closure_);
26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ScopedTempDir test_folder_1_;
27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::ScopedTempDir test_folder_2_;
271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  base::ScopedTempDir picasa_root_dir_;
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<TestPicasaDataProvider> picasa_data_provider_;
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Closure quit_closure_;
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PicasaDataProviderTest);
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderNoDatabaseGetListTest : public PicasaDataProviderTest {
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE {
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA;
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void VerifyRefreshResults(bool parse_success) OVERRIDE {
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(parse_success);
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestDone();
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderNoDatabaseGetListTest,
29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       NoDatabaseGetList) {
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderNoDatabaseGetAlbumsImagesTest
29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public PicasaDataProviderTest {
29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
29958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE {
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PicasaDataProvider::ALBUMS_IMAGES_DATA;
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void VerifyRefreshResults(bool parse_success) OVERRIDE {
30358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_FALSE(parse_success);
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestDone();
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderNoDatabaseGetAlbumsImagesTest,
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       NoDatabaseGetAlbumsImages) {
31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderGetListTest : public PicasaDataProviderTest {
31458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
31558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeTestData() OVERRIDE {
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WriteTestAlbumTable(GetColumnFileDestination(), test_folder_1_path(),
317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        test_folder_2_path());
31858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
31958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE {
32158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA;
32258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
32358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void VerifyRefreshResults(bool parse_success) OVERRIDE {
32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(parse_success);
326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    VerifyTestAlbumTable(
32758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_provider(), test_folder_1_path(), test_folder_2_path());
32858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestDone();
32958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderGetListTest, GetListTest) {
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderGetAlbumsImagesTest : public PicasaDataProviderTest {
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeTestData() OVERRIDE {
339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WriteTestAlbumTable(GetColumnFileDestination(), test_folder_1_path(),
340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        test_folder_2_path());
341d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WriteTestAlbumsImagesIndex(test_folder_1_path(), test_folder_2_path());
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE {
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PicasaDataProvider::ALBUMS_IMAGES_DATA;
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
34858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void VerifyRefreshResults(bool parse_success) OVERRIDE {
34958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(parse_success);
350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    VerifyTestAlbumTable(
35158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_provider(), test_folder_1_path(), test_folder_2_path());
352d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    VerifyTestAlbumsImagesIndex(
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_provider(), test_folder_1_path(), test_folder_2_path());
35458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    TestDone();
35558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
35658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
35858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderGetAlbumsImagesTest,
35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       GetAlbumsImagesTest) {
36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderMultipleMixedCallbacksTest
36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public PicasaDataProviderTest {
36558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
36658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  PicasaDataProviderMultipleMixedCallbacksTest()
36758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : list_callbacks_called_(0), albums_images_callbacks_called_(0) {}
36858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
36958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeTestData() OVERRIDE {
370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WriteTestAlbumTable(GetColumnFileDestination(), test_folder_1_path(),
371d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                        test_folder_2_path());
372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    WriteTestAlbumsImagesIndex(test_folder_1_path(), test_folder_2_path());
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual PicasaDataProvider::DataType RequestedDataType() const OVERRIDE {
37658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return PicasaDataProvider::ALBUMS_IMAGES_DATA;
37758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
37858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
37958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
38058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void ListCallback(int expected_list_callbacks_called,
38158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            bool parse_success) {
38258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(parse_success);
38358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ(expected_list_callbacks_called, ++list_callbacks_called_);
384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    VerifyTestAlbumTable(
38558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_provider(), test_folder_1_path(), test_folder_2_path());
38658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CheckTestDone();
38758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
38858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
38958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void AlbumsImagesCallback(int expected_albums_images_callbacks_called,
39058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                    bool parse_success) {
39158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(parse_success);
39258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ(expected_albums_images_callbacks_called,
39358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              ++albums_images_callbacks_called_);
394d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    VerifyTestAlbumsImagesIndex(
39558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        data_provider(), test_folder_1_path(), test_folder_2_path());
39658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    CheckTestDone();
39758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
39858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
39958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
40058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void CheckTestDone() {
40158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_LE(list_callbacks_called_, 2);
40258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_LE(albums_images_callbacks_called_, 2);
40358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (list_callbacks_called_ == 2 && albums_images_callbacks_called_ == 2)
40458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      TestDone();
40558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
40658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
40758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StartTestOnMediaTaskRunner() OVERRIDE {
40858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
40958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
41058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
41158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA,
41258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderMultipleMixedCallbacksTest::ListCallback,
41358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this),
41458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   1));
41558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
41658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::ALBUMS_IMAGES_DATA,
41758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
41858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &PicasaDataProviderMultipleMixedCallbacksTest::AlbumsImagesCallback,
41958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this),
42058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            1));
42158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
42258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA,
42358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderMultipleMixedCallbacksTest::ListCallback,
42458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this),
42558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   2));
42658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
42758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::ALBUMS_IMAGES_DATA,
42858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
42958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &PicasaDataProviderMultipleMixedCallbacksTest::AlbumsImagesCallback,
43058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this),
43158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            2));
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int list_callbacks_called_;
43558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int albums_images_callbacks_called_;
43658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
43758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
43858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderMultipleMixedCallbacksTest,
43958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       MultipleMixedCallbacks) {
44058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
44158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
44258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderFileWatcherInvalidateTest
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public PicasaDataProviderGetListTest {
44558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
44658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void ListCallback(bool parse_success) {
44758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_FALSE(parse_success);
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    data_provider()->EnsureFileWatchStartedForTesting(
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        base::Bind(&PicasaDataProviderFileWatcherInvalidateTest::
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       OnPicasaTempDirWatchStarted,
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   base::Unretained(this)));
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void OnPicasaTempDirWatchStarted(bool file_watch_successful) {
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_TRUE(file_watch_successful);
45658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
45758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Validate the list after the file move triggers an invalidate.
45858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->SetInvalidateCallback(base::Bind(
45958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        &PicasaDataProvider::RefreshData,
46058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Unretained(data_provider()),
46158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        RequestedDataType(),
46258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
46358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &PicasaDataProviderFileWatcherInvalidateTest::VerifyRefreshResults,
46458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this))));
46558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->MoveTempFilesToDatabase();
46758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
46858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
469d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual base::FilePath GetColumnFileDestination() const OVERRIDE {
470d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return GetTempDirPath();
47158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
47258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
473d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
47458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StartTestOnMediaTaskRunner() OVERRIDE {
47558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
47658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
47758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Refresh before moving album table to database dir, guaranteeing failure.
47858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
47958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        RequestedDataType(),
48058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(
48158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            &PicasaDataProviderFileWatcherInvalidateTest::ListCallback,
48258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)            base::Unretained(this)));
48358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
48458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
48558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
48658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderFileWatcherInvalidateTest,
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                       FileWatcherInvalidateTest) {
48858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
48958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
49058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderInvalidateInflightTableReaderTest
49258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public PicasaDataProviderGetListTest {
49358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
49458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Don't write the database files until later.
49558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void InitializeTestData() OVERRIDE {}
49658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
49758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
49858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StartTestOnMediaTaskRunner() OVERRIDE {
49958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
50058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Refresh before the database files have been written.
50258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // This is guaranteed to fail to read the album table.
50358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
50458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        RequestedDataType(),
50558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderInvalidateInflightTableReaderTest::
50658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       VerifyRefreshResults,
50758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
50858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
50958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Now write the album table and invalidate the inflight table reader.
51058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PicasaDataProviderGetListTest::InitializeTestData();
51158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->InvalidateData();
51258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // VerifyRefreshResults callback should receive correct results now.
51458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
51558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
51658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
51758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderInvalidateInflightTableReaderTest,
51858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       InvalidateInflightTableReaderTest) {
51958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
52058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
52158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class PicasaDataProviderInvalidateInflightAlbumsIndexerTest
52358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    : public PicasaDataProviderGetAlbumsImagesTest {
52458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected:
52558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void ListCallback(bool parse_success) {
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_TRUE(parse_success);
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Empty the album maps to guarantee that the first utility process will
52958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // fail to get the correct albums-images index.
53058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->SetAlbumMapsForTesting(AlbumMap(), AlbumMap());
53158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
53258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::ALBUMS_IMAGES_DATA,
53358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderInvalidateInflightAlbumsIndexerTest::
53458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       VerifyRefreshResults,
53558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
53658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
53758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Now invalidate all the data. The album maps will be re-read.
53858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->InvalidateData();
53958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // VerifyRefreshResults callback should receive correct results now.
54158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
54258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
54458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void StartTestOnMediaTaskRunner() OVERRIDE {
54558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    DCHECK(MediaFileSystemBackend::CurrentlyOnMediaTaskRunnerThread());
54658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    data_provider()->RefreshData(
54858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        PicasaDataProvider::LIST_OF_ALBUMS_AND_FOLDERS_DATA,
54958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        base::Bind(&PicasaDataProviderInvalidateInflightAlbumsIndexerTest::
55058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       ListCallback,
55158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                   base::Unretained(this)));
55258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
55358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
55458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
55558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(PicasaDataProviderInvalidateInflightAlbumsIndexerTest,
5561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                       InvalidateInflightAlbumsIndexerTest) {
55758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RunTest();
55858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
55958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace picasa
561