1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// found in the LICENSE file. 4a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/sync/entry_revert_performer.h" 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/task_runner_util.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/drive/file_change.h" 9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system/operation_test_base.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/chromeos/drive/job_scheduler.h" 12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/chromeos/drive/resource_metadata.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/drive/fake_drive_service.h" 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_utils.h" 15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "google_apis/drive/test_util.h" 16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace drive { 19a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace internal { 20a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class EntryRevertPerformerTest : public file_system::OperationTestBase { 22a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected: 23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void SetUp() OVERRIDE { 24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) OperationTestBase::SetUp(); 25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) performer_.reset(new EntryRevertPerformer(blocking_task_runner(), 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delegate(), 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scheduler(), 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) metadata())); 29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 31a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<EntryRevertPerformer> performer_; 32a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}; 33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(EntryRevertPerformerTest, RevertEntry) { 35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath path( 36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::FilePath updated_path(FILE_PATH_LITERAL( 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch "drive/root/Directory 1/UpdatedSubDirectory File 1.txt")); 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry src_entry; 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(path, &src_entry)); 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Update local entry. 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry updated_entry = src_entry; 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) updated_entry.set_title("Updated" + src_entry.title()); 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) updated_entry.set_metadata_edit_state(ResourceEntry::DIRTY); 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blocking_task_runner(), 51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ResourceMetadata::RefreshEntry, 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(metadata()), updated_entry), 54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Revert local change. 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error = FILE_ERROR_FAILED; 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) performer_->RevertEntry( 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) src_entry.local_id(), 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ClientContext(USER_INITIATED), 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Verify local change is reverted. 68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry result_entry; 69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetLocalResourceEntryById(src_entry.local_id(), &result_entry)); 71a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(src_entry.title(), result_entry.title()); 72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(ResourceEntry::CLEAN, result_entry.metadata_edit_state()); 73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2U, delegate()->get_changed_files().size()); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(path)); 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(updated_path)); 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(EntryRevertPerformerTest, RevertEntry_NotFoundOnServer) { 80a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry my_drive; 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetLocalResourceEntry(util::GetDriveMyDriveRootPath(), &my_drive)); 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Add a new entry with a nonexistent resource ID. 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry entry; 86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry.set_title("New File.txt"); 87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry.set_resource_id("non-existent-resource-id"); 88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry.set_parent_local_id(my_drive.local_id()); 89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string local_id; 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::PostTaskAndReplyWithResult( 93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) blocking_task_runner(), 94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FROM_HERE, 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Bind(&ResourceMetadata::AddEntry, 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::Unretained(metadata()), entry, &local_id), 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Revert local change. The added entry should be removed. 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) error = FILE_ERROR_FAILED; 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) performer_->RevertEntry( 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) local_id, 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ClientContext(USER_INITIATED), 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Verify the entry was deleted locally. 111a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, GetLocalResourceEntryById(local_id, &entry)); 112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().CountDirectory( 115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) util::GetDriveMyDriveRootPath())); 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(EntryRevertPerformerTest, RevertEntry_TrashedOnServer) { 119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::FilePath path( 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FILE_PATH_LITERAL("drive/root/Directory 1/SubDirectory File 1.txt")); 121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ResourceEntry entry; 123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, GetLocalResourceEntry(path, &entry)); 124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Trash the entry on the server. 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::GDataErrorCode gdata_error = google_apis::GDATA_OTHER_ERROR; 1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) fake_service()->TrashResource( 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry.resource_id(), 129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&gdata_error)); 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(google_apis::HTTP_SUCCESS, gdata_error); 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Revert local change. The entry should be removed. 134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) FileError error = FILE_ERROR_FAILED; 135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) performer_->RevertEntry( 136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) entry.local_id(), 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ClientContext(USER_INITIATED), 138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) google_apis::test_util::CreateCopyResultCallback(&error)); 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::RunAllBlockingPoolTasksUntilIdle(); 140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_OK, error); 141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Verify the entry was deleted locally. 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_EQ(FILE_ERROR_NOT_FOUND, 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetLocalResourceEntryById(entry.local_id(), &entry)); 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, delegate()->get_changed_files().size()); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(delegate()->get_changed_files().count(path)); 148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 150a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace internal 151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} // namespace drive 152