Commit b75eddbc authored by nhiroki@chromium.org's avatar nhiroki@chromium.org

SyncFS: Fix conflict resolver for multiple parents


BUG=240165
TEST=unit_tests --gtest_filter=ConflictResolverTest.*

Review URL: https://codereview.chromium.org/101283002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@238373 0039d316-1c4b-4281-b951-d872f2087c98
parent 456eb397
...@@ -57,6 +57,8 @@ void ConflictResolver::Run(const SyncStatusCallback& callback) { ...@@ -57,6 +57,8 @@ void ConflictResolver::Run(const SyncStatusCallback& callback) {
for (TrackerSet::const_iterator itr = trackers.begin(); for (TrackerSet::const_iterator itr = trackers.begin();
itr != trackers.end(); ++itr) { itr != trackers.end(); ++itr) {
const FileTracker& tracker = **itr; const FileTracker& tracker = **itr;
if (tracker.active())
continue;
FileTracker parent_tracker; FileTracker parent_tracker;
bool should_success = metadata_database()->FindTrackerByTrackerID( bool should_success = metadata_database()->FindTrackerByTrackerID(
...@@ -99,7 +101,7 @@ void ConflictResolver::DetachFromNonPrimaryParents( ...@@ -99,7 +101,7 @@ void ConflictResolver::DetachFromNonPrimaryParents(
std::string parent_folder_id = parents_to_remove_.back(); std::string parent_folder_id = parents_to_remove_.back();
parents_to_remove_.pop_back(); parents_to_remove_.pop_back();
drive_service()->RemoveResourceFromDirectory( drive_service()->RemoveResourceFromDirectory(
target_file_id_, parent_folder_id, parent_folder_id, target_file_id_,
base::Bind(&ConflictResolver::DidDetachFromParent, base::Bind(&ConflictResolver::DidDetachFromParent,
weak_ptr_factory_.GetWeakPtr(), weak_ptr_factory_.GetWeakPtr(),
callback)); callback));
......
...@@ -140,6 +140,31 @@ class ConflictResolverTest : public testing::Test, ...@@ -140,6 +140,31 @@ class ConflictResolverTest : public testing::Test,
return file_id; return file_id;
} }
google_apis::GDataErrorCode AddFileToFolder(
const std::string& parent_folder_id,
const std::string& file_id) {
google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
fake_drive_service_->AddResourceToDirectory(
parent_folder_id, file_id,
CreateResultReceiver(&error));
base::RunLoop().RunUntilIdle();
return error;
}
int CountParents(const std::string& file_id) {
scoped_ptr<google_apis::ResourceEntry> entry;
EXPECT_EQ(google_apis::HTTP_SUCCESS,
fake_drive_helper_->GetResourceEntry(file_id, &entry));
int count = 0;
const ScopedVector<google_apis::Link>& links = entry->links();
for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin();
itr != links.end(); ++itr) {
if ((*itr)->type() == google_apis::Link::LINK_PARENT)
++count;
}
return count;
}
SyncStatusCode RunSyncer() { SyncStatusCode RunSyncer() {
SyncStatusCode status = SYNC_STATUS_UNKNOWN; SyncStatusCode status = SYNC_STATUS_UNKNOWN;
scoped_ptr<RemoteToLocalSyncer> syncer(new RemoteToLocalSyncer(this)); scoped_ptr<RemoteToLocalSyncer> syncer(new RemoteToLocalSyncer(this));
...@@ -295,7 +320,59 @@ TEST_F(ConflictResolverTest, ResolveConflict_FilesAndFolders) { ...@@ -295,7 +320,59 @@ TEST_F(ConflictResolverTest, ResolveConflict_FilesAndFolders) {
google_apis::ENTRY_KIND_FOLDER); google_apis::ENTRY_KIND_FOLDER);
} }
// TODO(nhiroki): Add multi-parent resolution cases. TEST_F(ConflictResolverTest, ResolveMultiParents_File) {
const GURL kOrigin("chrome-extension://example");
const std::string sync_root = CreateSyncRoot();
const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host());
InitializeMetadataDatabase();
RegisterApp(kOrigin.host(), app_root);
RunSyncerUntilIdle();
const std::string primary = CreateRemoteFolder(app_root, "primary");
const std::string file = CreateRemoteFile(primary, "file", "data");
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary1"), file));
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary2"), file));
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary3"), file));
EXPECT_EQ(SYNC_STATUS_OK, ListChanges());
RunSyncerUntilIdle();
EXPECT_EQ(4, CountParents(file));
EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver());
EXPECT_EQ(1, CountParents(file));
}
TEST_F(ConflictResolverTest, ResolveMultiParents_Folder) {
const GURL kOrigin("chrome-extension://example");
const std::string sync_root = CreateSyncRoot();
const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host());
InitializeMetadataDatabase();
RegisterApp(kOrigin.host(), app_root);
RunSyncerUntilIdle();
const std::string primary = CreateRemoteFolder(app_root, "primary");
const std::string file = CreateRemoteFolder(primary, "folder");
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary1"), file));
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary2"), file));
ASSERT_EQ(google_apis::HTTP_SUCCESS,
AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary3"), file));
EXPECT_EQ(SYNC_STATUS_OK, ListChanges());
RunSyncerUntilIdle();
EXPECT_EQ(4, CountParents(file));
EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver());
EXPECT_EQ(1, CountParents(file));
}
} // namespace drive_backend } // namespace drive_backend
} // namespace sync_file_system } // namespace sync_file_system
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment