Index: chrome/browser/chromeos/drive/sync/entry_update_performer_unittest.cc |
diff --git a/chrome/browser/chromeos/drive/sync/entry_update_performer_unittest.cc b/chrome/browser/chromeos/drive/sync/entry_update_performer_unittest.cc |
deleted file mode 100644 |
index c3494045bee11168d25b7af5b06ea25c623f2978..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/drive/sync/entry_update_performer_unittest.cc |
+++ /dev/null |
@@ -1,658 +0,0 @@ |
-// Copyright 2013 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 "chrome/browser/chromeos/drive/sync/entry_update_performer.h" |
- |
-#include "base/callback_helpers.h" |
-#include "base/files/file_util.h" |
-#include "base/md5.h" |
-#include "base/task_runner_util.h" |
-#include "components/drive/drive_api_util.h" |
-#include "components/drive/file_cache.h" |
-#include "components/drive/file_system/download_operation.h" |
-#include "components/drive/file_system/operation_test_base.h" |
-#include "components/drive/job_scheduler.h" |
-#include "components/drive/resource_metadata.h" |
-#include "components/drive/service/fake_drive_service.h" |
-#include "content/public/test/test_utils.h" |
-#include "google_apis/drive/drive_api_parser.h" |
-#include "google_apis/drive/test_util.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace drive { |
-namespace internal { |
- |
-class EntryUpdatePerformerTest : public file_system::OperationTestBase { |
- protected: |
- void SetUp() override { |
- OperationTestBase::SetUp(); |
- performer_.reset(new EntryUpdatePerformer(blocking_task_runner(), |
- delegate(), |
- scheduler(), |
- metadata(), |
- cache(), |
- loader_controller())); |
- } |
- |
- // Stores |content| to the cache and mark it as dirty. |
- FileError StoreAndMarkDirty(const std::string& local_id, |
- const std::string& content) { |
- base::FilePath path; |
- if (!base::CreateTemporaryFileInDir(temp_dir(), &path) || |
- !google_apis::test_util::WriteStringToFile(path, content)) |
- return FILE_ERROR_FAILED; |
- |
- // Store the file to cache. |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&FileCache::Store, |
- base::Unretained(cache()), |
- local_id, std::string(), path, |
- FileCache::FILE_OPERATION_COPY), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- return error; |
- } |
- |
- scoped_ptr<EntryUpdatePerformer> performer_; |
-}; |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry) { |
- base::FilePath src_path( |
- FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); |
- base::FilePath dest_path( |
- FILE_PATH_LITERAL("drive/root/Directory 1/Sub Directory Folder")); |
- |
- ResourceEntry src_entry, dest_entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &src_entry)); |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &dest_entry)); |
- |
- // Update local entry. |
- base::Time new_last_modified = base::Time::FromInternalValue( |
- src_entry.file_info().last_modified()) + base::TimeDelta::FromSeconds(1); |
- base::Time new_last_accessed = base::Time::FromInternalValue( |
- src_entry.file_info().last_accessed()) + base::TimeDelta::FromSeconds(2); |
- |
- src_entry.set_parent_local_id(dest_entry.local_id()); |
- src_entry.set_title("Moved" + src_entry.title()); |
- src_entry.mutable_file_info()->set_last_modified( |
- new_last_modified.ToInternalValue()); |
- src_entry.mutable_file_info()->set_last_accessed( |
- new_last_accessed.ToInternalValue()); |
- src_entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&ResourceMetadata::RefreshEntry, |
- base::Unretained(metadata()), |
- src_entry), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Perform server side update. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- src_entry.local_id(), |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Verify the file is updated on the server. |
- google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> gdata_entry; |
- fake_service()->GetFileResource( |
- src_entry.resource_id(), |
- google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
- &gdata_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
- ASSERT_TRUE(gdata_entry); |
- |
- EXPECT_EQ(src_entry.title(), gdata_entry->title()); |
- EXPECT_EQ(new_last_modified, gdata_entry->modified_date()); |
- EXPECT_EQ(new_last_accessed, gdata_entry->last_viewed_by_me_date()); |
- |
- ASSERT_FALSE(gdata_entry->parents().empty()); |
- EXPECT_EQ(dest_entry.resource_id(), gdata_entry->parents()[0].file_id()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_SetProperties) { |
- base::FilePath entry_path( |
- FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); |
- |
- ResourceEntry entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(entry_path, &entry)); |
- |
- Property* const first_property = entry.mutable_new_properties()->Add(); |
- first_property->set_key("hello"); |
- first_property->set_value("world"); |
- first_property->set_visibility(Property_Visibility_PUBLIC); |
- |
- Property* const second_property = entry.mutable_new_properties()->Add(); |
- second_property->set_key("this"); |
- second_property->set_value("will-change"); |
- second_property->set_visibility(Property_Visibility_PUBLIC); |
- entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), FROM_HERE, |
- base::Bind(&ResourceMetadata::RefreshEntry, base::Unretained(metadata()), |
- entry), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Perform server side update. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- entry.local_id(), ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- |
- // Add a new property during an update. |
- Property* const property = entry.mutable_new_properties()->Add(); |
- property->set_key("tokyo"); |
- property->set_value("kyoto"); |
- property->set_visibility(Property_Visibility_PUBLIC); |
- |
- // Modify an existing property during an update. |
- second_property->set_value("changed"); |
- |
- // Change the resource entry during an update. |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), FROM_HERE, |
- base::Bind(&ResourceMetadata::RefreshEntry, base::Unretained(metadata()), |
- entry), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- |
- // Wait until the update is fully completed. |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // List of synced properties should be removed from the proto. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(entry_path, &entry)); |
- ASSERT_EQ(2, entry.new_properties().size()); |
- EXPECT_EQ("changed", entry.new_properties().Get(0).value()); |
- EXPECT_EQ("tokyo", entry.new_properties().Get(1).key()); |
-} |
- |
-// Tests updating metadata of a file with a non-dirty cache file. |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_WithNonDirtyCache) { |
- base::FilePath src_path( |
- FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); |
- |
- // Download the file content to prepare a non-dirty cache file. |
- file_system::DownloadOperation download_operation( |
- blocking_task_runner(), delegate(), scheduler(), metadata(), cache(), |
- temp_dir()); |
- FileError error = FILE_ERROR_FAILED; |
- base::FilePath cache_file_path; |
- scoped_ptr<ResourceEntry> src_entry; |
- download_operation.EnsureFileDownloadedByPath( |
- src_path, |
- ClientContext(USER_INITIATED), |
- GetFileContentInitializedCallback(), |
- google_apis::GetContentCallback(), |
- google_apis::test_util::CreateCopyResultCallback( |
- &error, &cache_file_path, &src_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- ASSERT_TRUE(src_entry); |
- |
- // Update the entry locally. |
- src_entry->set_title("Updated" + src_entry->title()); |
- src_entry->set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&ResourceMetadata::RefreshEntry, |
- base::Unretained(metadata()), |
- *src_entry), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Perform server side update. This shouldn't fail. (crbug.com/358590) |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- src_entry->local_id(), |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Verify the file is updated on the server. |
- google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> gdata_entry; |
- fake_service()->GetFileResource( |
- src_entry->resource_id(), |
- google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
- &gdata_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
- ASSERT_TRUE(gdata_entry); |
- EXPECT_EQ(src_entry->title(), gdata_entry->title()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_NotFound) { |
- const std::string id = "this ID should result in NOT_FOUND"; |
- FileError error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- id, ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdate) { |
- const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
- const std::string kResourceId("2_file_resource_id"); |
- |
- const std::string local_id = GetLocalId(kFilePath); |
- EXPECT_FALSE(local_id.empty()); |
- |
- const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
- EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
- |
- int64 original_changestamp = |
- fake_service()->about_resource().largest_change_id(); |
- |
- // The callback will be called upon completion of UpdateEntry(). |
- FileError error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Check that the server has received an update. |
- EXPECT_LT(original_changestamp, |
- fake_service()->about_resource().largest_change_id()); |
- |
- // Check that the file size is updated to that of the updated content. |
- google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> server_entry; |
- fake_service()->GetFileResource( |
- kResourceId, |
- google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
- &server_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
- EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), |
- server_entry->file_size()); |
- |
- // Make sure that the cache is no longer dirty. |
- ResourceEntry entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_ContentUpdateMd5Check) { |
- const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
- const std::string kResourceId("2_file_resource_id"); |
- |
- const std::string local_id = GetLocalId(kFilePath); |
- EXPECT_FALSE(local_id.empty()); |
- |
- const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
- EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
- |
- int64 original_changestamp = |
- fake_service()->about_resource().largest_change_id(); |
- |
- // The callback will be called upon completion of UpdateEntry(). |
- FileError error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Check that the server has received an update. |
- EXPECT_LT(original_changestamp, |
- fake_service()->about_resource().largest_change_id()); |
- |
- // Check that the file size is updated to that of the updated content. |
- google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> server_entry; |
- fake_service()->GetFileResource( |
- kResourceId, |
- google_apis::test_util::CreateCopyResultCallback(&gdata_error, |
- &server_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); |
- EXPECT_EQ(static_cast<int64>(kTestFileContent.size()), |
- server_entry->file_size()); |
- |
- // Make sure that the cache is no longer dirty. |
- ResourceEntry entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
- |
- // Again mark the cache file dirty. |
- scoped_ptr<base::ScopedClosureRunner> file_closer; |
- error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&FileCache::OpenForWrite, |
- base::Unretained(cache()), |
- local_id, |
- &file_closer), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- file_closer.reset(); |
- |
- // And call UpdateEntry again. |
- // In this case, although the file is marked as dirty, but the content |
- // hasn't been changed. Thus, the actual uploading should be skipped. |
- original_changestamp = fake_service()->about_resource().largest_change_id(); |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- EXPECT_EQ(original_changestamp, |
- fake_service()->about_resource().largest_change_id()); |
- |
- // Make sure that the cache is no longer dirty. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_OpenedForWrite) { |
- const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/File 1.txt")); |
- const std::string kResourceId("2_file_resource_id"); |
- |
- const std::string local_id = GetLocalId(kFilePath); |
- EXPECT_FALSE(local_id.empty()); |
- |
- const std::string kTestFileContent = "I'm being uploaded! Yay!"; |
- EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
- |
- // Emulate a situation where someone is writing to the file. |
- scoped_ptr<base::ScopedClosureRunner> file_closer; |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&FileCache::OpenForWrite, |
- base::Unretained(cache()), |
- local_id, |
- &file_closer), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Update. This should not clear the dirty bit. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Make sure that the cache is still dirty. |
- ResourceEntry entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); |
- |
- // Close the file. |
- file_closer.reset(); |
- |
- // Update. This should clear the dirty bit. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Make sure that the cache is no longer dirty. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_UploadNewFile) { |
- // Create a new file locally. |
- const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); |
- |
- ResourceEntry parent; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath.DirName(), &parent)); |
- |
- ResourceEntry entry; |
- entry.set_parent_local_id(parent.local_id()); |
- entry.set_title(kFilePath.BaseName().AsUTF8Unsafe()); |
- entry.mutable_file_specific_info()->set_content_mime_type("text/plain"); |
- entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- std::string local_id; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::ResourceMetadata::AddEntry, |
- base::Unretained(metadata()), |
- entry, |
- &local_id), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Update. This should result in creating a new file on the server. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // The entry got a resource ID. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.resource_id().empty()); |
- EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
- |
- // Make sure that the cache is no longer dirty. |
- EXPECT_FALSE(entry.file_specific_info().cache_state().is_dirty()); |
- |
- // Make sure that we really created a file. |
- google_apis::DriveApiErrorCode status = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> server_entry; |
- fake_service()->GetFileResource( |
- entry.resource_id(), |
- google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, status); |
- ASSERT_TRUE(server_entry); |
- EXPECT_FALSE(server_entry->IsDirectory()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_NewFileOpendForWrite) { |
- // Create a new file locally. |
- const base::FilePath kFilePath(FILE_PATH_LITERAL("drive/root/New File.txt")); |
- |
- ResourceEntry parent; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath.DirName(), &parent)); |
- |
- ResourceEntry entry; |
- entry.set_parent_local_id(parent.local_id()); |
- entry.set_title(kFilePath.BaseName().AsUTF8Unsafe()); |
- entry.mutable_file_specific_info()->set_content_mime_type("text/plain"); |
- entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- std::string local_id; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::ResourceMetadata::AddEntry, |
- base::Unretained(metadata()), |
- entry, |
- &local_id), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- const std::string kTestFileContent = "This is a new file."; |
- EXPECT_EQ(FILE_ERROR_OK, StoreAndMarkDirty(local_id, kTestFileContent)); |
- |
- // Emulate a situation where someone is writing to the file. |
- scoped_ptr<base::ScopedClosureRunner> file_closer; |
- error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&FileCache::OpenForWrite, |
- base::Unretained(cache()), |
- local_id, |
- &file_closer), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Update, but no update is performed because the file is opened. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // The entry hasn't got a resource ID yet. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_TRUE(entry.resource_id().empty()); |
- |
- // Close the file. |
- file_closer.reset(); |
- |
- // Update. This should result in creating a new file on the server. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // The entry got a resource ID. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kFilePath, &entry)); |
- EXPECT_FALSE(entry.resource_id().empty()); |
- EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_CreateDirectory) { |
- // Create a new directory locally. |
- const base::FilePath kPath(FILE_PATH_LITERAL("drive/root/New Directory")); |
- |
- ResourceEntry parent; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPath.DirName(), &parent)); |
- |
- ResourceEntry entry; |
- entry.set_parent_local_id(parent.local_id()); |
- entry.set_title(kPath.BaseName().AsUTF8Unsafe()); |
- entry.mutable_file_info()->set_is_directory(true); |
- entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- std::string local_id; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&internal::ResourceMetadata::AddEntry, |
- base::Unretained(metadata()), |
- entry, |
- &local_id), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Update. This should result in creating a new directory on the server. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- local_id, |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // The entry got a resource ID. |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPath, &entry)); |
- EXPECT_FALSE(entry.resource_id().empty()); |
- EXPECT_EQ(ResourceEntry::CLEAN, entry.metadata_edit_state()); |
- |
- // Make sure that we really created a directory. |
- google_apis::DriveApiErrorCode status = google_apis::DRIVE_OTHER_ERROR; |
- scoped_ptr<google_apis::FileResource> server_entry; |
- fake_service()->GetFileResource( |
- entry.resource_id(), |
- google_apis::test_util::CreateCopyResultCallback(&status, &server_entry)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, status); |
- ASSERT_TRUE(server_entry); |
- EXPECT_TRUE(server_entry->IsDirectory()); |
-} |
- |
-TEST_F(EntryUpdatePerformerTest, UpdateEntry_InsufficientPermission) { |
- base::FilePath src_path( |
- FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); |
- |
- ResourceEntry src_entry; |
- EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &src_entry)); |
- |
- // Update local entry. |
- ResourceEntry updated_entry(src_entry); |
- updated_entry.set_title("Moved" + src_entry.title()); |
- updated_entry.set_metadata_edit_state(ResourceEntry::DIRTY); |
- |
- FileError error = FILE_ERROR_FAILED; |
- base::PostTaskAndReplyWithResult( |
- blocking_task_runner(), |
- FROM_HERE, |
- base::Bind(&ResourceMetadata::RefreshEntry, |
- base::Unretained(metadata()), |
- updated_entry), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // Set user permission to forbid server side update. |
- EXPECT_EQ(google_apis::HTTP_SUCCESS, fake_service()->SetUserPermission( |
- src_entry.resource_id(), google_apis::drive::PERMISSION_ROLE_READER)); |
- |
- // Try to perform update. |
- error = FILE_ERROR_FAILED; |
- performer_->UpdateEntry( |
- src_entry.local_id(), |
- ClientContext(USER_INITIATED), |
- google_apis::test_util::CreateCopyResultCallback(&error)); |
- content::RunAllBlockingPoolTasksUntilIdle(); |
- EXPECT_EQ(FILE_ERROR_OK, error); |
- |
- // This should result in reverting the local change. |
- ResourceEntry result_entry; |
- EXPECT_EQ(FILE_ERROR_OK, |
- GetLocalResourceEntryById(src_entry.local_id(), &result_entry)); |
- EXPECT_EQ(src_entry.title(), result_entry.title()); |
-} |
- |
-} // namespace internal |
-} // namespace drive |