Index: chrome/browser/sync_file_system/drive_backend/conflict_resolver_unittest.cc |
diff --git a/chrome/browser/sync_file_system/drive_backend/conflict_resolver_unittest.cc b/chrome/browser/sync_file_system/drive_backend/conflict_resolver_unittest.cc |
index 35e3ac979a5fd70e70fbf42cb5b85da4bd6bce5a..b7aa41c0c31441023a25aa3948e2066be291e9e1 100644 |
--- a/chrome/browser/sync_file_system/drive_backend/conflict_resolver_unittest.cc |
+++ b/chrome/browser/sync_file_system/drive_backend/conflict_resolver_unittest.cc |
@@ -140,6 +140,31 @@ class ConflictResolverTest : public testing::Test, |
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 status = SYNC_STATUS_UNKNOWN; |
scoped_ptr<RemoteToLocalSyncer> syncer(new RemoteToLocalSyncer(this)); |
@@ -295,7 +320,59 @@ TEST_F(ConflictResolverTest, ResolveConflict_FilesAndFolders) { |
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 sync_file_system |