+TEST_F(CopyOperationTest, CopyDirtyFile) {
+ base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
+ base::FilePath dest_path(FILE_PATH_LITERAL(
+ "drive/root/Directory 1/New File.txt"));
+
+ ResourceEntry src_entry;
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(src_path, &src_entry));
+
+ // Store a dirty cache file.
+ base::FilePath temp_file;
+ EXPECT_TRUE(base::CreateTemporaryFileInDir(temp_dir(), &temp_file));
+ std::string contents = "test content";
+ EXPECT_TRUE(google_apis::test_util::WriteStringToFile(temp_file, contents));
+ FileError error = FILE_ERROR_FAILED;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner(),
+ FROM_HERE,
+ base::Bind(&internal::FileCache::Store,
+ base::Unretained(cache()),
+ src_entry.local_id(),
+ std::string(),
+ temp_file,
+ internal::FileCache::FILE_OPERATION_MOVE),
+ google_apis::test_util::CreateCopyResultCallback(&error));
+ test_util::RunBlockingPoolTask();
+ EXPECT_EQ(FILE_ERROR_OK, error);
+
+ // Copy.
+ operation_->Copy(src_path,
+ dest_path,
+ false,
+ google_apis::test_util::CreateCopyResultCallback(&error));
+ test_util::RunBlockingPoolTask();
+ EXPECT_EQ(FILE_ERROR_OK, error);
+
+ ResourceEntry dest_entry;
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &dest_entry));
+ EXPECT_EQ(ResourceEntry::DIRTY, dest_entry.metadata_edit_state());
+
+ EXPECT_EQ(1u, observer()->updated_local_ids().size());
+ EXPECT_TRUE(observer()->updated_local_ids().count(dest_entry.local_id()));
+ EXPECT_EQ(1u, observer()->get_changed_paths().size());
+ EXPECT_TRUE(observer()->get_changed_paths().count(dest_path.DirName()));
+
+ // Copied cache file should be dirty.
+ bool success = false;
+ FileCacheEntry cache_entry;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner(),
+ FROM_HERE,
+ base::Bind(&internal::FileCache::GetCacheEntry,
+ base::Unretained(cache()),
+ dest_entry.local_id(),
+ &cache_entry),
+ google_apis::test_util::CreateCopyResultCallback(&success));
+ test_util::RunBlockingPoolTask();
+ EXPECT_TRUE(success);
+ EXPECT_TRUE(cache_entry.is_dirty());
+
+ // File contents should match.
+ base::FilePath cache_file_path;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner(),
+ FROM_HERE,
+ base::Bind(&internal::FileCache::GetFile,
+ base::Unretained(cache()),
+ dest_entry.local_id(),
+ &cache_file_path),
+ google_apis::test_util::CreateCopyResultCallback(&error));
+ test_util::RunBlockingPoolTask();
+ EXPECT_EQ(FILE_ERROR_OK, error);
+
+ std::string copied_contents;
+ EXPECT_TRUE(base::ReadFileToString(cache_file_path, &copied_contents));
+ EXPECT_EQ(contents, copied_contents);
+}
+
+TEST_F(CopyOperationTest, CopyFileOverwriteFile) {
+ base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
+ base::FilePath dest_path(FILE_PATH_LITERAL(
+ "drive/root/Directory 1/SubDirectory File 1.txt"));
+
+ ResourceEntry old_dest_entry;
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &old_dest_entry));
+
+ FileError error = FILE_ERROR_OK;
+ operation_->Copy(src_path,
+ dest_path,
+ false,
+ google_apis::test_util::CreateCopyResultCallback(&error));
+ test_util::RunBlockingPoolTask();
+ EXPECT_EQ(FILE_ERROR_OK, error);
+
+ ResourceEntry new_dest_entry;
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(dest_path, &new_dest_entry));
+
+ EXPECT_EQ(1u, observer()->updated_local_ids().size());
+ EXPECT_TRUE(observer()->updated_local_ids().count(old_dest_entry.local_id()));
+ EXPECT_EQ(1u, observer()->get_changed_paths().size());
+ EXPECT_TRUE(observer()->get_changed_paths().count(dest_path.DirName()));
+}
+
+TEST_F(CopyOperationTest, CopyFileOverwriteDirectory) {
+ base::FilePath src_path(FILE_PATH_LITERAL("drive/root/File 1.txt"));
+ base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/Directory 1"));
+
+ FileError error = FILE_ERROR_OK;
+ operation_->Copy(src_path,
+ dest_path,
+ false,
+ google_apis::test_util::CreateCopyResultCallback(&error));
+ test_util::RunBlockingPoolTask();
+ EXPECT_EQ(FILE_ERROR_INVALID_OPERATION, error);
+}
+