1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file. 4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/copy_operation.h" 6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 88bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/task_runner_util.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_cache.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/drive/drive_api_util.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h" 1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "google_apis/drive/drive_api_parser.h" 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace drive { 22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace file_system { 23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Used to handle WaitForSyncComplete() calls. 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool CopyWaitForSyncCompleteArguments(std::string* out_local_id, 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileOperationCallback* out_callback, 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& local_id, 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const FileOperationCallback& callback) { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *out_local_id = local_id; 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *out_callback = callback; 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return true; 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class CopyOperationTest : public OperationTestBase { 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected: 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void SetUp() OVERRIDE { 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) OperationTestBase::SetUp(); 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) operation_.reset(new CopyOperation( 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blocking_task_runner(), delegate(), scheduler(), metadata(), cache())); 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) scoped_ptr<CopyOperation> operation_; 47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}; 48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_RegularFile) { 50868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath local_src_path = temp_dir().AppendASCII("local.txt"); 51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath remote_dest_path( 52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FILE_PATH_LITERAL("drive/root/remote.txt")); 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Prepare a local file. 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE( 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::WriteStringToFile(local_src_path, "hello")); 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Confirm that the remote file does not exist. 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, 60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetLocalResourceEntry(remote_dest_path, &entry)); 61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Transfer the local file to Drive. 63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_->TransferFileFromLocalToRemote( 65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) local_src_path, 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_dest_path, 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // TransferFileFromLocalToRemote stores a copy of the local file in the cache, 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // marks it dirty and requests the observer to upload the file. 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->updated_local_ids().count(entry.local_id())); 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(remote_dest_path)); 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_Overwrite) { 83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::FilePath local_src_path = temp_dir().AppendASCII("local.txt"); 84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch const base::FilePath remote_dest_path( 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FILE_PATH_LITERAL("drive/root/File 1.txt")); 86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Prepare a local file. 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE( 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::WriteStringToFile(local_src_path, "hello")); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Confirm that the remote file exists. 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry entry; 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Transfer the local file to Drive. 95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch FileError error = FILE_ERROR_FAILED; 96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch operation_->TransferFileFromLocalToRemote( 97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch local_src_path, 98ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch remote_dest_path, 99ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch google_apis::test_util::CreateCopyResultCallback(&error)); 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 102ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TransferFileFromLocalToRemote stores a copy of the local file in the cache, 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // marks it dirty and requests the observer to upload the file. 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->updated_local_ids().count(entry.local_id())); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_present()); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(entry.file_specific_info().cache_state().is_dirty()); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(remote_dest_path)); 112ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch} 113ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(CopyOperationTest, 115a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TransferFileFromLocalToRemote_ExistingHostedDocument) { 116868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath local_src_path = temp_dir().AppendASCII("local.gdoc"); 117868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const base::FilePath remote_dest_path(FILE_PATH_LITERAL( 118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "drive/root/Directory 1/copied.gdoc")); 119868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 120868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Prepare a local file, which is a json file of a hosted document, which 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // matches "drive/root/Document 1 excludeDir-test". 122868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(util::CreateGDocFile( 123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) local_src_path, 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://3_document_self_link/5_document_resource_id"), 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "5_document_resource_id")); 126868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 127868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 128868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, 129868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetLocalResourceEntry(remote_dest_path, &entry)); 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Transfer the local file to Drive. 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_->TransferFileFromLocalToRemote( 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) local_src_path, 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_dest_path, 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(remote_dest_path)); 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // New copy is created. 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_NE("5_document_resource_id", entry.resource_id()); 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_OrphanHostedDocument) { 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath local_src_path = temp_dir().AppendASCII("local.gdoc"); 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath remote_dest_path(FILE_PATH_LITERAL( 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "drive/root/Directory 1/moved.gdoc")); 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prepare a local file, which is a json file of a hosted document, which 1545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // matches "drive/other/Orphan Document". 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(util::CreateGDocFile( 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_src_path, 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GURL("https://3_document_self_link/orphan_doc_1"), 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "orphan_doc_1")); 159a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntry entry; 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, 162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetLocalResourceEntry(remote_dest_path, &entry)); 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Transfer the local file to Drive. 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operation_->TransferFileFromLocalToRemote( 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_src_path, 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remote_dest_path, 169a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 171a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 173a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(ResourceEntry::DIRTY, entry.metadata_edit_state()); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->updated_local_ids().count(entry.local_id())); 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(remote_dest_path)); 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The original document got new parent. 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("orphan_doc_1", entry.resource_id()); 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_NewHostedDocument) { 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath local_src_path = temp_dir().AppendASCII("local.gdoc"); 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::FilePath remote_dest_path(FILE_PATH_LITERAL( 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "drive/root/Directory 1/moved.gdoc")); 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Create a hosted document on the server that is not synced to local yet. 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; 19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) scoped_ptr<google_apis::FileResource> new_gdoc_entry; 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) fake_service()->AddNewFile( 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "application/vnd.google-apps.document", "", "", "title", true, 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&gdata_error, 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &new_gdoc_entry)); 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(google_apis::HTTP_CREATED, gdata_error); 197a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Prepare a local file, which is a json file of the added hosted document. 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_TRUE(util::CreateGDocFile( 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_src_path, 20146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) GURL("https://3_document_self_link/" + new_gdoc_entry->file_id()), 20246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new_gdoc_entry->file_id())); 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ResourceEntry entry; 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetLocalResourceEntry(remote_dest_path, &entry)); 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Transfer the local file to Drive. 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 210a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) operation_->TransferFileFromLocalToRemote( 211a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_src_path, 212a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) remote_dest_path, 213a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 215a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 216a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry)); 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(remote_dest_path)); 221a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // The original document got new parent. 22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_EQ(new_gdoc_entry->file_id(), entry.resource_id()); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(CopyOperationTest, CopyNotExistingFile) { 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/Dummy file.txt")); 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/Test.log")); 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(src_path, &entry)); 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileError error = FILE_ERROR_OK; 233868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_->Copy(src_path, 234868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dest_path, 23568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) false, 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); 239868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 240868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(src_path, &entry)); 241868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(dest_path, &entry)); 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().empty()); 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(CopyOperationTest, CopyFileToNonExistingDirectory) { 246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/Dummy/Test.log")); 248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 251868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_NOT_FOUND, 252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) GetLocalResourceEntry(dest_path.DirName(), &entry)); 253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileError error = FILE_ERROR_OK; 255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_->Copy(src_path, 256868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dest_path, 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) false, 258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); 261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(dest_path, &entry)); 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().empty()); 265868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Test the case where the parent of the destination path is an existing file, 268868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// not a directory. 269868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(CopyOperationTest, CopyFileToInvalidPath) { 270868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL( 271868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Document 1 excludeDir-test.gdoc")); 272868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL( 273868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) "drive/root/Duplicate Name.txt/Document 1 excludeDir-test.gdoc")); 274868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 275868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ResourceEntry entry; 276868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 277868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path.DirName(), &entry)); 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_FALSE(entry.file_info().is_directory()); 279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) FileError error = FILE_ERROR_OK; 281868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) operation_->Copy(src_path, 282868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) dest_path, 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) false, 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 285116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_A_DIRECTORY, error); 287868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 288868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 289868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntry(dest_path, &entry)); 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().empty()); 291868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 292868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CopyOperationTest, CopyDirtyFile) { 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL( 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "drive/root/Directory 1/New File.txt")); 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry src_entry; 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &src_entry)); 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Store a dirty cache file. 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath temp_file; 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir(), &temp_file)); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string contents = "test content"; 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(google_apis::test_util::WriteStringToFile(temp_file, contents)); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocking_task_runner(), 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&internal::FileCache::Store, 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(cache()), 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) src_entry.local_id(), 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_file, 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) internal::FileCache::FILE_OPERATION_MOVE), 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Copy. 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) operation_->Copy(src_path, 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_path, 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry dest_entry; 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &dest_entry)); 3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ResourceEntry::DIRTY, dest_entry.metadata_edit_state()); 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, delegate()->updated_local_ids().size()); 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->updated_local_ids().count(dest_entry.local_id())); 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, delegate()->get_changed_files().size()); 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(dest_path)); 3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Copied cache file should be dirty. 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(dest_entry.file_specific_info().cache_state().is_dirty()); 3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // File contents should match. 3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath cache_file_path; 3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) blocking_task_runner(), 3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FROM_HERE, 3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Bind(&internal::FileCache::GetFile, 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Unretained(cache()), 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_entry.local_id(), 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &cache_file_path), 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 350116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string copied_contents; 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(base::ReadFileToString(cache_file_path, &copied_contents)); 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(contents, copied_contents); 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CopyOperationTest, CopyFileOverwriteFile) { 3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL( 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) "drive/root/Directory 1/SubDirectory File 1.txt")); 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry old_dest_entry; 3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &old_dest_entry)); 3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error = FILE_ERROR_OK; 3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) operation_->Copy(src_path, 3685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_path, 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ResourceEntry new_dest_entry; 3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &new_dest_entry)); 3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, delegate()->updated_local_ids().size()); 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->updated_local_ids().count(old_dest_entry.local_id())); 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1u, delegate()->get_changed_files().size()); 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(dest_path)); 3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(CopyOperationTest, CopyFileOverwriteDirectory) { 3845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/Directory 1")); 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FileError error = FILE_ERROR_OK; 3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) operation_->Copy(src_path, 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) dest_path, 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) false, 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_INVALID_OPERATION, error); 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 396d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(CopyOperationTest, CopyDirectory) { 397d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/Directory 1")); 398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/New Directory")); 399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 400d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ResourceEntry entry; 401d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 402d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(entry.file_info().is_directory()); 403d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path.DirName(), &entry)); 404d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ASSERT_TRUE(entry.file_info().is_directory()); 405d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 406d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) FileError error = FILE_ERROR_OK; 407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) operation_->Copy(src_path, 408d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) dest_path, 40968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) false, 410d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 412d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_A_FILE, error); 413d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)} 414d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 41568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(CopyOperationTest, PreserveLastModified) { 416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 417a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/File 2.txt")); 418a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 419a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry entry; 420a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 421a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_EQ(FILE_ERROR_OK, 422a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetLocalResourceEntry(dest_path.DirName(), &entry)); 423a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 424a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FileError error = FILE_ERROR_OK; 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) operation_->Copy(src_path, 426a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) dest_path, 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) true, // Preserve last modified. 428a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 430a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 431a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry entry2; 433a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &entry)); 434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &entry2)); 435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(entry.file_info().last_modified(), 436a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry2.file_info().last_modified()); 43768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 43868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(CopyOperationTest, WaitForSyncComplete) { 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Create a directory locally. 4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt")); 4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath directory_path(FILE_PATH_LITERAL("drive/root/New Directory")); 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::FilePath dest_path = directory_path.AppendASCII("File 1.txt"); 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceEntry directory_parent; 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) GetLocalResourceEntry(directory_path.DirName(), &directory_parent)); 4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceEntry directory; 4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.set_parent_local_id(directory_parent.local_id()); 4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.set_title(directory_path.BaseName().AsUTF8Unsafe()); 4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.mutable_file_info()->set_is_directory(true); 4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.set_metadata_edit_state(ResourceEntry::DIRTY); 4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string directory_local_id; 4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileError error = FILE_ERROR_FAILED; 4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::PostTaskAndReplyWithResult( 4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blocking_task_runner(), 4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&internal::ResourceMetadata::AddEntry, 4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(metadata()), directory, &directory_local_id), 4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Try to copy a file to the new directory which lacks resource ID. 4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This should result in waiting for the directory to sync. 4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string waited_local_id; 4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileOperationCallback pending_callback; 4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delegate()->set_wait_for_sync_complete_handler( 4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&CopyWaitForSyncCompleteArguments, 4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &waited_local_id, &pending_callback)); 4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FileError copy_error = FILE_ERROR_FAILED; 4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) operation_->Copy(src_path, 4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dest_path, 4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) true, // Preserve last modified. 4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) google_apis::test_util::CreateCopyResultCallback( 4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ©_error)); 4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(directory_local_id, waited_local_id); 4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_FALSE(pending_callback.is_null()); 4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add a new directory to the server and store the resource ID locally. 4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) google_apis::GDataErrorCode status = google_apis::GDATA_OTHER_ERROR; 4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<google_apis::FileResource> file_resource; 4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) fake_service()->AddNewDirectory( 4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory_parent.resource_id(), 4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.title(), 4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DriveServiceInterface::AddNewDirectoryOptions(), 4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) google_apis::test_util::CreateCopyResultCallback( 4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &status, &file_resource)); 4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(google_apis::HTTP_CREATED, status); 4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ASSERT_TRUE(file_resource); 4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.set_local_id(directory_local_id); 4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) directory.set_resource_id(file_resource->file_id()); 4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::PostTaskAndReplyWithResult( 5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) blocking_task_runner(), 5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) FROM_HERE, 5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Bind(&internal::ResourceMetadata::RefreshEntry, 5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Unretained(metadata()), directory), 5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Resume the copy operation. 5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) pending_callback.Run(FILE_ERROR_OK); 5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, copy_error); 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ResourceEntry entry; 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &entry)); 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace file_system 518868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} // namespace drive 519