diff options
Diffstat (limited to 'components/drive/sync/remove_performer_unittest.cc')
-rw-r--r-- | components/drive/sync/remove_performer_unittest.cc | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/components/drive/sync/remove_performer_unittest.cc b/components/drive/sync/remove_performer_unittest.cc new file mode 100644 index 0000000..7404d00 --- /dev/null +++ b/components/drive/sync/remove_performer_unittest.cc @@ -0,0 +1,199 @@ +// Copyright 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/drive/sync/remove_performer.h" + +#include "base/task_runner_util.h" +#include "components/drive/file_system/operation_test_base.h" +#include "components/drive/file_system_core_util.h" +#include "components/drive/job_scheduler.h" +#include "components/drive/resource_metadata.h" +#include "components/drive/service/fake_drive_service.h" +#include "content/public/test/test_utils.h" +#include "google_apis/drive/drive_api_parser.h" +#include "google_apis/drive/test_util.h" + +namespace drive { +namespace internal { + +typedef file_system::OperationTestBase RemovePerformerTest; + +TEST_F(RemovePerformerTest, RemoveFile) { + RemovePerformer performer(blocking_task_runner(), delegate(), scheduler(), + metadata()); + + base::FilePath file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt")); + base::FilePath file_in_subdir( + FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); + + // Remove a file in root. + ResourceEntry entry; + FileError error = FILE_ERROR_FAILED; + ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &entry)); + performer.Remove(entry.local_id(), + ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + + // Remove a file in subdirectory. + error = FILE_ERROR_FAILED; + ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_subdir, &entry)); + const std::string resource_id = entry.resource_id(); + + performer.Remove(entry.local_id(), + ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + + // Verify the file is indeed removed in the server. + google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; + scoped_ptr<google_apis::FileResource> gdata_entry; + fake_service()->GetFileResource( + resource_id, + google_apis::test_util::CreateCopyResultCallback(&gdata_error, + &gdata_entry)); + content::RunAllBlockingPoolTasksUntilIdle(); + ASSERT_EQ(google_apis::HTTP_SUCCESS, gdata_error); + EXPECT_TRUE(gdata_entry->labels().is_trashed()); + + // Try removing non-existing file. + error = FILE_ERROR_FAILED; + performer.Remove("non-existing-id", + ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_NOT_FOUND, error); +} + +TEST_F(RemovePerformerTest, RemoveShared) { + RemovePerformer performer(blocking_task_runner(), delegate(), scheduler(), + metadata()); + + const base::FilePath kPathInMyDrive(FILE_PATH_LITERAL( + "drive/root/shared.txt")); + const base::FilePath kPathInOther(FILE_PATH_LITERAL( + "drive/other/shared.txt")); + + // Prepare a shared file to the root folder. + google_apis::DriveApiErrorCode gdata_error = google_apis::DRIVE_OTHER_ERROR; + scoped_ptr<google_apis::FileResource> gdata_entry; + fake_service()->AddNewFile( + "text/plain", + "dummy content", + fake_service()->GetRootResourceId(), + kPathInMyDrive.BaseName().AsUTF8Unsafe(), + true, // shared_with_me, + google_apis::test_util::CreateCopyResultCallback(&gdata_error, + &gdata_entry)); + content::RunAllBlockingPoolTasksUntilIdle(); + ASSERT_EQ(google_apis::HTTP_CREATED, gdata_error); + CheckForUpdates(); + + // Remove it. Locally, the file should be moved to drive/other. + ResourceEntry entry; + ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPathInMyDrive, &entry)); + FileError error = FILE_ERROR_FAILED; + performer.Remove(entry.local_id(), + ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + EXPECT_EQ(FILE_ERROR_NOT_FOUND, + GetLocalResourceEntry(kPathInMyDrive, &entry)); + EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(kPathInOther, &entry)); + + // Remotely, the entry should have lost its parent. + gdata_error = google_apis::DRIVE_OTHER_ERROR; + const std::string resource_id = gdata_entry->file_id(); + fake_service()->GetFileResource( + resource_id, + google_apis::test_util::CreateCopyResultCallback(&gdata_error, + &gdata_entry)); + content::RunAllBlockingPoolTasksUntilIdle(); + ASSERT_EQ(google_apis::HTTP_SUCCESS, gdata_error); + EXPECT_FALSE(gdata_entry->labels().is_trashed()); // It's not deleted. + EXPECT_TRUE(gdata_entry->parents().empty()); +} + +TEST_F(RemovePerformerTest, RemoveLocallyCreatedFile) { + RemovePerformer performer(blocking_task_runner(), delegate(), scheduler(), + metadata()); + + // Add an entry without resource ID. + ResourceEntry entry; + entry.set_title("New File.txt"); + entry.set_parent_local_id(util::kDriveTrashDirLocalId); + + FileError error = FILE_ERROR_FAILED; + std::string local_id; + base::PostTaskAndReplyWithResult( + blocking_task_runner(), + FROM_HERE, + base::Bind(&ResourceMetadata::AddEntry, + base::Unretained(metadata()), + entry, + &local_id), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + + // Remove the entry. + performer.Remove(local_id, ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntryById(local_id, &entry)); +} + +TEST_F(RemovePerformerTest, Remove_InsufficientPermission) { + RemovePerformer performer(blocking_task_runner(), delegate(), scheduler(), + metadata()); + + base::FilePath file_in_root(FILE_PATH_LITERAL("drive/root/File 1.txt")); + + ResourceEntry src_entry; + ASSERT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(file_in_root, &src_entry)); + + // Remove locally. + ResourceEntry updated_entry(src_entry); + updated_entry.set_parent_local_id(util::kDriveTrashDirLocalId); + + FileError error = FILE_ERROR_FAILED; + base::PostTaskAndReplyWithResult( + blocking_task_runner(), + FROM_HERE, + base::Bind(&ResourceMetadata::RefreshEntry, + base::Unretained(metadata()), + updated_entry), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + + // Set user permission to forbid server side update. + EXPECT_EQ(google_apis::HTTP_SUCCESS, fake_service()->SetUserPermission( + src_entry.resource_id(), google_apis::drive::PERMISSION_ROLE_READER)); + + // Try to perform remove. + error = FILE_ERROR_FAILED; + performer.Remove(src_entry.local_id(), + ClientContext(USER_INITIATED), + google_apis::test_util::CreateCopyResultCallback(&error)); + content::RunAllBlockingPoolTasksUntilIdle(); + EXPECT_EQ(FILE_ERROR_OK, error); + + // This should result in reverting the local change. + ResourceEntry result_entry; + EXPECT_EQ(FILE_ERROR_OK, + GetLocalResourceEntryById(src_entry.local_id(), &result_entry)); + EXPECT_EQ(src_entry.parent_local_id(), result_entry.parent_local_id()); + + ASSERT_EQ(1U, delegate()->drive_sync_errors().size()); + EXPECT_EQ(file_system::DRIVE_SYNC_ERROR_DELETE_WITHOUT_PERMISSION, + delegate()->drive_sync_errors()[0]); +} + +} // namespace internal +} // namespace drive |