| Index: chrome/browser/chromeos/drive/file_cache_unittest.cc | 
| diff --git a/chrome/browser/chromeos/drive/file_cache_unittest.cc b/chrome/browser/chromeos/drive/file_cache_unittest.cc | 
| index 56967ef0a7366056a1a4749d41955a04fe135013..05ef70567e41c176707c7216d389615e3b71992e 100644 | 
| --- a/chrome/browser/chromeos/drive/file_cache_unittest.cc | 
| +++ b/chrome/browser/chromeos/drive/file_cache_unittest.cc | 
| @@ -13,14 +13,11 @@ | 
| #include "base/files/scoped_temp_dir.h" | 
| #include "base/md5.h" | 
| #include "base/path_service.h" | 
| -#include "base/run_loop.h" | 
| -#include "base/threading/sequenced_worker_pool.h" | 
| #include "chrome/browser/chromeos/drive/drive.pb.h" | 
| #include "chrome/browser/chromeos/drive/fake_free_disk_space_getter.h" | 
| #include "chrome/browser/chromeos/drive/file_system_util.h" | 
| #include "chrome/browser/chromeos/drive/resource_metadata_storage.h" | 
| #include "chrome/browser/chromeos/drive/test_util.h" | 
| -#include "content/public/browser/browser_thread.h" | 
| #include "content/public/test/test_browser_thread_bundle.h" | 
| #include "google_apis/drive/test_util.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| @@ -31,496 +28,8 @@ namespace { | 
|  | 
| const char kCacheFileDirectory[] = "files"; | 
|  | 
| -// Bitmask of cache states in FileCacheEntry. | 
| -enum TestFileCacheState { | 
| -  TEST_CACHE_STATE_NONE       = 0, | 
| -  TEST_CACHE_STATE_PINNED     = 1 << 0, | 
| -  TEST_CACHE_STATE_PRESENT    = 1 << 1, | 
| -  TEST_CACHE_STATE_DIRTY      = 1 << 2, | 
| -}; | 
| - | 
| }  // namespace | 
|  | 
| -// Tests FileCache methods from UI thread. It internally uses a real blocking | 
| -// pool and tests the interaction among threads. | 
| -// TODO(hashimoto): remove this class. crbug.com/231221. | 
| -class FileCacheTestOnUIThread : public testing::Test { | 
| - protected: | 
| -  FileCacheTestOnUIThread() : expected_error_(FILE_ERROR_OK), | 
| -                              expected_cache_state_(0) { | 
| -  } | 
| - | 
| -  virtual void SetUp() OVERRIDE { | 
| -    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 
| -    const base::FilePath metadata_dir = temp_dir_.path().AppendASCII("meta"); | 
| -    const base::FilePath cache_dir = | 
| -        temp_dir_.path().AppendASCII(kCacheFileDirectory); | 
| - | 
| -    ASSERT_TRUE(base::CreateDirectory(metadata_dir)); | 
| -    ASSERT_TRUE(base::CreateDirectory(cache_dir)); | 
| - | 
| -    ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), | 
| -                                               &dummy_file_path_)); | 
| -    fake_free_disk_space_getter_.reset(new FakeFreeDiskSpaceGetter); | 
| - | 
| -    scoped_refptr<base::SequencedWorkerPool> pool = | 
| -        content::BrowserThread::GetBlockingPool(); | 
| -    blocking_task_runner_ = | 
| -        pool->GetSequencedTaskRunner(pool->GetSequenceToken()); | 
| - | 
| -    metadata_storage_.reset(new ResourceMetadataStorage( | 
| -        metadata_dir, | 
| -        blocking_task_runner_.get())); | 
| - | 
| -    bool success = false; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_.get(), | 
| -        FROM_HERE, | 
| -        base::Bind(&ResourceMetadataStorage::Initialize, | 
| -                   base::Unretained(metadata_storage_.get())), | 
| -        google_apis::test_util::CreateCopyResultCallback(&success)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    ASSERT_TRUE(success); | 
| - | 
| -    cache_.reset(new FileCache( | 
| -        metadata_storage_.get(), | 
| -        cache_dir, | 
| -        blocking_task_runner_.get(), | 
| -        fake_free_disk_space_getter_.get())); | 
| - | 
| -    success = false; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_.get(), | 
| -        FROM_HERE, | 
| -        base::Bind(&FileCache::Initialize, base::Unretained(cache_.get())), | 
| -        google_apis::test_util::CreateCopyResultCallback(&success)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    ASSERT_TRUE(success); | 
| -  } | 
| - | 
| -  void TestStoreToCache(const std::string& id, | 
| -                        const std::string& md5, | 
| -                        const base::FilePath& source_path, | 
| -                        FileError expected_error, | 
| -                        int expected_cache_state) { | 
| -    expected_error_ = expected_error; | 
| -    expected_cache_state_ = expected_cache_state; | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&internal::FileCache::Store, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id, md5, source_path, | 
| -                   FileCache::FILE_OPERATION_COPY), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| - | 
| -    if (error == FILE_ERROR_OK) { | 
| -      FileCacheEntry cache_entry; | 
| -      EXPECT_TRUE(GetCacheEntryFromOriginThread(id, &cache_entry)); | 
| -      EXPECT_EQ(md5, cache_entry.md5()); | 
| -    } | 
| - | 
| -    VerifyCacheFileState(error, id); | 
| -  } | 
| - | 
| -  void TestRemoveFromCache(const std::string& id, FileError expected_error) { | 
| -    expected_error_ = expected_error; | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&internal::FileCache::Remove, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    VerifyRemoveFromCache(error, id); | 
| -  } | 
| - | 
| -  void VerifyRemoveFromCache(FileError error, const std::string& id) { | 
| -    EXPECT_EQ(expected_error_, error); | 
| - | 
| -    FileCacheEntry cache_entry; | 
| -    if (!GetCacheEntryFromOriginThread(id, &cache_entry)) { | 
| -      EXPECT_EQ(FILE_ERROR_OK, error); | 
| - | 
| -      const base::FilePath path = cache_->GetCacheFilePath(id); | 
| -      EXPECT_FALSE(base::PathExists(path)); | 
| -    } | 
| -  } | 
| - | 
| -  void TestPin(const std::string& id, | 
| -               FileError expected_error, | 
| -               int expected_cache_state) { | 
| -    expected_error_ = expected_error; | 
| -    expected_cache_state_ = expected_cache_state; | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&internal::FileCache::Pin, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    VerifyCacheFileState(error, id); | 
| -  } | 
| - | 
| -  void TestUnpin(const std::string& id, | 
| -                 FileError expected_error, | 
| -                 int expected_cache_state) { | 
| -    expected_error_ = expected_error; | 
| -    expected_cache_state_ = expected_cache_state; | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&internal::FileCache::Unpin, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    VerifyCacheFileState(error, id); | 
| -  } | 
| - | 
| -  void TestMarkAsMounted(const std::string& id, | 
| -                         FileError expected_error, | 
| -                         int expected_cache_state) { | 
| -    expected_error_ = expected_error; | 
| -    expected_cache_state_ = expected_cache_state; | 
| - | 
| -    FileCacheEntry entry; | 
| -    EXPECT_TRUE(GetCacheEntryFromOriginThread(id, &entry)); | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::FilePath cache_file_path; | 
| - | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_.get(), | 
| -        FROM_HERE, | 
| -        base::Bind(&FileCache::MarkAsMounted, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id, | 
| -                   &cache_file_path), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| - | 
| -    EXPECT_TRUE(base::PathExists(cache_file_path)); | 
| -    EXPECT_EQ(cache_file_path, cache_->GetCacheFilePath(id)); | 
| -  } | 
| - | 
| -  void TestMarkAsUnmounted(const std::string& id, | 
| -                           const base::FilePath& file_path, | 
| -                           FileError expected_error, | 
| -                           int expected_cache_state) { | 
| -    expected_error_ = expected_error; | 
| -    expected_cache_state_ = expected_cache_state; | 
| - | 
| -    FileError error = FILE_ERROR_OK; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_.get(), | 
| -        FROM_HERE, | 
| -        base::Bind(&FileCache::MarkAsUnmounted, | 
| -                   base::Unretained(cache_.get()), | 
| -                   file_path), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| - | 
| -    base::FilePath cache_file_path; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&FileCache::GetFile, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id, &cache_file_path), | 
| -        google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    EXPECT_EQ(FILE_ERROR_OK, error); | 
| - | 
| -    EXPECT_TRUE(base::PathExists(cache_file_path)); | 
| -    EXPECT_EQ(cache_file_path, cache_->GetCacheFilePath(id)); | 
| -  } | 
| - | 
| -  void VerifyCacheFileState(FileError error, const std::string& id) { | 
| -    EXPECT_EQ(expected_error_, error); | 
| - | 
| -    // Verify cache map. | 
| -    FileCacheEntry cache_entry; | 
| -    const bool cache_entry_found = | 
| -        GetCacheEntryFromOriginThread(id, &cache_entry); | 
| -    if ((expected_cache_state_ & TEST_CACHE_STATE_PRESENT) || | 
| -        (expected_cache_state_ & TEST_CACHE_STATE_PINNED)) { | 
| -      ASSERT_TRUE(cache_entry_found); | 
| -      EXPECT_EQ((expected_cache_state_ & TEST_CACHE_STATE_PINNED) != 0, | 
| -                cache_entry.is_pinned()); | 
| -      EXPECT_EQ((expected_cache_state_ & TEST_CACHE_STATE_PRESENT) != 0, | 
| -                cache_entry.is_present()); | 
| -      EXPECT_EQ((expected_cache_state_ & TEST_CACHE_STATE_DIRTY) != 0, | 
| -                cache_entry.is_dirty()); | 
| -    } else { | 
| -      EXPECT_FALSE(cache_entry_found); | 
| -    } | 
| - | 
| -    // Verify actual cache file. | 
| -    base::FilePath dest_path = cache_->GetCacheFilePath(id); | 
| -    EXPECT_EQ((expected_cache_state_ & TEST_CACHE_STATE_PRESENT) != 0, | 
| -              base::PathExists(dest_path)); | 
| -  } | 
| - | 
| -  // Helper function to call GetCacheEntry from origin thread. | 
| -  bool GetCacheEntryFromOriginThread(const std::string& id, | 
| -                                     FileCacheEntry* cache_entry) { | 
| -    bool result = false; | 
| -    base::PostTaskAndReplyWithResult( | 
| -        blocking_task_runner_, | 
| -        FROM_HERE, | 
| -        base::Bind(&internal::FileCache::GetCacheEntry, | 
| -                   base::Unretained(cache_.get()), | 
| -                   id, | 
| -                   cache_entry), | 
| -        google_apis::test_util::CreateCopyResultCallback(&result)); | 
| -    test_util::RunBlockingPoolTask(); | 
| -    return result; | 
| -  } | 
| - | 
| -  // Returns true if the cache entry exists for the given ID. | 
| -  bool CacheEntryExists(const std::string& id) { | 
| -    FileCacheEntry cache_entry; | 
| -    return GetCacheEntryFromOriginThread(id, &cache_entry); | 
| -  } | 
| - | 
| -  // Returns the number of the cache files with name <id>, and Confirm | 
| -  // that they have the <md5>. This should return 1 or 0. | 
| -  size_t CountCacheFiles(const std::string& id, const std::string& md5) { | 
| -    base::FilePath path = cache_->GetCacheFilePath(id); | 
| -    base::FileEnumerator enumerator(path.DirName(), | 
| -                                    false,  // recursive | 
| -                                    base::FileEnumerator::FILES, | 
| -                                    path.BaseName().value()); | 
| -    size_t num_files_found = 0; | 
| -    for (base::FilePath current = enumerator.Next(); !current.empty(); | 
| -         current = enumerator.Next()) { | 
| -      ++num_files_found; | 
| -      EXPECT_EQ(util::EscapeCacheFileName(id), | 
| -                current.BaseName().AsUTF8Unsafe()); | 
| -    } | 
| -    return num_files_found; | 
| -  } | 
| - | 
| -  content::TestBrowserThreadBundle thread_bundle_; | 
| -  scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_; | 
| -  base::ScopedTempDir temp_dir_; | 
| -  base::FilePath dummy_file_path_; | 
| - | 
| -  scoped_ptr<ResourceMetadataStorage, test_util::DestroyHelperForTests> | 
| -      metadata_storage_; | 
| -  scoped_ptr<FileCache, test_util::DestroyHelperForTests> cache_; | 
| -  scoped_ptr<FakeFreeDiskSpaceGetter> fake_free_disk_space_getter_; | 
| - | 
| -  FileError expected_error_; | 
| -  int expected_cache_state_; | 
| -  std::string expected_file_extension_; | 
| -}; | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, StoreToCacheSimple) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // Store an existing file. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Store a non-existent file to the same |id| and |md5|. | 
| -  TestStoreToCache(id, md5, | 
| -                   base::FilePath::FromUTF8Unsafe("non_existent_file"), | 
| -                   FILE_ERROR_FAILED, | 
| -                   TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Store a different existing file to the same |id| but different | 
| -  // |md5|. | 
| -  md5 = "new_md5"; | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Verify that there's only one file with name <id>, i.e. previously | 
| -  // cached file with the different md5 should be deleted. | 
| -  EXPECT_EQ(1U, CountCacheFiles(id, md5)); | 
| - | 
| -  // Passing empty MD5 marks the entry as dirty. | 
| -  TestStoreToCache(id, std::string(), dummy_file_path_, FILE_ERROR_OK, | 
| -                   TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_DIRTY); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, RemoveFromCacheSimple) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| -  // First store a file to cache. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Then try to remove existing file from cache. | 
| -  TestRemoveFromCache(id, FILE_ERROR_OK); | 
| - | 
| -  // Repeat using non-alphanumeric characters for ID, including '.' | 
| -  // which is an extension separator. | 
| -  id = "pdf:`~!@#$%^&*()-_=+[{|]}\\;',<.>/?"; | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  TestRemoveFromCache(id, FILE_ERROR_OK); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, PinAndUnpin) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // First store a file to cache. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Pin the existing file in cache. | 
| -  TestPin(id, FILE_ERROR_OK, | 
| -          TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Unpin the existing file in cache. | 
| -  TestUnpin(id, FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Pin back the same existing file in cache. | 
| -  TestPin(id, FILE_ERROR_OK, | 
| -          TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Pin a non-existent file in cache. | 
| -  id = "document:1a2b"; | 
| - | 
| -  TestPin(id, FILE_ERROR_OK, TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Unpin the previously pinned non-existent file in cache. | 
| -  TestUnpin(id, FILE_ERROR_OK, TEST_CACHE_STATE_NONE); | 
| - | 
| -  // Unpin a file that doesn't exist in cache and is not pinned, i.e. cache | 
| -  // has zero knowledge of the file. | 
| -  id = "not-in-cache:1a2b"; | 
| - | 
| -  TestUnpin(id, FILE_ERROR_NOT_FOUND, TEST_CACHE_STATE_NONE); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, StoreToCachePinned) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // Pin a non-existent file. | 
| -  TestPin(id, FILE_ERROR_OK, TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Store an existing file to a previously pinned file. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, FILE_ERROR_OK, | 
| -                   TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Store a non-existent file to a previously pinned and stored file. | 
| -  TestStoreToCache(id, md5, | 
| -                   base::FilePath::FromUTF8Unsafe("non_existent_file"), | 
| -                   FILE_ERROR_FAILED, | 
| -                   TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, RemoveFromCachePinned) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // Store a file to cache, and pin it. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| -  TestPin(id, FILE_ERROR_OK, | 
| -          TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Remove |id| from cache. | 
| -  TestRemoveFromCache(id, FILE_ERROR_OK); | 
| - | 
| -  // Use non-alphanumeric characters for ID, including '.' | 
| -  // which is an extension separator. | 
| -  id = "pdf:`~!@#$%^&*()-_=+[{|]}\\;',<.>/?"; | 
| - | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| -  TestPin(id, FILE_ERROR_OK, | 
| -          TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  TestRemoveFromCache(id, FILE_ERROR_OK); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, MountUnmount) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // First store a file to cache. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Mark the file mounted. | 
| -  TestMarkAsMounted(id, FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| -  EXPECT_TRUE(CacheEntryExists(id)); | 
| - | 
| -  // Try to remove the file. | 
| -  TestRemoveFromCache(id, FILE_ERROR_IN_USE); | 
| - | 
| -  // Clear mounted state of the file. | 
| -  base::FilePath file_path; | 
| -  FileError error = FILE_ERROR_FAILED; | 
| -  base::PostTaskAndReplyWithResult( | 
| -      blocking_task_runner_, | 
| -      FROM_HERE, | 
| -      base::Bind(&FileCache::GetFile, | 
| -                 base::Unretained(cache_.get()), | 
| -                 id, &file_path), | 
| -      google_apis::test_util::CreateCopyResultCallback(&error)); | 
| -  test_util::RunBlockingPoolTask(); | 
| -  EXPECT_EQ(FILE_ERROR_OK, error); | 
| - | 
| -  TestMarkAsUnmounted(id, file_path, FILE_ERROR_OK, TEST_CACHE_STATE_PRESENT); | 
| -  EXPECT_TRUE(CacheEntryExists(id)); | 
| - | 
| -  // Try to remove the file. | 
| -  TestRemoveFromCache(id, FILE_ERROR_OK); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, StoreToCacheNoSpace) { | 
| -  fake_free_disk_space_getter_->set_default_value(0); | 
| - | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| - | 
| -  // Try to store an existing file. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, | 
| -                   FILE_ERROR_NO_LOCAL_SPACE, | 
| -                   TEST_CACHE_STATE_NONE); | 
| - | 
| -  // Verify that there's no files added. | 
| -  EXPECT_EQ(0U, CountCacheFiles(id, md5)); | 
| -} | 
| - | 
| -TEST_F(FileCacheTestOnUIThread, UpdatePinnedCache) { | 
| -  std::string id("pdf:1a2b"); | 
| -  std::string md5("abcdef0123456789"); | 
| -  std::string md5_modified("aaaaaa0000000000"); | 
| - | 
| -  // Store an existing file. | 
| -  TestStoreToCache(id, md5, dummy_file_path_, FILE_ERROR_OK, | 
| -                   TEST_CACHE_STATE_PRESENT); | 
| - | 
| -  // Pin the file. | 
| -  TestPin(id, FILE_ERROR_OK, | 
| -          TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| - | 
| -  // Store the file with a modified content and md5. It should stay pinned. | 
| -  TestStoreToCache(id, md5_modified, dummy_file_path_, FILE_ERROR_OK, | 
| -                   TEST_CACHE_STATE_PRESENT | TEST_CACHE_STATE_PINNED); | 
| -} | 
| - | 
| // Tests FileCache methods working with the blocking task runner. | 
| class FileCacheTest : public testing::Test { | 
| protected: | 
| @@ -723,6 +232,118 @@ TEST_F(FileCacheTest, GetFile) { | 
| EXPECT_EQ(src_contents, contents); | 
| } | 
|  | 
| +TEST_F(FileCacheTest, Store) { | 
| +  const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 
| +  const std::string src_contents = "test"; | 
| +  EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 
| +                                                        src_contents)); | 
| +  std::string id("id"); | 
| +  std::string md5(base::MD5String(src_contents)); | 
| + | 
| +  // Store a file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 
| +      id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  FileCacheEntry cache_entry; | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id, &cache_entry)); | 
| +  EXPECT_TRUE(cache_entry.is_present()); | 
| +  EXPECT_EQ(md5, cache_entry.md5()); | 
| + | 
| +  base::FilePath cache_file_path; | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 
| +  EXPECT_TRUE(base::ContentsEqual(src_file_path, cache_file_path)); | 
| + | 
| +  // Store a non-existent file. | 
| +  EXPECT_EQ(FILE_ERROR_FAILED, cache_->Store( | 
| +      id, md5, base::FilePath::FromUTF8Unsafe("non_existent_file"), | 
| +      FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  // Passing empty MD5 marks the entry as dirty. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 
| +      id, std::string(), src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id, &cache_entry)); | 
| +  EXPECT_TRUE(cache_entry.is_present()); | 
| +  EXPECT_TRUE(cache_entry.md5().empty()); | 
| +  EXPECT_TRUE(cache_entry.is_dirty()); | 
| + | 
| +  // No free space available. | 
| +  fake_free_disk_space_getter_->set_default_value(0); | 
| + | 
| +  EXPECT_EQ(FILE_ERROR_NO_LOCAL_SPACE, cache_->Store( | 
| +      id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| +} | 
| + | 
| +TEST_F(FileCacheTest, PinAndUnpin) { | 
| +  const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 
| +  const std::string src_contents = "test"; | 
| +  EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 
| +                                                        src_contents)); | 
| +  std::string id("id_present"); | 
| +  std::string md5(base::MD5String(src_contents)); | 
| + | 
| +  // Store a file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 
| +      id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  FileCacheEntry cache_entry; | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id, &cache_entry)); | 
| +  EXPECT_FALSE(cache_entry.is_pinned()); | 
| + | 
| +  // Pin the existing file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id)); | 
| + | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id, &cache_entry)); | 
| +  EXPECT_TRUE(cache_entry.is_pinned()); | 
| + | 
| +  // Unpin the file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id)); | 
| + | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id, &cache_entry)); | 
| +  EXPECT_FALSE(cache_entry.is_pinned()); | 
| + | 
| +  // Pin a non-present file. | 
| +  std::string id_non_present = "id_non_present"; | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Pin(id_non_present)); | 
| + | 
| +  EXPECT_TRUE(cache_->GetCacheEntry(id_non_present, &cache_entry)); | 
| +  EXPECT_TRUE(cache_entry.is_pinned()); | 
| + | 
| +  // Unpin the previously pinned non-existent file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Unpin(id_non_present)); | 
| + | 
| +  EXPECT_FALSE(cache_->GetCacheEntry(id_non_present, &cache_entry)); | 
| + | 
| +  // Unpin a file that doesn't exist in cache and is not pinned. | 
| +  EXPECT_EQ(FILE_ERROR_NOT_FOUND, cache_->Unpin("id_non_existent")); | 
| +} | 
| + | 
| +TEST_F(FileCacheTest, MountUnmount) { | 
| +  const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 
| +  const std::string src_contents = "test"; | 
| +  EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 
| +                                                        src_contents)); | 
| +  std::string id("id_present"); | 
| +  std::string md5(base::MD5String(src_contents)); | 
| + | 
| +  // Store a file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 
| +      id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  // Mark the file mounted. | 
| +  base::FilePath cache_file_path; | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsMounted(id, &cache_file_path)); | 
| + | 
| +  // Try to remove it. | 
| +  EXPECT_EQ(FILE_ERROR_IN_USE, cache_->Remove(id)); | 
| + | 
| +  // Clear mounted state of the file. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->MarkAsUnmounted(cache_file_path)); | 
| + | 
| +  // Try to remove again. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); | 
| +} | 
| + | 
| TEST_F(FileCacheTest, OpenForWrite) { | 
| // Prepare a file. | 
| base::FilePath src_file; | 
| @@ -832,6 +453,28 @@ TEST_F(FileCacheTest, ClearDirty) { | 
| EXPECT_FALSE(entry.is_dirty()); | 
| } | 
|  | 
| +TEST_F(FileCacheTest, Remove) { | 
| +  const base::FilePath src_file_path = temp_dir_.path().Append("test.dat"); | 
| +  const std::string src_contents = "test"; | 
| +  EXPECT_TRUE(google_apis::test_util::WriteStringToFile(src_file_path, | 
| +                                                        src_contents)); | 
| +  std::string id("id"); | 
| +  std::string md5(base::MD5String(src_contents)); | 
| + | 
| +  // First store a file to cache. | 
| +  base::FilePath src_file; | 
| +  ASSERT_TRUE(base::CreateTemporaryFileInDir(temp_dir_.path(), &src_file)); | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Store( | 
| +      id, md5, src_file_path, FileCache::FILE_OPERATION_COPY)); | 
| + | 
| +  base::FilePath cache_file_path; | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->GetFile(id, &cache_file_path)); | 
| + | 
| +  // Then try to remove existing file from cache. | 
| +  EXPECT_EQ(FILE_ERROR_OK, cache_->Remove(id)); | 
| +  EXPECT_FALSE(base::PathExists(cache_file_path)); | 
| +} | 
| + | 
| TEST_F(FileCacheTest, RenameCacheFilesToNewFormat) { | 
| const base::FilePath file_directory = | 
| temp_dir_.path().AppendASCII(kCacheFileDirectory); | 
|  |