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 |