#include "chrome/browser/chromeos/drive/file_system/copy_operation.h"
+#include "base/file_util.h"
#include "base/task_runner_util.h"
#include "chrome/browser/chromeos/drive/file_cache.h"
#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h"
remote_dest_path.DirName()));
}
-TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_QuotaCheck) {
+TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_Overwrite) {
const base::FilePath local_src_path = temp_dir().AppendASCII("local.txt");
const base::FilePath remote_dest_path(
- FILE_PATH_LITERAL("drive/root/remote.txt"));
-
- const size_t kFileSize = 10;
+ FILE_PATH_LITERAL("drive/root/File 1.txt"));
// Prepare a local file.
- ASSERT_TRUE(
- google_apis::test_util::WriteStringToFile(local_src_path,
- std::string(kFileSize, 'a')));
-
- // Set insufficient quota.
- fake_service()->SetQuotaValue(100, 100 + kFileSize - 1);
+ EXPECT_TRUE(
+ google_apis::test_util::WriteStringToFile(local_src_path, "hello"));
+ // Confirm that the remote file exists.
+ ResourceEntry entry;
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry));
// Transfer the local file to Drive.
FileError error = FILE_ERROR_FAILED;
remote_dest_path,
google_apis::test_util::CreateCopyResultCallback(&error));
test_util::RunBlockingPoolTask();
- EXPECT_EQ(FILE_ERROR_NO_SERVER_SPACE, error);
-
- // Set sufficient quota.
- fake_service()->SetQuotaValue(100, 100 + kFileSize);
+ EXPECT_EQ(FILE_ERROR_OK, error);
- // Transfer the local file to Drive.
- error = FILE_ERROR_FAILED;
- operation_->TransferFileFromLocalToRemote(
- local_src_path,
- remote_dest_path,
- google_apis::test_util::CreateCopyResultCallback(&error));
+ // TransferFileFromLocalToRemote stores a copy of the local file in the cache,
+ // marks it dirty and requests the observer to upload the file.
+ EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(remote_dest_path, &entry));
+ EXPECT_EQ(1U, observer()->updated_local_ids().count(entry.local_id()));
+ FileCacheEntry cache_entry;
+ bool found = false;
+ base::PostTaskAndReplyWithResult(
+ blocking_task_runner(),
+ FROM_HERE,
+ base::Bind(&internal::FileCache::GetCacheEntry,
+ base::Unretained(cache()), entry.local_id(), &cache_entry),
+ google_apis::test_util::CreateCopyResultCallback(&found));
test_util::RunBlockingPoolTask();
- EXPECT_EQ(FILE_ERROR_OK, error);
+ EXPECT_TRUE(found);
+ EXPECT_TRUE(cache_entry.is_present());
+ EXPECT_TRUE(cache_entry.is_dirty());
+
+ EXPECT_EQ(1U, observer()->get_changed_paths().size());
+ EXPECT_TRUE(observer()->get_changed_paths().count(
+ remote_dest_path.DirName()));
}
TEST_F(CopyOperationTest, TransferFileFromLocalToRemote_HostedDocument) {
EXPECT_TRUE(observer()->get_changed_paths().empty());
}
+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);
+}
+
TEST_F(CopyOperationTest, CopyDirectory) {
base::FilePath src_path(FILE_PATH_LITERAL("drive/root/Directory 1"));
base::FilePath dest_path(FILE_PATH_LITERAL("drive/root/New Directory"));