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)                       &copy_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