OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/conflict_resolver.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/files/scoped_temp_dir.h" | 9 #include "base/files/scoped_temp_dir.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 std::string CreateRemoteFile(const std::string& parent_folder_id, | 133 std::string CreateRemoteFile(const std::string& parent_folder_id, |
134 const std::string& title, | 134 const std::string& title, |
135 const std::string& content) { | 135 const std::string& content) { |
136 std::string file_id; | 136 std::string file_id; |
137 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 137 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
138 fake_drive_helper_->AddFile( | 138 fake_drive_helper_->AddFile( |
139 parent_folder_id, title, content, &file_id)); | 139 parent_folder_id, title, content, &file_id)); |
140 return file_id; | 140 return file_id; |
141 } | 141 } |
142 | 142 |
| 143 google_apis::GDataErrorCode AddFileToFolder( |
| 144 const std::string& parent_folder_id, |
| 145 const std::string& file_id) { |
| 146 google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR; |
| 147 fake_drive_service_->AddResourceToDirectory( |
| 148 parent_folder_id, file_id, |
| 149 CreateResultReceiver(&error)); |
| 150 base::RunLoop().RunUntilIdle(); |
| 151 return error; |
| 152 } |
| 153 |
| 154 int CountParents(const std::string& file_id) { |
| 155 scoped_ptr<google_apis::ResourceEntry> entry; |
| 156 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 157 fake_drive_helper_->GetResourceEntry(file_id, &entry)); |
| 158 int count = 0; |
| 159 const ScopedVector<google_apis::Link>& links = entry->links(); |
| 160 for (ScopedVector<google_apis::Link>::const_iterator itr = links.begin(); |
| 161 itr != links.end(); ++itr) { |
| 162 if ((*itr)->type() == google_apis::Link::LINK_PARENT) |
| 163 ++count; |
| 164 } |
| 165 return count; |
| 166 } |
| 167 |
143 SyncStatusCode RunSyncer() { | 168 SyncStatusCode RunSyncer() { |
144 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 169 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
145 scoped_ptr<RemoteToLocalSyncer> syncer(new RemoteToLocalSyncer(this)); | 170 scoped_ptr<RemoteToLocalSyncer> syncer(new RemoteToLocalSyncer(this)); |
146 syncer->Run(CreateResultReceiver(&status)); | 171 syncer->Run(CreateResultReceiver(&status)); |
147 base::RunLoop().RunUntilIdle(); | 172 base::RunLoop().RunUntilIdle(); |
148 return status; | 173 return status; |
149 } | 174 } |
150 | 175 |
151 void RunSyncerUntilIdle() { | 176 void RunSyncerUntilIdle() { |
152 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 177 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
288 ScopedVector<google_apis::ResourceEntry> entries = | 313 ScopedVector<google_apis::ResourceEntry> entries = |
289 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 314 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
290 ASSERT_EQ(4u, entries.size()); | 315 ASSERT_EQ(4u, entries.size()); |
291 | 316 |
292 // Only primary file should survive. | 317 // Only primary file should survive. |
293 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 318 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
294 VerifyConflictResolution(app_root, kTitle, primary, | 319 VerifyConflictResolution(app_root, kTitle, primary, |
295 google_apis::ENTRY_KIND_FOLDER); | 320 google_apis::ENTRY_KIND_FOLDER); |
296 } | 321 } |
297 | 322 |
298 // TODO(nhiroki): Add multi-parent resolution cases. | 323 TEST_F(ConflictResolverTest, ResolveMultiParents_File) { |
| 324 const GURL kOrigin("chrome-extension://example"); |
| 325 const std::string sync_root = CreateSyncRoot(); |
| 326 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 327 InitializeMetadataDatabase(); |
| 328 RegisterApp(kOrigin.host(), app_root); |
| 329 RunSyncerUntilIdle(); |
| 330 |
| 331 const std::string primary = CreateRemoteFolder(app_root, "primary"); |
| 332 const std::string file = CreateRemoteFile(primary, "file", "data"); |
| 333 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 334 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary1"), file)); |
| 335 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 336 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary2"), file)); |
| 337 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 338 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary3"), file)); |
| 339 |
| 340 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 341 RunSyncerUntilIdle(); |
| 342 |
| 343 EXPECT_EQ(4, CountParents(file)); |
| 344 |
| 345 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 346 |
| 347 EXPECT_EQ(1, CountParents(file)); |
| 348 } |
| 349 |
| 350 TEST_F(ConflictResolverTest, ResolveMultiParents_Folder) { |
| 351 const GURL kOrigin("chrome-extension://example"); |
| 352 const std::string sync_root = CreateSyncRoot(); |
| 353 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 354 InitializeMetadataDatabase(); |
| 355 RegisterApp(kOrigin.host(), app_root); |
| 356 RunSyncerUntilIdle(); |
| 357 |
| 358 const std::string primary = CreateRemoteFolder(app_root, "primary"); |
| 359 const std::string file = CreateRemoteFolder(primary, "folder"); |
| 360 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 361 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary1"), file)); |
| 362 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 363 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary2"), file)); |
| 364 ASSERT_EQ(google_apis::HTTP_SUCCESS, |
| 365 AddFileToFolder(CreateRemoteFolder(app_root, "nonprimary3"), file)); |
| 366 |
| 367 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 368 RunSyncerUntilIdle(); |
| 369 |
| 370 EXPECT_EQ(4, CountParents(file)); |
| 371 |
| 372 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 373 |
| 374 EXPECT_EQ(1, CountParents(file)); |
| 375 } |
299 | 376 |
300 } // namespace drive_backend | 377 } // namespace drive_backend |
301 } // namespace sync_file_system | 378 } // namespace sync_file_system |
OLD | NEW |