Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5011)

Unified Diff: chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc

Issue 10874028: Rename GDataFileSystem* to DriveFileSystem* (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remaining manual changes Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc
diff --git a/chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc b/chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc
deleted file mode 100644
index dd42b20a64ffdf89145d9b8f467c2ce65eefa2ac..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/gdata/gdata_file_system_unittest.cc
+++ /dev/null
@@ -1,2649 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <string>
-#include <vector>
-
-#include "base/bind.h"
-#include "base/file_path.h"
-#include "base/file_util.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop.h"
-#include "base/path_service.h"
-#include "base/scoped_temp_dir.h"
-#include "base/stringprintf.h"
-#include "base/threading/sequenced_worker_pool.h"
-#include "base/values.h"
-#include "chrome/browser/chromeos/cros/cros_library.h"
-#include "chrome/browser/chromeos/gdata/drive.pb.h"
-#include "chrome/browser/chromeos/gdata/drive_api_parser.h"
-#include "chrome/browser/chromeos/gdata/drive_webapps_registry.h"
-#include "chrome/browser/chromeos/gdata/gdata_file_system.h"
-#include "chrome/browser/chromeos/gdata/gdata_test_util.h"
-#include "chrome/browser/chromeos/gdata/gdata_uploader.h"
-#include "chrome/browser/chromeos/gdata/gdata_util.h"
-#include "chrome/browser/chromeos/gdata/mock_directory_change_observer.h"
-#include "chrome/browser/chromeos/gdata/mock_drive_cache_observer.h"
-#include "chrome/browser/chromeos/gdata/mock_drive_service.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/test/base/testing_profile.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/test/test_browser_thread.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::AtLeast;
-using ::testing::Eq;
-using ::testing::NotNull;
-using ::testing::Return;
-using ::testing::StrictMock;
-using ::testing::_;
-
-namespace gdata {
-namespace {
-
-const char kSymLinkToDevNull[] = "/dev/null";
-
-const int64 kLotsOfSpace = kMinFreeSpace * 10;
-
-struct SearchResultPair {
- const char* path;
- const bool is_directory;
-};
-
-// Callback to GDataFileSystem::Search used in ContentSearch tests.
-// Verifies returned vector of results.
-void DriveSearchCallback(
- MessageLoop* message_loop,
- const SearchResultPair* expected_results,
- size_t expected_results_size,
- DriveFileError error,
- const GURL& next_feed,
- scoped_ptr<std::vector<SearchResultInfo> > results) {
- ASSERT_TRUE(results.get());
- ASSERT_EQ(expected_results_size, results->size());
-
- for (size_t i = 0; i < results->size(); i++) {
- EXPECT_EQ(FilePath(expected_results[i].path),
- results->at(i).path);
- EXPECT_EQ(expected_results[i].is_directory,
- results->at(i).is_directory);
- }
-
- message_loop->Quit();
-}
-
-// Action used to set mock expectations for
-// DriveServiceInterface::GetDocumentEntry().
-ACTION_P2(MockGetDocumentEntry, status, value) {
- base::MessageLoopProxy::current()->PostTask(FROM_HERE,
- base::Bind(arg1, status, base::Passed(value)));
-}
-
-// Action used to set mock expectations for
-// GDataUploaderInterface::UploadExistingFile().
-ACTION_P4(MockUploadExistingFile,
- error, gdata_path, local_file_path, document_entry) {
- scoped_ptr<UploadFileInfo> upload_file_info(new UploadFileInfo);
- upload_file_info->gdata_path = gdata_path;
- upload_file_info->file_path = local_file_path;
- upload_file_info->entry.reset(document_entry);
- base::MessageLoopProxy::current()->PostTask(FROM_HERE,
- base::Bind(arg5, error, base::Passed(&upload_file_info)));
-
- const int kUploadId = 123;
- return kUploadId;
-}
-
-// Action used to set mock expectations for
-// GDataFileSystem::CopyDocument().
-ACTION_P2(MockCopyDocument, status, value) {
- base::MessageLoopProxy::current()->PostTask(
- FROM_HERE,
- base::Bind(arg2, status, base::Passed(value)));
-}
-
-// Returns the absolute path for a test file stored under
-// chrome/test/data/chromeos/gdata.
-FilePath GetTestFilePath(const FilePath::StringType& base_name) {
- FilePath path;
- std::string error;
- PathService::Get(chrome::DIR_TEST_DATA, &path);
- path = path.AppendASCII("chromeos")
- .AppendASCII("gdata")
- .AppendASCII(base_name.c_str());
- EXPECT_TRUE(file_util::PathExists(path)) <<
- "Couldn't find " << path.value();
- return path;
-}
-
-// Loads a test JSON file as a base::Value.
-base::Value* LoadJSONFile(const std::string& base_name) {
- FilePath path = GetTestFilePath(base_name);
-
- std::string error;
- JSONFileValueSerializer serializer(path);
- base::Value* value = serializer.Deserialize(NULL, &error);
- EXPECT_TRUE(value) <<
- "Parse error " << path.value() << ": " << error;
- return value;
-}
-
-// Counts the number of files (not directories) in |entries|.
-int CountFiles(const DriveEntryProtoVector& entries) {
- int num_files = 0;
- for (size_t i = 0; i < entries.size(); ++i) {
- if (!entries[i].file_info().is_directory())
- ++num_files;
- }
- return num_files;
-}
-
-} // namespace
-
-class MockFreeDiskSpaceGetter : public FreeDiskSpaceGetterInterface {
- public:
- virtual ~MockFreeDiskSpaceGetter() {}
- MOCK_CONST_METHOD0(AmountOfFreeDiskSpace, int64());
-};
-
-class MockGDataUploader : public GDataUploaderInterface {
- public:
- virtual ~MockGDataUploader() {}
- // This function is not mockable by gmock.
- virtual int UploadNewFile(
- scoped_ptr<UploadFileInfo> upload_file_info) OVERRIDE {
- // Set a document entry for an uploaded file.
- // Used for TransferFileFromLocalToRemote_RegularFile test.
- scoped_ptr<base::Value> value(LoadJSONFile("uploaded_file.json"));
- scoped_ptr<DocumentEntry> document_entry(
- DocumentEntry::ExtractAndParse(*value));
- upload_file_info->entry = document_entry.Pass();
-
- // Run the completion callback.
- const UploadFileInfo::UploadCompletionCallback callback =
- upload_file_info->completion_callback;
- if (!callback.is_null())
- callback.Run(DRIVE_FILE_OK, upload_file_info.Pass());
-
- const int kUploadId = 123;
- return kUploadId;
- }
-
- // This function is not mockable by gmock.
- virtual int StreamExistingFile(
- scoped_ptr<UploadFileInfo> upload_file_info) OVERRIDE { return 0; }
-
- MOCK_METHOD6(UploadExistingFile,
- int(const GURL& upload_location,
- const FilePath& gdata_file_path,
- const FilePath& local_file_path,
- int64 file_size,
- const std::string& content_type,
- const UploadFileInfo::UploadCompletionCallback& callback));
-
- MOCK_METHOD2(UpdateUpload, void(int upload_id,
- content::DownloadItem* download));
- MOCK_CONST_METHOD1(GetUploadedBytes, int64(int upload_id));
-};
-
-class MockDriveWebAppsRegistry : public DriveWebAppsRegistryInterface {
- public:
- virtual ~MockDriveWebAppsRegistry() {}
-
- MOCK_METHOD3(GetWebAppsForFile, void(const FilePath& file,
- const std::string& mime_type,
- ScopedVector<DriveWebAppInfo>* apps));
- MOCK_METHOD1(GetExtensionsForWebStoreApp,
- std::set<std::string>(const std::string& web_store_id));
- MOCK_METHOD1(UpdateFromFeed, void(const AccountMetadataFeed& metadata));
- MOCK_METHOD1(UpdateFromApplicationList, void(const AppList& applist));
-};
-
-class GDataFileSystemTest : public testing::Test {
- protected:
- GDataFileSystemTest()
- : ui_thread_(content::BrowserThread::UI, &message_loop_),
- io_thread_(content::BrowserThread::IO),
- cache_(NULL),
- file_system_(NULL),
- mock_drive_service_(NULL),
- mock_webapps_registry_(NULL),
- num_callback_invocations_(0),
- expected_error_(DRIVE_FILE_OK),
- expected_cache_state_(0),
- expected_sub_dir_type_(DriveCache::CACHE_TYPE_META),
- expected_success_(true),
- expect_outgoing_symlink_(false),
- root_feed_changestamp_(0) {
- }
-
- virtual void SetUp() OVERRIDE {
- chromeos::CrosLibrary::Initialize(true /* use_stub */);
- io_thread_.StartIOThread();
-
- profile_.reset(new TestingProfile);
-
- callback_helper_ = new CallbackHelper;
-
- // Allocate and keep a pointer to the mock, and inject it into the
- // GDataFileSystem object, which will own the mock object.
- mock_drive_service_ = new StrictMock<MockDriveService>;
-
- EXPECT_CALL(*mock_drive_service_, Initialize(profile_.get())).Times(1);
-
- // Likewise, this will be owned by GDataFileSystem.
- mock_free_disk_space_checker_ = new StrictMock<MockFreeDiskSpaceGetter>;
- SetFreeDiskSpaceGetterForTesting(mock_free_disk_space_checker_);
-
- scoped_refptr<base::SequencedWorkerPool> pool =
- content::BrowserThread::GetBlockingPool();
- blocking_task_runner_ =
- pool->GetSequencedTaskRunner(pool->GetSequenceToken());
-
- cache_ = DriveCache::CreateDriveCacheOnUIThread(
- DriveCache::GetCacheRootPath(profile_.get()), blocking_task_runner_);
-
- mock_uploader_.reset(new StrictMock<MockGDataUploader>);
- mock_webapps_registry_.reset(new StrictMock<MockDriveWebAppsRegistry>);
-
- ASSERT_FALSE(file_system_);
- file_system_ = new GDataFileSystem(profile_.get(),
- cache_,
- mock_drive_service_,
- mock_uploader_.get(),
- mock_webapps_registry_.get(),
- blocking_task_runner_);
-
- mock_cache_observer_.reset(new StrictMock<MockDriveCacheObserver>);
- cache_->AddObserver(mock_cache_observer_.get());
-
- mock_directory_observer_.reset(new StrictMock<MockDirectoryChangeObserver>);
- file_system_->AddObserver(mock_directory_observer_.get());
-
- file_system_->Initialize();
- cache_->RequestInitializeOnUIThreadForTesting();
- test_util::RunBlockingPoolTask();
- }
-
- virtual void TearDown() OVERRIDE {
- ASSERT_TRUE(file_system_);
- EXPECT_CALL(*mock_drive_service_, CancelAll()).Times(1);
- delete file_system_;
- file_system_ = NULL;
- delete mock_drive_service_;
- mock_drive_service_ = NULL;
- SetFreeDiskSpaceGetterForTesting(NULL);
- cache_->DestroyOnUIThread();
- // The cache destruction requires to post a task to the blocking pool.
- test_util::RunBlockingPoolTask();
-
- profile_.reset(NULL);
- chromeos::CrosLibrary::Shutdown();
- }
-
- // Loads test json file as root ("/drive") element.
- void LoadRootFeedDocument(const std::string& filename) {
- LoadChangeFeed(filename, 0);
- }
-
- void LoadChangeFeed(const std::string& filename,
- int largest_changestamp) {
- std::string error;
- scoped_ptr<Value> document(LoadJSONFile(filename));
- ASSERT_TRUE(document.get());
- ASSERT_TRUE(document->GetType() == Value::TYPE_DICTIONARY);
- scoped_ptr<DocumentFeed> document_feed(
- DocumentFeed::ExtractAndParse(*document));
- ASSERT_TRUE(document_feed.get());
- std::vector<DocumentFeed*> feed_list;
- feed_list.push_back(document_feed.get());
- ASSERT_TRUE(UpdateContent(feed_list, largest_changestamp));
- }
-
- void AddDirectoryFromFile(const FilePath& directory_path,
- const std::string& filename) {
- std::string error;
- scoped_ptr<Value> atom(LoadJSONFile(filename));
- ASSERT_TRUE(atom.get());
- ASSERT_TRUE(atom->GetType() == Value::TYPE_DICTIONARY);
-
- DictionaryValue* dict_value = NULL;
- Value* entry_value = NULL;
- ASSERT_TRUE(atom->GetAsDictionary(&dict_value));
- ASSERT_TRUE(dict_value->Get("entry", &entry_value));
-
- DictionaryValue* entry_dict = NULL;
- ASSERT_TRUE(entry_value->GetAsDictionary(&entry_dict));
-
- // Tweak entry title to match the last segment of the directory path
- // (new directory name).
- std::vector<FilePath::StringType> dir_parts;
- directory_path.GetComponents(&dir_parts);
- entry_dict->SetString("title.$t", dir_parts[dir_parts.size() - 1]);
-
- ASSERT_EQ(file_system_->AddNewDirectory(directory_path.DirName(),
- entry_value),
- DRIVE_FILE_OK)
- << "Failed adding "
- << directory_path.DirName().value();
- }
-
- // Updates the content of directory under |directory_path| with parsed feed
- // |value|.
- bool UpdateContent(const std::vector<DocumentFeed*>& list,
- int largest_changestamp) {
- GURL unused;
- return file_system_->UpdateFromFeedForTesting(
- list,
- largest_changestamp,
- root_feed_changestamp_++) == DRIVE_FILE_OK;
- }
-
- bool RemoveEntry(const FilePath& file_path) {
- return file_system_->RemoveEntryAndCacheLocally(file_path) ==
- DRIVE_FILE_OK;
- }
-
- FilePath GetCachePathForFile(const std::string& resource_id,
- const std::string& md5) {
- return cache_->GetCacheFilePath(resource_id,
- md5,
- DriveCache::CACHE_TYPE_TMP,
- DriveCache::CACHED_FILE_FROM_SERVER);
- }
-
- // Gets entry info by path synchronously.
- scoped_ptr<DriveEntryProto> GetEntryInfoByPathSync(
- const FilePath& file_path) {
- file_system_->GetEntryInfoByPath(
- file_path,
- base::Bind(&CallbackHelper::GetEntryInfoCallback,
- callback_helper_.get()));
- test_util::RunBlockingPoolTask();
-
- return callback_helper_->entry_proto_.Pass();
- }
-
- // Gets directory info by path synchronously.
- scoped_ptr<DriveEntryProtoVector> ReadDirectoryByPathSync(
- const FilePath& file_path) {
- file_system_->ReadDirectoryByPath(
- file_path,
- base::Bind(&CallbackHelper::ReadDirectoryCallback,
- callback_helper_.get()));
- test_util::RunBlockingPoolTask();
-
- return callback_helper_->directory_entries_.Pass();
- }
-
- // Returns true if an entry exists at |file_path|.
- bool EntryExists(const FilePath& file_path) {
- return GetEntryInfoByPathSync(file_path).get();
- }
-
-
- // Gets the resource ID of |file_path|. Returns an empty string if not found.
- std::string GetResourceIdByPath(const FilePath& file_path) {
- scoped_ptr<DriveEntryProto> entry_proto =
- GetEntryInfoByPathSync(file_path);
- if (entry_proto.get())
- return entry_proto->resource_id();
- else
- return "";
- }
-
- // Helper function to call GetCacheEntry from origin thread.
- bool GetCacheEntryFromOriginThread(const std::string& resource_id,
- const std::string& md5,
- DriveCacheEntry* cache_entry) {
- bool result = false;
- blocking_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&GDataFileSystemTest::GetCacheEntryFromOriginThreadInternal,
- base::Unretained(this),
- resource_id,
- md5,
- cache_entry,
- &result));
- test_util::RunBlockingPoolTask();
- return result;
- }
-
- // Used to implement GetCacheEntry.
- void GetCacheEntryFromOriginThreadInternal(
- const std::string& resource_id,
- const std::string& md5,
- DriveCacheEntry* cache_entry,
- bool* result) {
- *result = cache_->GetCacheEntry(resource_id, md5, cache_entry);
- }
-
- // Returns true if the cache entry exists for the given resource ID and MD5.
- bool CacheEntryExists(const std::string& resource_id,
- const std::string& md5) {
- DriveCacheEntry cache_entry;
- return GetCacheEntryFromOriginThread(resource_id, md5, &cache_entry);
- }
-
- // Returns true if the cache file exists for the given resource ID and MD5.
- bool CacheFileExists(const std::string& resource_id,
- const std::string& md5) {
- const FilePath file_path = cache_->GetCacheFilePath(
- resource_id,
- md5,
- DriveCache::CACHE_TYPE_TMP,
- DriveCache::CACHED_FILE_FROM_SERVER);
- return file_util::PathExists(file_path);
- }
-
- void TestStoreToCache(
- const std::string& resource_id,
- const std::string& md5,
- const FilePath& source_path,
- DriveFileError expected_error,
- int expected_cache_state,
- DriveCache::CacheSubDirectoryType expected_sub_dir_type) {
- expected_error_ = expected_error;
- expected_cache_state_ = expected_cache_state;
- expected_sub_dir_type_ = expected_sub_dir_type;
-
- cache_->StoreOnUIThread(
- resource_id, md5, source_path,
- DriveCache::FILE_OPERATION_COPY,
- base::Bind(&GDataFileSystemTest::VerifyCacheFileState,
- base::Unretained(this)));
-
- test_util::RunBlockingPoolTask();
- }
-
- void TestPin(
- const std::string& resource_id,
- const std::string& md5,
- DriveFileError expected_error,
- int expected_cache_state,
- DriveCache::CacheSubDirectoryType expected_sub_dir_type) {
- expected_error_ = expected_error;
- expected_cache_state_ = expected_cache_state;
- expected_sub_dir_type_ = expected_sub_dir_type;
-
- cache_->PinOnUIThread(
- resource_id, md5,
- base::Bind(&GDataFileSystemTest::VerifyCacheFileState,
- base::Unretained(this)));
-
- test_util::RunBlockingPoolTask();
- }
-
- void TestMarkDirty(
- const std::string& resource_id,
- const std::string& md5,
- DriveFileError expected_error,
- int expected_cache_state,
- DriveCache::CacheSubDirectoryType expected_sub_dir_type) {
- expected_error_ = expected_error;
- expected_cache_state_ = expected_cache_state;
- expected_sub_dir_type_ = expected_sub_dir_type;
- expect_outgoing_symlink_ = false;
-
- cache_->MarkDirtyOnUIThread(
- resource_id, md5,
- base::Bind(&GDataFileSystemTest::VerifyMarkDirty,
- base::Unretained(this)));
-
- test_util::RunBlockingPoolTask();
- }
-
- void VerifyMarkDirty(DriveFileError error,
- const std::string& resource_id,
- const std::string& md5,
- const FilePath& cache_file_path) {
- VerifyCacheFileState(error, resource_id, md5);
-
- // Verify filename of |cache_file_path|.
- if (error == DRIVE_FILE_OK) {
- FilePath base_name = cache_file_path.BaseName();
- EXPECT_EQ(util::EscapeCacheFileName(resource_id) +
- FilePath::kExtensionSeparator +
- "local",
- base_name.value());
- } else {
- EXPECT_TRUE(cache_file_path.empty());
- }
- }
-
- void TestCommitDirty(
- const std::string& resource_id,
- const std::string& md5,
- DriveFileError expected_error,
- int expected_cache_state,
- DriveCache::CacheSubDirectoryType expected_sub_dir_type) {
- expected_error_ = expected_error;
- expected_cache_state_ = expected_cache_state;
- expected_sub_dir_type_ = expected_sub_dir_type;
- expect_outgoing_symlink_ = true;
-
- cache_->CommitDirtyOnUIThread(
- resource_id, md5,
- base::Bind(&GDataFileSystemTest::VerifyCacheFileState,
- base::Unretained(this)));
-
- test_util::RunBlockingPoolTask();
- }
-
- // Verify the file identified by |resource_id| and |md5| is in the expected
- // cache state after |OpenFile|, that is, marked dirty and has no outgoing
- // symlink, etc.
- void VerifyCacheStateAfterOpenFile(DriveFileError error,
- const std::string& resource_id,
- const std::string& md5,
- const FilePath& cache_file_path) {
- expected_error_ = DRIVE_FILE_OK;
- expected_cache_state_ = (test_util::TEST_CACHE_STATE_PRESENT |
- test_util::TEST_CACHE_STATE_DIRTY |
- test_util::TEST_CACHE_STATE_PERSISTENT);
- expected_sub_dir_type_ = DriveCache::CACHE_TYPE_PERSISTENT;
- expect_outgoing_symlink_ = false;
- VerifyMarkDirty(error, resource_id, md5, cache_file_path);
- }
-
- // Verify the file identified by |resource_id| and |md5| is in the expected
- // cache state after |CloseFile|, that is, marked dirty and has an outgoing
- // symlink, etc.
- void VerifyCacheStateAfterCloseFile(DriveFileError error,
- const std::string& resource_id,
- const std::string& md5) {
- expected_error_ = DRIVE_FILE_OK;
- expected_cache_state_ = (test_util::TEST_CACHE_STATE_PRESENT |
- test_util::TEST_CACHE_STATE_DIRTY |
- test_util::TEST_CACHE_STATE_PERSISTENT);
- expected_sub_dir_type_ = DriveCache::CACHE_TYPE_PERSISTENT;
- expect_outgoing_symlink_ = true;
- VerifyCacheFileState(error, resource_id, md5);
- }
-
- void VerifyCacheFileState(DriveFileError error,
- const std::string& resource_id,
- const std::string& md5) {
- ++num_callback_invocations_;
-
- EXPECT_EQ(expected_error_, error);
-
- // Verify cache map.
- DriveCacheEntry cache_entry;
- const bool cache_entry_found =
- GetCacheEntryFromOriginThread(resource_id, md5, &cache_entry);
- if (test_util::ToCacheEntry(expected_cache_state_).is_present() ||
- test_util::ToCacheEntry(expected_cache_state_).is_pinned()) {
- ASSERT_TRUE(cache_entry_found);
- EXPECT_TRUE(test_util::CacheStatesEqual(
- test_util::ToCacheEntry(expected_cache_state_),
- cache_entry));
- EXPECT_EQ(expected_sub_dir_type_,
- DriveCache::GetSubDirectoryType(cache_entry));
- } else {
- EXPECT_FALSE(cache_entry_found);
- }
-
- // Verify actual cache file.
- FilePath dest_path = cache_->GetCacheFilePath(
- resource_id,
- md5,
- test_util::ToCacheEntry(expected_cache_state_).is_pinned() ||
- test_util::ToCacheEntry(expected_cache_state_).is_dirty() ?
- DriveCache::CACHE_TYPE_PERSISTENT :
- DriveCache::CACHE_TYPE_TMP,
- test_util::ToCacheEntry(expected_cache_state_).is_dirty() ?
- DriveCache::CACHED_FILE_LOCALLY_MODIFIED :
- DriveCache::CACHED_FILE_FROM_SERVER);
- bool exists = file_util::PathExists(dest_path);
- if (test_util::ToCacheEntry(expected_cache_state_).is_present())
- EXPECT_TRUE(exists);
- else
- EXPECT_FALSE(exists);
-
- // Verify symlink in pinned dir.
- FilePath symlink_path = cache_->GetCacheFilePath(
- resource_id,
- std::string(),
- DriveCache::CACHE_TYPE_PINNED,
- DriveCache::CACHED_FILE_FROM_SERVER);
- // Check that pin symlink exists, without dereferencing to target path.
- exists = file_util::IsLink(symlink_path);
- if (test_util::ToCacheEntry(expected_cache_state_).is_pinned()) {
- EXPECT_TRUE(exists);
- FilePath target_path;
- EXPECT_TRUE(file_util::ReadSymbolicLink(symlink_path, &target_path));
- if (test_util::ToCacheEntry(expected_cache_state_).is_present())
- EXPECT_EQ(dest_path, target_path);
- else
- EXPECT_EQ(kSymLinkToDevNull, target_path.value());
- } else {
- EXPECT_FALSE(exists);
- }
-
- // Verify symlink in outgoing dir.
- symlink_path = cache_->GetCacheFilePath(
- resource_id,
- std::string(),
- DriveCache::CACHE_TYPE_OUTGOING,
- DriveCache::CACHED_FILE_FROM_SERVER);
- // Check that outgoing symlink exists, without dereferencing to target path.
- exists = file_util::IsLink(symlink_path);
- if (expect_outgoing_symlink_ &&
- test_util::ToCacheEntry(expected_cache_state_).is_dirty()) {
- EXPECT_TRUE(exists);
- FilePath target_path;
- EXPECT_TRUE(file_util::ReadSymbolicLink(symlink_path, &target_path));
- EXPECT_TRUE(target_path.value() != kSymLinkToDevNull);
- if (test_util::ToCacheEntry(expected_cache_state_).is_present())
- EXPECT_EQ(dest_path, target_path);
- } else {
- EXPECT_FALSE(exists);
- }
- }
-
- void SetExpectationsForGetDocumentEntry(scoped_ptr<base::Value>* document,
- const std::string& resource_id) {
- EXPECT_CALL(*mock_drive_service_, GetDocumentEntry(resource_id, _))
- .WillOnce(MockGetDocumentEntry(gdata::HTTP_SUCCESS, document));
- }
-
- // Loads serialized proto file from GCache, and makes sure the root
- // filesystem has a root at 'drive'
- void TestLoadMetadataFromCache() {
- file_system_->LoadRootFeedFromCacheForTesting();
- test_util::RunBlockingPoolTask();
- }
-
- // Creates a proto file representing a filesystem with directories:
- // drive, drive/Dir1, drive/Dir1/SubDir2
- // and files
- // drive/File1, drive/Dir1/File2, drive/Dir1/SubDir2/File3.
- // Sets the changestamp to 654321, equal to that of "account_metadata.json"
- // test data, indicating the cache is holding the latest file system info.
- void SaveTestFileSystem() {
- DriveRootDirectoryProto root;
- root.set_version(kProtoVersion);
- root.set_largest_changestamp(654321);
- DriveDirectoryProto* root_dir = root.mutable_gdata_directory();
- DriveEntryProto* dir_base = root_dir->mutable_gdata_entry();
- PlatformFileInfoProto* platform_info = dir_base->mutable_file_info();
- dir_base->set_title("drive");
- dir_base->set_resource_id(kDriveRootDirectoryResourceId);
- dir_base->set_upload_url("http://resumable-create-media/1");
- platform_info->set_is_directory(true);
-
- // drive/File1
- DriveEntryProto* file = root_dir->add_child_files();
- file->set_title("File1");
- file->set_resource_id("resource_id:File1");
- file->set_upload_url("http://resumable-edit-media/1");
- file->mutable_file_specific_info()->set_file_md5("md5");
- platform_info = file->mutable_file_info();
- platform_info->set_is_directory(false);
- platform_info->set_size(1048576);
-
- // drive/Dir1
- DriveDirectoryProto* dir1 = root_dir->add_child_directories();
- dir_base = dir1->mutable_gdata_entry();
- dir_base->set_title("Dir1");
- dir_base->set_resource_id("resource_id:Dir1");
- dir_base->set_upload_url("http://resumable-create-media/2");
- platform_info = dir_base->mutable_file_info();
- platform_info->set_is_directory(true);
-
- // drive/Dir1/File2
- file = dir1->add_child_files();
- file->set_title("File2");
- file->set_resource_id("resource_id:File2");
- file->set_upload_url("http://resumable-edit-media/2");
- file->mutable_file_specific_info()->set_file_md5("md5");
- platform_info = file->mutable_file_info();
- platform_info->set_is_directory(false);
- platform_info->set_size(555);
-
- // drive/Dir1/SubDir2
- DriveDirectoryProto* dir2 = dir1->add_child_directories();
- dir_base = dir2->mutable_gdata_entry();
- dir_base->set_title("SubDir2");
- dir_base->set_resource_id("resource_id:SubDir2");
- dir_base->set_upload_url("http://resumable-create-media/3");
- platform_info = dir_base->mutable_file_info();
- platform_info->set_is_directory(true);
-
- // drive/Dir1/SubDir2/File3
- file = dir2->add_child_files();
- file->set_title("File3");
- file->set_resource_id("resource_id:File3");
- file->set_upload_url("http://resumable-edit-media/3");
- file->mutable_file_specific_info()->set_file_md5("md5");
- platform_info = file->mutable_file_info();
- platform_info->set_is_directory(false);
- platform_info->set_size(12345);
-
- // Write this proto out to GCache/vi/meta/file_system.pb
- std::string serialized_proto;
- ASSERT_TRUE(root.SerializeToString(&serialized_proto));
- ASSERT_TRUE(!serialized_proto.empty());
-
- FilePath cache_dir_path = profile_->GetPath().Append(
- FILE_PATH_LITERAL("GCache/v1/meta/"));
- ASSERT_TRUE(file_util::CreateDirectory(cache_dir_path));
- const int file_size = static_cast<int>(serialized_proto.length());
- ASSERT_EQ(file_util::WriteFile(cache_dir_path.Append("file_system.pb"),
- serialized_proto.data(), file_size), file_size);
- }
-
- // Verifies that |file_path| is a valid JSON file for the hosted document
- // associated with |entry| (i.e. |url| and |resource_id| match).
- void VerifyHostedDocumentJSONFile(const DriveEntryProto& entry_proto,
- const FilePath& file_path) {
- std::string error;
- JSONFileValueSerializer serializer(file_path);
- scoped_ptr<Value> value(serializer.Deserialize(NULL, &error));
- ASSERT_TRUE(value.get()) << "Parse error " << file_path.value()
- << ": " << error;
- DictionaryValue* dict_value = NULL;
- ASSERT_TRUE(value->GetAsDictionary(&dict_value));
-
- std::string edit_url, resource_id;
- EXPECT_TRUE(dict_value->GetString("url", &edit_url));
- EXPECT_TRUE(dict_value->GetString("resource_id", &resource_id));
-
- EXPECT_EQ(entry_proto.file_specific_info().alternate_url(),
- edit_url);
- EXPECT_EQ(entry_proto.resource_id(), resource_id);
- }
-
- // This is used as a helper for registering callbacks that need to be
- // RefCountedThreadSafe, and a place where we can fetch results from various
- // operations.
- class CallbackHelper
- : public base::RefCountedThreadSafe<CallbackHelper> {
- public:
- CallbackHelper()
- : last_error_(DRIVE_FILE_OK),
- quota_bytes_total_(0),
- quota_bytes_used_(0),
- entry_proto_(NULL) {}
-
- virtual void GetFileCallback(DriveFileError error,
- const FilePath& file_path,
- const std::string& mime_type,
- DriveFileType file_type) {
- last_error_ = error;
- download_path_ = file_path;
- mime_type_ = mime_type;
- file_type_ = file_type;
- }
-
- virtual void FileOperationCallback(DriveFileError error) {
- DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
-
- last_error_ = error;
- }
-
- virtual void GetAvailableSpaceCallback(DriveFileError error,
- int64 bytes_total,
- int64 bytes_used) {
- last_error_ = error;
- quota_bytes_total_ = bytes_total;
- quota_bytes_used_ = bytes_used;
- }
-
- virtual void OpenFileCallback(DriveFileError error,
- const FilePath& file_path) {
- last_error_ = error;
- opened_file_path_ = file_path;
- MessageLoop::current()->Quit();
- }
-
- virtual void CloseFileCallback(DriveFileError error) {
- last_error_ = error;
- MessageLoop::current()->Quit();
- }
-
- virtual void GetEntryInfoCallback(
- DriveFileError error,
- scoped_ptr<DriveEntryProto> entry_proto) {
- last_error_ = error;
- entry_proto_ = entry_proto.Pass();
- }
-
- virtual void ReadDirectoryCallback(
- DriveFileError error,
- bool /* hide_hosted_documents */,
- scoped_ptr<DriveEntryProtoVector> entries) {
- last_error_ = error;
- directory_entries_ = entries.Pass();
- }
-
- DriveFileError last_error_;
- FilePath download_path_;
- FilePath opened_file_path_;
- std::string mime_type_;
- DriveFileType file_type_;
- int64 quota_bytes_total_;
- int64 quota_bytes_used_;
- scoped_ptr<DriveEntryProto> entry_proto_;
- scoped_ptr<DriveEntryProtoVector> directory_entries_;
-
- protected:
- virtual ~CallbackHelper() {}
-
- private:
- friend class base::RefCountedThreadSafe<CallbackHelper>;
- };
-
- MessageLoopForUI message_loop_;
- // The order of the test threads is important, do not change the order.
- // See also content/browser/browser_thread_impl.cc.
- content::TestBrowserThread ui_thread_;
- content::TestBrowserThread io_thread_;
- scoped_refptr<base::SequencedTaskRunner> blocking_task_runner_;
- scoped_ptr<TestingProfile> profile_;
- scoped_refptr<CallbackHelper> callback_helper_;
- DriveCache* cache_;
- scoped_ptr<StrictMock<MockGDataUploader> > mock_uploader_;
- GDataFileSystem* file_system_;
- StrictMock<MockDriveService>* mock_drive_service_;
- scoped_ptr<StrictMock<MockDriveWebAppsRegistry> > mock_webapps_registry_;
- StrictMock<MockFreeDiskSpaceGetter>* mock_free_disk_space_checker_;
- scoped_ptr<StrictMock<MockDriveCacheObserver> > mock_cache_observer_;
- scoped_ptr<StrictMock<MockDirectoryChangeObserver> > mock_directory_observer_;
-
- int num_callback_invocations_;
- DriveFileError expected_error_;
- int expected_cache_state_;
- DriveCache::CacheSubDirectoryType expected_sub_dir_type_;
- bool expected_success_;
- bool expect_outgoing_symlink_;
- std::string expected_file_extension_;
- int root_feed_changestamp_;
- static bool cros_initialized_;
-};
-
-bool GDataFileSystemTest::cros_initialized_ = false;
-
-void AsyncInitializationCallback(
- int* counter,
- int expected_counter,
- const FilePath& expected_file_path,
- MessageLoop* message_loop,
- DriveFileError error,
- scoped_ptr<DriveEntryProto> entry_proto) {
- ASSERT_EQ(DRIVE_FILE_OK, error);
- ASSERT_TRUE(entry_proto.get());
- ASSERT_TRUE(entry_proto->file_info().is_directory());
- EXPECT_EQ(expected_file_path.value(), entry_proto->base_name());
-
- (*counter)++;
- if (*counter >= expected_counter)
- message_loop->Quit();
-}
-
-TEST_F(GDataFileSystemTest, DuplicatedAsyncInitialization) {
- int counter = 0;
- GetEntryInfoCallback callback = base::Bind(
- &AsyncInitializationCallback,
- &counter,
- 2,
- FilePath(FILE_PATH_LITERAL("drive")),
- &message_loop_);
-
- EXPECT_CALL(*mock_drive_service_, GetAccountMetadata(_)).Times(1);
- EXPECT_CALL(*mock_drive_service_,
- GetDocuments(Eq(GURL()), _, _, _, _)).Times(1);
-
- EXPECT_CALL(*mock_webapps_registry_, UpdateFromFeed(_)).Times(1);
-
- file_system_->GetEntryInfoByPath(
- FilePath(FILE_PATH_LITERAL("drive")), callback);
- file_system_->GetEntryInfoByPath(
- FilePath(FILE_PATH_LITERAL("drive")), callback);
- message_loop_.Run(); // Wait to get our result
- EXPECT_EQ(2, counter);
-}
-
-TEST_F(GDataFileSystemTest, SearchRootDirectory) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(FILE_PATH_LITERAL("drive"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(
- FilePath(FILE_PATH_LITERAL(kFilePath)));
- ASSERT_TRUE(entry.get());
- EXPECT_EQ(kDriveRootDirectoryResourceId, entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchExistingFile) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:2_file_resource_id", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchExistingDocument) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/Document 1.gdoc"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("document:5_document_resource_id", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchNonExistingFile) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/nonexisting.file"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_FALSE(entry.get());
-}
-
-TEST_F(GDataFileSystemTest, SearchEncodedFileNames) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath1 = FilePath(
- FILE_PATH_LITERAL("drive/Slash / in file 1.txt"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath1);
- ASSERT_FALSE(entry.get());
-
- const FilePath kFilePath2 = FilePath::FromUTF8Unsafe(
- "drive/Slash \xE2\x88\x95 in file 1.txt");
- entry = GetEntryInfoByPathSync(kFilePath2);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:slash_file_resource_id", entry->resource_id());
-
- const FilePath kFilePath3 = FilePath::FromUTF8Unsafe(
- "drive/Slash \xE2\x88\x95 in directory/Slash SubDir File.txt");
- entry = GetEntryInfoByPathSync(kFilePath3);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:slash_subdir_file", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchEncodedFileNamesLoadingRoot) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath1 = FilePath(
- FILE_PATH_LITERAL("drive/Slash / in file 1.txt"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath1);
- ASSERT_FALSE(entry.get());
-
- const FilePath kFilePath2 = FilePath::FromUTF8Unsafe(
- "drive/Slash \xE2\x88\x95 in file 1.txt");
- entry = GetEntryInfoByPathSync(kFilePath2);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:slash_file_resource_id", entry->resource_id());
-
- const FilePath kFilePath3 = FilePath::FromUTF8Unsafe(
- "drive/Slash \xE2\x88\x95 in directory/Slash SubDir File.txt");
- entry = GetEntryInfoByPathSync(kFilePath3);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:slash_subdir_file", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchDuplicateNames) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath1 = FilePath(
- FILE_PATH_LITERAL("drive/Duplicate Name.txt"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath1);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:3_file_resource_id", entry->resource_id());
-
- const FilePath kFilePath2 = FilePath(
- FILE_PATH_LITERAL("drive/Duplicate Name (2).txt"));
- entry = GetEntryInfoByPathSync(kFilePath2);
- ASSERT_TRUE(entry.get());
- EXPECT_EQ("file:4_file_resource_id", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchExistingDirectory) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/Directory 1"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_TRUE(entry.get());
- ASSERT_EQ("folder:1_folder_resource_id", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, SearchInSubdir) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_TRUE(entry.get());
- ASSERT_EQ("file:subdirectory_file_1_id", entry->resource_id());
-}
-
-// Check the reconstruction of the directory structure from only the root feed.
-TEST_F(GDataFileSystemTest, SearchInSubSubdir) {
- LoadRootFeedDocument("root_feed.json");
-
- const FilePath kFilePath = FilePath(
- FILE_PATH_LITERAL("drive/Directory 1/Sub Directory Folder/"
- "Sub Sub Directory Folder"));
- scoped_ptr<DriveEntryProto> entry = GetEntryInfoByPathSync(kFilePath);
- ASSERT_TRUE(entry.get());
- ASSERT_EQ("folder:sub_sub_directory_folder_id", entry->resource_id());
-}
-
-TEST_F(GDataFileSystemTest, FilePathTests) {
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/File 1.txt"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(
- FilePath(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"))));
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_AddAndDeleteFileInRoot) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(2);
-
- LoadChangeFeed("delta_file_added_in_root.json", ++latest_changelog);
- EXPECT_TRUE(
- EntryExists(FilePath(FILE_PATH_LITERAL("drive/Added file.gdoc"))));
-
- LoadChangeFeed("delta_file_deleted_in_root.json", ++latest_changelog);
- EXPECT_FALSE(
- EntryExists(FilePath(FILE_PATH_LITERAL("drive/Added file.gdoc"))));
-}
-
-
-TEST_F(GDataFileSystemTest, ChangeFeed_AddAndDeleteFileFromExistingDirectory) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_TRUE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/Directory 1"))));
-
- // Add file to an existing directory.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
- LoadChangeFeed("delta_file_added_in_directory.json", ++latest_changelog);
- EXPECT_TRUE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/Directory 1/Added file.gdoc"))));
-
- // Remove that file from the directory.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
- LoadChangeFeed("delta_file_deleted_in_directory.json", ++latest_changelog);
- EXPECT_TRUE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/Directory 1"))));
- EXPECT_FALSE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/Directory 1/Added file.gdoc"))));
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_AddFileToNewDirectory) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
- // Add file to a new directory.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/New Directory"))))).Times(1);
-
- LoadChangeFeed("delta_file_added_in_new_directory.json", ++latest_changelog);
-
- EXPECT_TRUE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/New Directory"))));
- EXPECT_TRUE(EntryExists(FilePath(
- FILE_PATH_LITERAL("drive/New Directory/File in new dir.gdoc"))));
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_AddFileToNewButDeletedDirectory) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- // This feed contains thw following updates:
- // 1) A new PDF file is added to a new directory
- // 2) but the new directory is marked "deleted" (i.e. moved to Trash)
- // Hence, the PDF file should be just ignored.
- LoadChangeFeed("delta_file_added_in_new_but_deleted_directory.json",
- ++latest_changelog);
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_DirectoryMovedFromRootToDirectory) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/SubDirectory File 1.txt"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder/Sub Sub Directory Folder"))));
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 2"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 2/Directory 1")))))
- .Times(1);
- LoadChangeFeed("delta_dir_moved_from_root_to_directory.json",
- ++latest_changelog);
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2"))));
- EXPECT_FALSE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2/Directory 1/SubDirectory File 1.txt"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2/Directory 1/Sub Directory Folder"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 2/Directory 1/Sub Directory Folder/"
- "Sub Sub Directory Folder"))));
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_FileMovedFromDirectoryToRoot) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder/Sub Sub Directory Folder"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/SubDirectory File 1.txt"))));
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
- LoadChangeFeed("delta_file_moved_from_directory_to_root.json",
- ++latest_changelog);
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/Sub Directory Folder/Sub Sub Directory Folder"))));
- EXPECT_FALSE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/SubDirectory File 1.txt"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/SubDirectory File 1.txt"))));
-}
-
-TEST_F(GDataFileSystemTest, ChangeFeed_FileRenamedInDirectory) {
- int latest_changelog = 0;
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/SubDirectory File 1.txt"))));
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
- LoadChangeFeed("delta_file_renamed_in_directory.json",
- ++latest_changelog);
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1"))));
- EXPECT_FALSE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/SubDirectory File 1.txt"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL(
- "drive/Directory 1/New SubDirectory File 1.txt"))));
-}
-
-TEST_F(GDataFileSystemTest, CachedFeedLoading) {
- SaveTestFileSystem();
- TestLoadMetadataFromCache();
-
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/File1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/Dir1"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/Dir1/File2"))));
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/Dir1/SubDir2"))));
- EXPECT_TRUE(EntryExists(
- FilePath(FILE_PATH_LITERAL("drive/Dir1/SubDir2/File3"))));
-}
-
-TEST_F(GDataFileSystemTest, CachedFeadLoadingThenServerFeedLoading) {
- SaveTestFileSystem();
-
- // SaveTestFileSystem and "account_metadata.json" have the same changestamp,
- // so no request for new feeds (i.e., call to GetDocuments) should happen.
- mock_drive_service_->set_account_metadata(
- LoadJSONFile("account_metadata.json"));
- EXPECT_CALL(*mock_drive_service_, GetAccountMetadata(_)).Times(1);
- EXPECT_CALL(*mock_webapps_registry_, UpdateFromFeed(_)).Times(1);
- EXPECT_CALL(*mock_drive_service_, GetDocuments(_, _, _, _, _)).Times(0);
-
- // Kicks loading of cached file system and query for server update.
- EXPECT_TRUE(EntryExists(FilePath(FILE_PATH_LITERAL("drive/File1"))));
-
- // Since the file system has verified that it holds the latest snapshot,
- // it should change its state to FROM_SERVER, which admits periodic refresh.
- // To test it, call CheckForUpdates and verify it does try to check updates.
- mock_drive_service_->set_account_metadata(
- LoadJSONFile("account_metadata.json"));
- EXPECT_CALL(*mock_drive_service_, GetAccountMetadata(_)).Times(1);
- EXPECT_CALL(*mock_webapps_registry_, UpdateFromFeed(_)).Times(1);
-
- file_system_->CheckForUpdates();
- test_util::RunBlockingPoolTask();
-}
-
-TEST_F(GDataFileSystemTest, TransferFileFromLocalToRemote_RegularFile) {
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(AtLeast(1)).WillRepeatedly(Return(kLotsOfSpace));
-
- LoadRootFeedDocument("root_feed.json");
-
- // We'll add a file to the Drive root directory.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Prepare a local file.
- ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- const FilePath local_src_file_path = temp_dir.path().Append("local.txt");
- const std::string kContent = "hello";
- file_util::WriteFile(local_src_file_path, kContent.data(), kContent.size());
-
- // Confirm that the remote file does not exist.
- const FilePath remote_dest_file_path(FILE_PATH_LITERAL("drive/remote.txt"));
- EXPECT_FALSE(EntryExists(remote_dest_file_path));
-
- // Transfer the local file to Drive.
- file_system_->TransferFileFromLocalToRemote(
- local_src_file_path, remote_dest_file_path, callback);
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- // Now the remote file should exist.
- EXPECT_TRUE(EntryExists(remote_dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, TransferFileFromLocalToRemote_HostedDocument) {
- LoadRootFeedDocument("root_feed.json");
-
- // Prepare a local file, which is a json file of a hosted document, which
- // matches "Document 1" in root_feed.json.
- ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- const FilePath local_src_file_path = temp_dir.path().Append("local.gdoc");
- const std::string kEditUrl =
- "https://3_document_self_link/document:5_document_resource_id";
- const std::string kResourceId = "document:5_document_resource_id";
- const std::string kContent =
- base::StringPrintf("{\"url\": \"%s\", \"resource_id\": \"%s\"}",
- kEditUrl.c_str(), kResourceId.c_str());
- file_util::WriteFile(local_src_file_path, kContent.data(), kContent.size());
-
- // Confirm that the remote file does not exist.
- const FilePath remote_dest_file_path(
- FILE_PATH_LITERAL("drive/Directory 1/Document 1.gdoc"));
- EXPECT_FALSE(EntryExists(remote_dest_file_path));
-
- // We'll add a file to "Directory 1" directory on Drive.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
-
- // We'll copy a hosted document using CopyDocument.
- // ".gdoc" suffix should be stripped when copying.
- scoped_ptr<base::Value> document(LoadJSONFile("uploaded_document.json"));
- EXPECT_CALL(*mock_drive_service_,
- CopyDocument(kResourceId,
- FILE_PATH_LITERAL("Document 1"),
- _))
- .WillOnce(MockCopyDocument(gdata::HTTP_SUCCESS, &document));
- // We'll then add the hosted document to the destination directory.
- EXPECT_CALL(*mock_drive_service_,
- AddResourceToDirectory(_, _, _)).Times(1);
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Transfer the local file to Drive.
- file_system_->TransferFileFromLocalToRemote(
- local_src_file_path, remote_dest_file_path, callback);
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- // Now the remote file should exist.
- EXPECT_TRUE(EntryExists(remote_dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, TransferFileFromRemoteToLocal_RegularFile) {
- LoadRootFeedDocument("root_feed.json");
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- FilePath local_dest_file_path = temp_dir.path().Append("local_copy.txt");
-
- FilePath remote_src_file_path(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> file = GetEntryInfoByPathSync(
- remote_src_file_path);
- FilePath cache_file = GetCachePathForFile(
- file->resource_id(),
- file->file_specific_info().file_md5());
- const int64 file_size = file->file_info().size();
-
- // Pretend we have enough space.
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(2).WillRepeatedly(Return(file_size + kMinFreeSpace));
-
- const std::string remote_src_file_data = "Test file data";
- mock_drive_service_->set_file_data(new std::string(remote_src_file_data));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(remote_src_file_path,
- cache_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- file_system_->TransferFileFromRemoteToLocal(
- remote_src_file_path, local_dest_file_path, callback);
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- std::string cache_file_data;
- EXPECT_TRUE(file_util::ReadFileToString(cache_file, &cache_file_data));
- EXPECT_EQ(remote_src_file_data, cache_file_data);
-
- std::string local_dest_file_data;
- EXPECT_TRUE(file_util::ReadFileToString(local_dest_file_path,
- &local_dest_file_data));
- EXPECT_EQ(remote_src_file_data, local_dest_file_data);
-}
-
-TEST_F(GDataFileSystemTest, TransferFileFromRemoteToLocal_HostedDocument) {
- LoadRootFeedDocument("root_feed.json");
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- ScopedTempDir temp_dir;
- ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
- FilePath local_dest_file_path = temp_dir.path().Append("local_copy.txt");
- FilePath remote_src_file_path(FILE_PATH_LITERAL("drive/Document 1.gdoc"));
- file_system_->TransferFileFromRemoteToLocal(
- remote_src_file_path, local_dest_file_path, callback);
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- scoped_ptr<DriveEntryProto> entry_proto = GetEntryInfoByPathSync(
- remote_src_file_path);
- ASSERT_TRUE(entry_proto.get());
- VerifyHostedDocumentJSONFile(*entry_proto, local_dest_file_path);
-}
-
-TEST_F(GDataFileSystemTest, CopyNotExistingFile) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/Dummy file.txt"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_FALSE(EntryExists(src_file_path));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Copy(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, CopyFileToNonExistingDirectory) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/File 1.txt"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/Dummy"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Dummy/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_path_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- EXPECT_FALSE(EntryExists(dest_parent_path));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-
- EXPECT_TRUE(EntryExists(src_file_path));
- EXPECT_FALSE(EntryExists(dest_parent_path));
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-// Test the case where the parent of |dest_file_path| is an existing file,
-// not a directory.
-TEST_F(GDataFileSystemTest, CopyFileToInvalidPath) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/Document 1.gdoc"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/Duplicate Name.txt"));
- FilePath dest_file_path(FILE_PATH_LITERAL(
- "drive/Duplicate Name.txt/Document 1.gdoc"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- ASSERT_TRUE(EntryExists(dest_parent_path));
- scoped_ptr<DriveEntryProto> dest_entry_proto = GetEntryInfoByPathSync(
- dest_parent_path);
- ASSERT_TRUE(dest_entry_proto.get());
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Copy(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_A_DIRECTORY,
- callback_helper_->last_error_);
-
- EXPECT_TRUE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(dest_parent_path));
-
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, RenameFile) {
- const FilePath src_file_path(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"));
- const FilePath src_parent_path(FILE_PATH_LITERAL("drive/Directory 1"));
- const FilePath dest_file_path(
- FILE_PATH_LITERAL("drive/Directory 1/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
-
- EXPECT_CALL(*mock_drive_service_,
- RenameResource(GURL(src_entry_proto->edit_url()),
- FILE_PATH_LITERAL("Test.log"), _));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(dest_file_path));
- EXPECT_EQ(src_file_resource_id, GetResourceIdByPath(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, MoveFileFromRootToSubDirectory) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/File 1.txt"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/Directory 1"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Directory 1/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- ASSERT_TRUE(EntryExists(dest_parent_path));
- scoped_ptr<DriveEntryProto> dest_parent_proto = GetEntryInfoByPathSync(
- dest_parent_path);
- ASSERT_TRUE(dest_parent_proto.get());
- ASSERT_TRUE(dest_parent_proto->file_info().is_directory());
- EXPECT_FALSE(dest_parent_proto->content_url().empty());
-
- EXPECT_CALL(*mock_drive_service_,
- RenameResource(GURL(src_entry_proto->edit_url()),
- FILE_PATH_LITERAL("Test.log"), _));
- EXPECT_CALL(*mock_drive_service_,
- AddResourceToDirectory(
- GURL(dest_parent_proto->content_url()),
- GURL(src_entry_proto->edit_url()), _));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Expect notification for both source and destination directories.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(dest_file_path));
- EXPECT_EQ(src_file_resource_id, GetResourceIdByPath(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, MoveFileFromSubDirectoryToRoot) {
- FilePath src_parent_path(FILE_PATH_LITERAL("drive/Directory 1"));
- FilePath src_file_path(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- ASSERT_TRUE(EntryExists(src_parent_path));
- scoped_ptr<DriveEntryProto> src_parent_proto = GetEntryInfoByPathSync(
- src_parent_path);
- ASSERT_TRUE(src_parent_proto.get());
- ASSERT_TRUE(src_parent_proto->file_info().is_directory());
- EXPECT_FALSE(src_parent_proto->content_url().empty());
-
- EXPECT_CALL(*mock_drive_service_,
- RenameResource(GURL(src_entry_proto->edit_url()),
- FILE_PATH_LITERAL("Test.log"), _));
- EXPECT_CALL(*mock_drive_service_,
- RemoveResourceFromDirectory(
- GURL(src_parent_proto->content_url()),
- GURL(src_entry_proto->edit_url()),
- src_file_resource_id, _));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Expect notification for both source and destination directories.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- ASSERT_TRUE(EntryExists(dest_file_path));
- EXPECT_EQ(src_file_resource_id, GetResourceIdByPath(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, MoveFileBetweenSubDirectories) {
- FilePath src_parent_path(FILE_PATH_LITERAL("drive/Directory 1"));
- FilePath src_file_path(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/New Folder 1"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/New Folder 1/Test.log"));
- FilePath interim_file_path(FILE_PATH_LITERAL("drive/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
-
- AddDirectoryFromFile(dest_parent_path, "directory_entry_atom.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- ASSERT_TRUE(EntryExists(src_parent_path));
- scoped_ptr<DriveEntryProto> src_parent_proto = GetEntryInfoByPathSync(
- src_parent_path);
- ASSERT_TRUE(src_parent_proto.get());
- ASSERT_TRUE(src_parent_proto->file_info().is_directory());
- EXPECT_FALSE(src_parent_proto->content_url().empty());
-
- ASSERT_TRUE(EntryExists(dest_parent_path));
- scoped_ptr<DriveEntryProto> dest_parent_proto = GetEntryInfoByPathSync(
- dest_parent_path);
- ASSERT_TRUE(dest_parent_proto.get());
- ASSERT_TRUE(dest_parent_proto->file_info().is_directory());
- EXPECT_FALSE(dest_parent_proto->content_url().empty());
-
- EXPECT_FALSE(EntryExists(interim_file_path));
-
- EXPECT_CALL(*mock_drive_service_,
- RenameResource(GURL(src_entry_proto->edit_url()),
- FILE_PATH_LITERAL("Test.log"), _));
- EXPECT_CALL(*mock_drive_service_,
- RemoveResourceFromDirectory(
- GURL(src_parent_proto->content_url()),
- GURL(src_entry_proto->edit_url()),
- src_file_resource_id, _));
- EXPECT_CALL(*mock_drive_service_,
- AddResourceToDirectory(
- GURL(dest_parent_proto->content_url()),
- GURL(src_entry_proto->edit_url()),
- _));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Expect notification for both source and destination directories plus
- // interim file path.
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/Directory 1"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/New Folder 1"))))).Times(1);
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_FALSE(EntryExists(interim_file_path));
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(dest_file_path));
- EXPECT_EQ(src_file_resource_id, GetResourceIdByPath(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, MoveNotExistingFile) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/Dummy file.txt"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_FALSE(EntryExists(src_file_path));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-
- EXPECT_FALSE(EntryExists(src_file_path));
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, MoveFileToNonExistingDirectory) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/File 1.txt"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/Dummy"));
- FilePath dest_file_path(FILE_PATH_LITERAL("drive/Dummy/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- EXPECT_FALSE(EntryExists(dest_parent_path));
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-
-
- EXPECT_FALSE(EntryExists(dest_parent_path));
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-// Test the case where the parent of |dest_file_path| is a existing file,
-// not a directory.
-TEST_F(GDataFileSystemTest, MoveFileToInvalidPath) {
- FilePath src_file_path(FILE_PATH_LITERAL("drive/File 1.txt"));
- FilePath dest_parent_path(FILE_PATH_LITERAL("drive/Duplicate Name.txt"));
- FilePath dest_file_path(FILE_PATH_LITERAL(
- "drive/Duplicate Name.txt/Test.log"));
-
- LoadRootFeedDocument("root_feed.json");
-
- ASSERT_TRUE(EntryExists(src_file_path));
- scoped_ptr<DriveEntryProto> src_entry_proto = GetEntryInfoByPathSync(
- src_file_path);
- ASSERT_TRUE(src_entry_proto.get());
- std::string src_file_resource_id =
- src_entry_proto->resource_id();
- EXPECT_FALSE(src_entry_proto->edit_url().empty());
-
- ASSERT_TRUE(EntryExists(dest_parent_path));
- scoped_ptr<DriveEntryProto> dest_parent_proto = GetEntryInfoByPathSync(
- dest_parent_path);
- ASSERT_TRUE(dest_parent_proto.get());
-
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->Move(src_file_path, dest_file_path, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_A_DIRECTORY,
- callback_helper_->last_error_);
-
- EXPECT_TRUE(EntryExists(src_file_path));
- EXPECT_TRUE(EntryExists(dest_parent_path));
- EXPECT_FALSE(EntryExists(dest_file_path));
-}
-
-TEST_F(GDataFileSystemTest, RemoveEntries) {
- LoadRootFeedDocument("root_feed.json");
-
- FilePath nonexisting_file(FILE_PATH_LITERAL("drive/Dummy file.txt"));
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- FilePath dir_in_root(FILE_PATH_LITERAL("drive/Directory 1"));
- FilePath file_in_subdir(
- FILE_PATH_LITERAL("drive/Directory 1/SubDirectory File 1.txt"));
-
- ASSERT_TRUE(EntryExists(file_in_root));
- scoped_ptr<DriveEntryProto> file_in_root_proto = GetEntryInfoByPathSync(
- file_in_root);
- ASSERT_TRUE(file_in_root_proto.get());
-
- ASSERT_TRUE(EntryExists(dir_in_root));
- scoped_ptr<DriveEntryProto> dir_in_root_proto = GetEntryInfoByPathSync(
- dir_in_root);
- ASSERT_TRUE(dir_in_root_proto.get());
- ASSERT_TRUE(dir_in_root_proto->file_info().is_directory());
-
- ASSERT_TRUE(EntryExists(file_in_subdir));
- scoped_ptr<DriveEntryProto> file_in_subdir_proto = GetEntryInfoByPathSync(
- file_in_subdir);
- ASSERT_TRUE(file_in_subdir_proto.get());
-
- // Once for file in root and once for file...
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(2);
-
- // Remove first file in root.
- EXPECT_TRUE(RemoveEntry(file_in_root));
- EXPECT_FALSE(EntryExists(file_in_root));
- EXPECT_TRUE(EntryExists(dir_in_root));
- EXPECT_TRUE(EntryExists(file_in_subdir));
-
- // Remove directory.
- EXPECT_TRUE(RemoveEntry(dir_in_root));
- EXPECT_FALSE(EntryExists(file_in_root));
- EXPECT_FALSE(EntryExists(dir_in_root));
- EXPECT_FALSE(EntryExists(file_in_subdir));
-
- // Try removing file in already removed subdirectory.
- EXPECT_FALSE(RemoveEntry(file_in_subdir));
-
- // Try removing non-existing file.
- EXPECT_FALSE(RemoveEntry(nonexisting_file));
-
- // Try removing root file element.
- EXPECT_FALSE(RemoveEntry(FilePath(FILE_PATH_LITERAL("drive"))));
-
- // Need this to ensure OnDirectoryChanged() is run.
- test_util::RunBlockingPoolTask();
-}
-
-TEST_F(GDataFileSystemTest, CreateDirectory) {
- LoadRootFeedDocument("root_feed.json");
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
-
- // Create directory in root.
- FilePath dir_path(FILE_PATH_LITERAL("drive/New Folder 1"));
- EXPECT_FALSE(EntryExists(dir_path));
- AddDirectoryFromFile(dir_path, "directory_entry_atom.json");
- EXPECT_TRUE(EntryExists(dir_path));
-
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive/New Folder 1"))))).Times(1);
-
- // Create directory in a sub directory.
- FilePath subdir_path(FILE_PATH_LITERAL("drive/New Folder 1/New Folder 2"));
- EXPECT_FALSE(EntryExists(subdir_path));
- AddDirectoryFromFile(subdir_path, "directory_entry_atom2.json");
- EXPECT_TRUE(EntryExists(subdir_path));
-}
-
-TEST_F(GDataFileSystemTest, FindFirstMissingParentDirectory) {
- LoadRootFeedDocument("root_feed.json");
-
- GURL last_dir_content_url;
- FilePath first_missing_parent_path;
-
- // Create directory in root.
- FilePath dir_path(FILE_PATH_LITERAL("drive/New Folder 1"));
- EXPECT_EQ(
- GDataFileSystem::FOUND_MISSING,
- file_system_->FindFirstMissingParentDirectory(dir_path,
- &last_dir_content_url,
- &first_missing_parent_path));
- EXPECT_EQ(FilePath(FILE_PATH_LITERAL("drive/New Folder 1")),
- first_missing_parent_path);
- EXPECT_TRUE(last_dir_content_url.is_empty()); // root directory.
-
- // Missing folders in subdir of an existing folder.
- FilePath dir_path2(FILE_PATH_LITERAL("drive/Directory 1/New Folder 2"));
- EXPECT_EQ(
- GDataFileSystem::FOUND_MISSING,
- file_system_->FindFirstMissingParentDirectory(dir_path2,
- &last_dir_content_url,
- &first_missing_parent_path));
- EXPECT_EQ(FilePath(FILE_PATH_LITERAL("drive/Directory 1/New Folder 2")),
- first_missing_parent_path);
- EXPECT_FALSE(last_dir_content_url.is_empty()); // non-root directory.
-
- // Missing two folders on the path.
- FilePath dir_path3 = dir_path2.Append(FILE_PATH_LITERAL("Another Folder"));
- EXPECT_EQ(
- GDataFileSystem::FOUND_MISSING,
- file_system_->FindFirstMissingParentDirectory(dir_path3,
- &last_dir_content_url,
- &first_missing_parent_path));
- EXPECT_EQ(FilePath(FILE_PATH_LITERAL("drive/Directory 1/New Folder 2")),
- first_missing_parent_path);
- EXPECT_FALSE(last_dir_content_url.is_empty()); // non-root directory.
-
- // Folders on top of an existing file.
- EXPECT_EQ(
- GDataFileSystem::FOUND_INVALID,
- file_system_->FindFirstMissingParentDirectory(
- FilePath(FILE_PATH_LITERAL("drive/File 1.txt/BadDir")),
- &last_dir_content_url,
- &first_missing_parent_path));
-
- // Existing folder.
- EXPECT_EQ(
- GDataFileSystem::DIRECTORY_ALREADY_PRESENT,
- file_system_->FindFirstMissingParentDirectory(
- FilePath(FILE_PATH_LITERAL("drive/Directory 1")),
- &last_dir_content_url,
- &first_missing_parent_path));
-}
-
-// Create a directory through the document service
-TEST_F(GDataFileSystemTest, CreateDirectoryWithService) {
- LoadRootFeedDocument("root_feed.json");
- EXPECT_CALL(*mock_drive_service_,
- CreateDirectory(_, "Sample Directory Title", _)).Times(1);
- EXPECT_CALL(*mock_directory_observer_, OnDirectoryChanged(
- Eq(FilePath(FILE_PATH_LITERAL("drive"))))).Times(1);
-
- // Set last error so it's not a valid error code.
- callback_helper_->last_error_ = static_cast<DriveFileError>(1);
- file_system_->CreateDirectory(
- FilePath(FILE_PATH_LITERAL("drive/Sample Directory Title")),
- false, // is_exclusive
- true, // is_recursive
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get()));
- test_util::RunBlockingPoolTask();
- // TODO(gspencer): Uncomment this when we get a blob that
- // works that can be returned from the mock.
- // EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_FromGData_EnoughSpace) {
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
- const int64 file_size = entry_proto->file_info().size();
-
- // Pretend we have enough space.
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(2).WillRepeatedly(Return(file_size + kMinFreeSpace));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
- EXPECT_EQ(REGULAR_FILE, callback_helper_->file_type_);
- EXPECT_EQ(downloaded_file.value(),
- callback_helper_->download_path_.value());
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_FromGData_NoSpaceAtAll) {
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
-
- // Pretend we have no space at all.
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(2).WillRepeatedly(Return(0));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is not obtained with the mock DriveService, because of no space.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(0);
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_ERROR_NO_SPACE,
- callback_helper_->last_error_);
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_FromGData_NoEnoughSpaceButCanFreeUp) {
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
- const int64 file_size = entry_proto->file_info().size();
-
- // Pretend we have no space first (checked before downloading a file),
- // but then start reporting we have space. This is to emulate that
- // the disk space was freed up by removing temporary files.
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .WillOnce(Return(file_size + kMinFreeSpace))
- .WillOnce(Return(0))
- .WillOnce(Return(file_size + kMinFreeSpace))
- .WillOnce(Return(file_size + kMinFreeSpace));
-
- // Store something in the temporary cache directory.
- TestStoreToCache("<resource_id>",
- "<md5>",
- GetTestFilePath("root_feed.json"),
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT,
- DriveCache::CACHE_TYPE_TMP);
- ASSERT_TRUE(CacheEntryExists("<resource_id>", "<md5>"));
- ASSERT_TRUE(CacheFileExists("<resource_id>", "<md5>"));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService, because of we freed up the
- // space.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
- EXPECT_EQ(REGULAR_FILE, callback_helper_->file_type_);
- EXPECT_EQ(downloaded_file.value(),
- callback_helper_->download_path_.value());
-
- // The file should be removed in order to free up space, and the cache
- // entry should also be removed.
- ASSERT_FALSE(CacheEntryExists("<resource_id>", "<md5>"));
- ASSERT_FALSE(CacheFileExists("<resource_id>", "<md5>"));
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_FromGData_EnoughSpaceButBecomeFull) {
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
- const int64 file_size = entry_proto->file_info().size();
-
- // Pretend we have enough space first (checked before downloading a file),
- // but then start reporting we have not enough space. This is to emulate that
- // the disk space becomes full after the file is downloaded for some reason
- // (ex. the actual file was larger than the expected size).
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .WillOnce(Return(file_size + kMinFreeSpace))
- .WillOnce(Return(kMinFreeSpace - 1))
- .WillOnce(Return(kMinFreeSpace - 1));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_ERROR_NO_SPACE,
- callback_helper_->last_error_);
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_FromCache) {
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(AtLeast(1)).WillRepeatedly(Return(kLotsOfSpace));
-
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
-
- // Store something as cached version of this file.
- TestStoreToCache(entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5(),
- GetTestFilePath("root_feed.json"),
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT,
- DriveCache::CACHE_TYPE_TMP);
-
- // Make sure we don't fetch metadata for downloading file.
- EXPECT_CALL(*mock_drive_service_, GetDocumentEntry(_, _)).Times(0);
-
- // Make sure we don't call downloads at all.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(0);
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(REGULAR_FILE, callback_helper_->file_type_);
- EXPECT_EQ(downloaded_file.value(),
- callback_helper_->download_path_.value());
-}
-
-TEST_F(GDataFileSystemTest, GetFileByPath_HostedDocument) {
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/Document 1.gdoc"));
- scoped_ptr<DriveEntryProto> src_entry_proto =
- GetEntryInfoByPathSync(file_in_root);
- ASSERT_TRUE(src_entry_proto.get());
-
- file_system_->GetFileByPath(file_in_root, callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(HOSTED_DOCUMENT, callback_helper_->file_type_);
- EXPECT_FALSE(callback_helper_->download_path_.empty());
-
- ASSERT_TRUE(src_entry_proto.get());
- VerifyHostedDocumentJSONFile(*src_entry_proto,
- callback_helper_->download_path_);
-}
-
-TEST_F(GDataFileSystemTest, GetFileByResourceId) {
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(AtLeast(1)).WillRepeatedly(Return(kLotsOfSpace));
-
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService, because it's not stored in
- // the cache.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(file_in_root,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- file_system_->GetFileByResourceId(entry_proto->resource_id(),
- callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(REGULAR_FILE, callback_helper_->file_type_);
- EXPECT_EQ(downloaded_file.value(),
- callback_helper_->download_path_.value());
-}
-
-TEST_F(GDataFileSystemTest, GetFileByResourceId_FromCache) {
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(AtLeast(1)).WillRepeatedly(Return(kLotsOfSpace));
-
- LoadRootFeedDocument("root_feed.json");
-
- GetFileCallback callback =
- base::Bind(&CallbackHelper::GetFileCallback,
- callback_helper_.get());
-
- FilePath file_in_root(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(file_in_root));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
-
- // Store something as cached version of this file.
- TestStoreToCache(entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5(),
- GetTestFilePath("root_feed.json"),
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT,
- DriveCache::CACHE_TYPE_TMP);
-
- // The file is obtained from the cache.
- // Make sure we don't call downloads at all.
- EXPECT_CALL(*mock_drive_service_, DownloadFile(_, _, _, _, _))
- .Times(0);
-
- file_system_->GetFileByResourceId(entry_proto->resource_id(),
- callback,
- GetContentCallback());
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(REGULAR_FILE, callback_helper_->file_type_);
- EXPECT_EQ(downloaded_file.value(),
- callback_helper_->download_path_.value());
-}
-
-TEST_F(GDataFileSystemTest, UpdateFileByResourceId_PersistentFile) {
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(AtLeast(1)).WillRepeatedly(Return(kLotsOfSpace));
-
- LoadRootFeedDocument("root_feed.json");
-
- // This is a file defined in root_feed.json.
- const FilePath kFilePath(FILE_PATH_LITERAL("drive/File 1.txt"));
- const std::string kResourceId("file:2_file_resource_id");
- const std::string kMd5("3b4382ebefec6e743578c76bbd0575ce");
-
- // Pin the file so it'll be store in "persistent" directory.
- EXPECT_CALL(*mock_cache_observer_, OnCachePinned(kResourceId, kMd5)).Times(1);
- TestPin(kResourceId,
- kMd5,
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PINNED,
- DriveCache::CACHE_TYPE_TMP);
-
- // First store a file to cache. A cache file will be created at:
- // GCache/v1/persistent/<kResourceId>.<kMd5>
- const FilePath original_cache_file_path =
- DriveCache::GetCacheRootPath(profile_.get())
- .AppendASCII("persistent")
- .AppendASCII(kResourceId + "." + kMd5);
- TestStoreToCache(kResourceId,
- kMd5,
- GetTestFilePath("root_feed.json"), // Anything works.
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT |
- test_util::TEST_CACHE_STATE_PINNED |
- test_util::TEST_CACHE_STATE_PERSISTENT,
- DriveCache::CACHE_TYPE_PERSISTENT);
- ASSERT_TRUE(file_util::PathExists(original_cache_file_path));
-
- // Add the dirty bit. The cache file will be renamed to
- // GCache/v1/persistent/<kResourceId>.local
- TestMarkDirty(kResourceId,
- kMd5,
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT |
- test_util::TEST_CACHE_STATE_PINNED |
- test_util::TEST_CACHE_STATE_DIRTY |
- test_util::TEST_CACHE_STATE_PERSISTENT,
- DriveCache::CACHE_TYPE_PERSISTENT);
- const FilePath dirty_cache_file_path =
- DriveCache::GetCacheRootPath(profile_.get())
- .AppendASCII("persistent")
- .AppendASCII(kResourceId + ".local");
- ASSERT_FALSE(file_util::PathExists(original_cache_file_path));
- ASSERT_TRUE(file_util::PathExists(dirty_cache_file_path));
-
- // Modify the cached file.
- const std::string kDummyCacheContent("modification to the cache");
- ASSERT_TRUE(file_util::WriteFile(dirty_cache_file_path,
- kDummyCacheContent.c_str(),
- kDummyCacheContent.size()));
-
- // Commit the dirty bit. The cache file name remains the same
- // but a symlink will be created at:
- // GCache/v1/outgoing/<kResourceId>
- EXPECT_CALL(*mock_cache_observer_, OnCacheCommitted(kResourceId)).Times(1);
- TestCommitDirty(kResourceId,
- kMd5,
- DRIVE_FILE_OK,
- test_util::TEST_CACHE_STATE_PRESENT |
- test_util::TEST_CACHE_STATE_PINNED |
- test_util::TEST_CACHE_STATE_DIRTY |
- test_util::TEST_CACHE_STATE_PERSISTENT,
- DriveCache::CACHE_TYPE_PERSISTENT);
- const FilePath outgoing_symlink_path =
- DriveCache::GetCacheRootPath(profile_.get())
- .AppendASCII("outgoing")
- .AppendASCII(kResourceId);
- ASSERT_TRUE(file_util::PathExists(dirty_cache_file_path));
- ASSERT_TRUE(file_util::PathExists(outgoing_symlink_path));
-
- // Create a DocumentEntry, which is needed to mock
- // GDataUploaderInterface::UploadExistingFile().
- // TODO(satorux): This should be cleaned up. crbug.com/134240.
- DocumentEntry* document_entry = NULL;
- scoped_ptr<base::Value> value(LoadJSONFile("root_feed.json"));
- ASSERT_TRUE(value.get());
- base::DictionaryValue* as_dict = NULL;
- base::ListValue* entry_list = NULL;
- if (value->GetAsDictionary(&as_dict) &&
- as_dict->GetList("feed.entry", &entry_list)) {
- for (size_t i = 0; i < entry_list->GetSize(); ++i) {
- base::DictionaryValue* entry = NULL;
- std::string resource_id;
- if (entry_list->GetDictionary(i, &entry) &&
- entry->GetString("gd$resourceId.$t", &resource_id) &&
- resource_id == kResourceId) {
- // This will be deleted by UploadExistingFile().
- document_entry = DocumentEntry::CreateFrom(*entry);
- }
- }
- }
- ASSERT_TRUE(document_entry);
-
- // The mock uploader will be used to simulate a file upload.
- EXPECT_CALL(*mock_uploader_, UploadExistingFile(
- GURL("https://file_link_resumable_edit_media/"),
- kFilePath,
- dirty_cache_file_path,
- kDummyCacheContent.size(), // The size after modification must be used.
- "audio/mpeg",
- _)) // callback
- .WillOnce(MockUploadExistingFile(
- DRIVE_FILE_OK,
- FilePath::FromUTF8Unsafe("drive/File1"),
- dirty_cache_file_path,
- document_entry));
-
- // We'll notify the directory change to the observer upon completion.
- EXPECT_CALL(*mock_directory_observer_,
- OnDirectoryChanged(Eq(FilePath(kDriveRootDirectory)))).Times(1);
-
- // The callback will be called upon completion of
- // UpdateFileByResourceId().
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- // Check the number of files in the root directory. We'll compare the
- // number after updating a file.
- scoped_ptr<DriveEntryProtoVector> root_directory_entries(
- ReadDirectoryByPathSync(FilePath::FromUTF8Unsafe("drive")));
- ASSERT_TRUE(root_directory_entries.get());
- const int num_files_in_root = CountFiles(*root_directory_entries);
-
- file_system_->UpdateFileByResourceId(kResourceId, callback);
- test_util::RunBlockingPoolTask();
-
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
- // Make sure that the number of files did not change (i.e. we updated an
- // existing file, rather than adding a new file. The number of files
- // increases if we don't handle the file update right).
- EXPECT_EQ(num_files_in_root, CountFiles(*root_directory_entries));
- // After the file is updated, the dirty bit is cleared, hence the symlink
- // should be gone.
- ASSERT_FALSE(file_util::PathExists(outgoing_symlink_path));
-}
-
-TEST_F(GDataFileSystemTest, UpdateFileByResourceId_NonexistentFile) {
- LoadRootFeedDocument("root_feed.json");
-
- // This is nonexistent in root_feed.json.
- const FilePath kFilePath(FILE_PATH_LITERAL("drive/Nonexistent.txt"));
- const std::string kResourceId("file:nonexistent_resource_id");
- const std::string kMd5("nonexistent_md5");
-
- // The callback will be called upon completion of
- // UpdateFileByResourceId().
- FileOperationCallback callback =
- base::Bind(&CallbackHelper::FileOperationCallback,
- callback_helper_.get());
-
- file_system_->UpdateFileByResourceId(kResourceId, callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-}
-
-TEST_F(GDataFileSystemTest, ContentSearch) {
- LoadRootFeedDocument("root_feed.json");
-
- mock_drive_service_->set_search_result("search_result_feed.json");
-
- EXPECT_CALL(*mock_drive_service_, GetDocuments(Eq(GURL()), _, "foo", _, _))
- .Times(1);
-
- const SearchResultPair kExpectedResults[] = {
- { "drive/Directory 1/SubDirectory File 1.txt", false },
- { "drive/Directory 1", true }
- };
-
- SearchCallback callback = base::Bind(&DriveSearchCallback,
- &message_loop_, kExpectedResults, ARRAYSIZE_UNSAFE(kExpectedResults));
-
- file_system_->Search("foo", GURL(), callback);
- message_loop_.Run(); // Wait to get our result.
-}
-
-TEST_F(GDataFileSystemTest, ContentSearchWithNewEntry) {
- LoadRootFeedDocument("root_feed.json");
-
- // Search result returning two entries "Directory 1/" and
- // "Directory 1/SubDirectory Newly Added File.txt". The latter is not
- // contained in the root feed.
- mock_drive_service_->set_search_result(
- "search_result_with_new_entry_feed.json");
-
- EXPECT_CALL(*mock_drive_service_, GetDocuments(Eq(GURL()), _, "foo", _, _))
- .Times(1);
-
- // As the result of the first Search(), only entries in the current file
- // system snapshot are expected to be returned.
- const SearchResultPair kExpectedResults[] = {
- { "drive/Directory 1", true }
- };
-
- // At the same time, unknown entry should trigger delta feed request.
- // This will cause notification to observers (e.g., File Browser) so that
- // they can request search again.
- EXPECT_CALL(*mock_drive_service_, GetAccountMetadata(_)).Times(1);
- EXPECT_CALL(*mock_drive_service_, GetDocuments(Eq(GURL()), _, "", _, _))
- .Times(1);
- EXPECT_CALL(*mock_webapps_registry_, UpdateFromFeed(_)).Times(1);
-
- SearchCallback callback = base::Bind(&DriveSearchCallback,
- &message_loop_, kExpectedResults, ARRAYSIZE_UNSAFE(kExpectedResults));
-
- file_system_->Search("foo", GURL(), callback);
- message_loop_.Run(); // Wait to get our result.
-}
-
-TEST_F(GDataFileSystemTest, ContentSearchEmptyResult) {
- LoadRootFeedDocument("root_feed.json");
-
- mock_drive_service_->set_search_result("empty_feed.json");
-
- EXPECT_CALL(*mock_drive_service_, GetDocuments(Eq(GURL()), _, "foo", _, _))
- .Times(1);
-
- const SearchResultPair* expected_results = NULL;
-
- SearchCallback callback = base::Bind(&DriveSearchCallback,
- &message_loop_, expected_results, 0u);
-
- file_system_->Search("foo", GURL(), callback);
- message_loop_.Run(); // Wait to get our result.
-}
-
-TEST_F(GDataFileSystemTest, GetAvailableSpace) {
- GetAvailableSpaceCallback callback =
- base::Bind(&CallbackHelper::GetAvailableSpaceCallback,
- callback_helper_.get());
-
- EXPECT_CALL(*mock_drive_service_, GetAccountMetadata(_));
-
- file_system_->GetAvailableSpace(callback);
- test_util::RunBlockingPoolTask();
- EXPECT_EQ(GG_LONGLONG(6789012345), callback_helper_->quota_bytes_used_);
- EXPECT_EQ(GG_LONGLONG(9876543210), callback_helper_->quota_bytes_total_);
-}
-
-TEST_F(GDataFileSystemTest, RequestDirectoryRefresh) {
- LoadRootFeedDocument("root_feed.json");
-
- // We'll fetch documents in the root directory with its resource ID.
- EXPECT_CALL(*mock_drive_service_,
- GetDocuments(Eq(GURL()), _, _, kDriveRootDirectoryResourceId, _))
- .Times(1);
- // We'll notify the directory change to the observer.
- EXPECT_CALL(*mock_directory_observer_,
- OnDirectoryChanged(Eq(FilePath(kDriveRootDirectory)))).Times(1);
-
- file_system_->RequestDirectoryRefresh(FilePath(kDriveRootDirectory));
- test_util::RunBlockingPoolTask();
-}
-
-TEST_F(GDataFileSystemTest, OpenAndCloseFile) {
- LoadRootFeedDocument("root_feed.json");
-
- OpenFileCallback callback =
- base::Bind(&CallbackHelper::OpenFileCallback,
- callback_helper_.get());
- FileOperationCallback close_file_callback =
- base::Bind(&CallbackHelper::CloseFileCallback,
- callback_helper_.get());
-
- const FilePath kFileInRoot(FILE_PATH_LITERAL("drive/File 1.txt"));
- scoped_ptr<DriveEntryProto> entry_proto(GetEntryInfoByPathSync(kFileInRoot));
- FilePath downloaded_file = GetCachePathForFile(
- entry_proto->resource_id(),
- entry_proto->file_specific_info().file_md5());
- const int64 file_size = entry_proto->file_info().size();
- const std::string& file_resource_id =
- entry_proto->resource_id();
- const std::string& file_md5 = entry_proto->file_specific_info().file_md5();
-
- // A dirty file is created on close.
- EXPECT_CALL(*mock_cache_observer_, OnCacheCommitted(file_resource_id))
- .Times(1);
-
- // Pretend we have enough space.
- EXPECT_CALL(*mock_free_disk_space_checker_, AmountOfFreeDiskSpace())
- .Times(2).WillRepeatedly(Return(file_size + kMinFreeSpace));
-
- const std::string kExpectedFileData = "test file data";
- mock_drive_service_->set_file_data(new std::string(kExpectedFileData));
-
- // Before Download starts metadata from server will be fetched.
- // We will read content url from the result.
- scoped_ptr<base::Value> document(LoadJSONFile("document_to_download.json"));
- SetExpectationsForGetDocumentEntry(&document, "file:2_file_resource_id");
-
- // The file is obtained with the mock DriveService.
- EXPECT_CALL(*mock_drive_service_,
- DownloadFile(kFileInRoot,
- downloaded_file,
- GURL("https://file_content_url_changed/"),
- _, _))
- .Times(1);
-
- // Open kFileInRoot ("drive/File 1.txt").
- file_system_->OpenFile(kFileInRoot, callback);
- message_loop_.Run();
- const FilePath opened_file_path = callback_helper_->opened_file_path_;
-
- // Verify that the file was properly opened.
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- // Try to open the already opened file.
- file_system_->OpenFile(kFileInRoot, callback);
- message_loop_.Run();
-
- // It must fail.
- EXPECT_EQ(DRIVE_FILE_ERROR_IN_USE, callback_helper_->last_error_);
-
- // Verify that the file contents match the expected contents.
- std::string cache_file_data;
- EXPECT_TRUE(file_util::ReadFileToString(opened_file_path, &cache_file_data));
- EXPECT_EQ(kExpectedFileData, cache_file_data);
-
- // Verify that the cache state was changed as expected.
- VerifyCacheStateAfterOpenFile(DRIVE_FILE_OK,
- file_resource_id,
- file_md5,
- opened_file_path);
-
- // Close kFileInRoot ("drive/File 1.txt").
- file_system_->CloseFile(kFileInRoot, close_file_callback);
- message_loop_.Run();
-
- // Verify that the file was properly closed.
- EXPECT_EQ(DRIVE_FILE_OK, callback_helper_->last_error_);
-
- // Verify that the cache state was changed as expected.
- VerifyCacheStateAfterCloseFile(DRIVE_FILE_OK,
- file_resource_id,
- file_md5);
-
- // Try to close the same file twice.
- file_system_->CloseFile(kFileInRoot, close_file_callback);
- message_loop_.Run();
-
- // It must fail.
- EXPECT_EQ(DRIVE_FILE_ERROR_NOT_FOUND, callback_helper_->last_error_);
-}
-
-} // namespace gdata

Powered by Google App Engine
This is Rietveld 408576698