| 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 <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 SyncStatusCode ListChanges() { | 230 SyncStatusCode ListChanges() { |
| 231 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 231 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 232 sync_task_manager_->ScheduleSyncTask( | 232 sync_task_manager_->ScheduleSyncTask( |
| 233 FROM_HERE, | 233 FROM_HERE, |
| 234 std::unique_ptr<SyncTask>(new ListChangesTask(context_.get())), | 234 std::unique_ptr<SyncTask>(new ListChangesTask(context_.get())), |
| 235 SyncTaskManager::PRIORITY_MED, CreateResultReceiver(&status)); | 235 SyncTaskManager::PRIORITY_MED, CreateResultReceiver(&status)); |
| 236 base::RunLoop().RunUntilIdle(); | 236 base::RunLoop().RunUntilIdle(); |
| 237 return status; | 237 return status; |
| 238 } | 238 } |
| 239 | 239 |
| 240 ScopedVector<google_apis::FileResource> | 240 std::vector<std::unique_ptr<google_apis::FileResource>> |
| 241 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, | 241 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, |
| 242 const std::string& title) { | 242 const std::string& title) { |
| 243 ScopedVector<google_apis::FileResource> entries; | 243 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
| 244 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 244 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 245 fake_drive_helper_->SearchByTitle( | 245 fake_drive_helper_->SearchByTitle( |
| 246 parent_folder_id, title, &entries)); | 246 parent_folder_id, title, &entries)); |
| 247 return entries; | 247 return entries; |
| 248 } | 248 } |
| 249 | 249 |
| 250 void VerifyConflictResolution( | 250 void VerifyConflictResolution( |
| 251 const std::string& parent_folder_id, | 251 const std::string& parent_folder_id, |
| 252 const std::string& title, | 252 const std::string& title, |
| 253 const std::string& primary_file_id, | 253 const std::string& primary_file_id, |
| 254 test_util::FileResourceKind kind) { | 254 test_util::FileResourceKind kind) { |
| 255 ScopedVector<google_apis::FileResource> entries; | 255 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
| 256 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 256 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 257 fake_drive_helper_->SearchByTitle( | 257 fake_drive_helper_->SearchByTitle( |
| 258 parent_folder_id, title, &entries)); | 258 parent_folder_id, title, &entries)); |
| 259 ASSERT_EQ(1u, entries.size()); | 259 ASSERT_EQ(1u, entries.size()); |
| 260 EXPECT_EQ(primary_file_id, entries[0]->file_id()); | 260 EXPECT_EQ(primary_file_id, entries[0]->file_id()); |
| 261 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); | 261 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); |
| 262 } | 262 } |
| 263 | 263 |
| 264 void VerifyLocalChangeConsistency( | 264 void VerifyLocalChangeConsistency( |
| 265 const URLToFileChangesMap& expected_changes) { | 265 const URLToFileChangesMap& expected_changes) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 RunRemoteToLocalSyncerUntilIdle(); | 300 RunRemoteToLocalSyncerUntilIdle(); |
| 301 | 301 |
| 302 const std::string kTitle = "foo"; | 302 const std::string kTitle = "foo"; |
| 303 const std::string primary = CreateRemoteFile(app_root, kTitle, "data1"); | 303 const std::string primary = CreateRemoteFile(app_root, kTitle, "data1"); |
| 304 CreateRemoteFile(app_root, kTitle, "data2"); | 304 CreateRemoteFile(app_root, kTitle, "data2"); |
| 305 CreateRemoteFile(app_root, kTitle, "data3"); | 305 CreateRemoteFile(app_root, kTitle, "data3"); |
| 306 CreateRemoteFile(app_root, kTitle, "data4"); | 306 CreateRemoteFile(app_root, kTitle, "data4"); |
| 307 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 307 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 308 RunRemoteToLocalSyncerUntilIdle(); | 308 RunRemoteToLocalSyncerUntilIdle(); |
| 309 | 309 |
| 310 ScopedVector<google_apis::FileResource> entries = | 310 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 311 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 311 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
| 312 ASSERT_EQ(4u, entries.size()); | 312 ASSERT_EQ(4u, entries.size()); |
| 313 | 313 |
| 314 // Only primary file should survive. | 314 // Only primary file should survive. |
| 315 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 315 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 316 VerifyConflictResolution(app_root, kTitle, primary, | 316 VerifyConflictResolution(app_root, kTitle, primary, |
| 317 test_util::RESOURCE_KIND_FILE); | 317 test_util::RESOURCE_KIND_FILE); |
| 318 } | 318 } |
| 319 | 319 |
| 320 TEST_F(ConflictResolverTest, ResolveConflict_Folders) { | 320 TEST_F(ConflictResolverTest, ResolveConflict_Folders) { |
| 321 const GURL kOrigin("chrome-extension://example"); | 321 const GURL kOrigin("chrome-extension://example"); |
| 322 const std::string sync_root = CreateSyncRoot(); | 322 const std::string sync_root = CreateSyncRoot(); |
| 323 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 323 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 324 InitializeMetadataDatabase(); | 324 InitializeMetadataDatabase(); |
| 325 RegisterApp(kOrigin.host(), app_root); | 325 RegisterApp(kOrigin.host(), app_root); |
| 326 RunRemoteToLocalSyncerUntilIdle(); | 326 RunRemoteToLocalSyncerUntilIdle(); |
| 327 | 327 |
| 328 const std::string kTitle = "foo"; | 328 const std::string kTitle = "foo"; |
| 329 const std::string primary = CreateRemoteFolder(app_root, kTitle); | 329 const std::string primary = CreateRemoteFolder(app_root, kTitle); |
| 330 CreateRemoteFolder(app_root, kTitle); | 330 CreateRemoteFolder(app_root, kTitle); |
| 331 CreateRemoteFolder(app_root, kTitle); | 331 CreateRemoteFolder(app_root, kTitle); |
| 332 CreateRemoteFolder(app_root, kTitle); | 332 CreateRemoteFolder(app_root, kTitle); |
| 333 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 333 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 334 RunRemoteToLocalSyncerUntilIdle(); | 334 RunRemoteToLocalSyncerUntilIdle(); |
| 335 | 335 |
| 336 ScopedVector<google_apis::FileResource> entries = | 336 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 337 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 337 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
| 338 ASSERT_EQ(4u, entries.size()); | 338 ASSERT_EQ(4u, entries.size()); |
| 339 | 339 |
| 340 // Only primary file should survive. | 340 // Only primary file should survive. |
| 341 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 341 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 342 VerifyConflictResolution(app_root, kTitle, primary, | 342 VerifyConflictResolution(app_root, kTitle, primary, |
| 343 test_util::RESOURCE_KIND_FOLDER); | 343 test_util::RESOURCE_KIND_FOLDER); |
| 344 } | 344 } |
| 345 | 345 |
| 346 TEST_F(ConflictResolverTest, ResolveConflict_FilesAndFolders) { | 346 TEST_F(ConflictResolverTest, ResolveConflict_FilesAndFolders) { |
| 347 const GURL kOrigin("chrome-extension://example"); | 347 const GURL kOrigin("chrome-extension://example"); |
| 348 const std::string sync_root = CreateSyncRoot(); | 348 const std::string sync_root = CreateSyncRoot(); |
| 349 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 349 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 350 InitializeMetadataDatabase(); | 350 InitializeMetadataDatabase(); |
| 351 RegisterApp(kOrigin.host(), app_root); | 351 RegisterApp(kOrigin.host(), app_root); |
| 352 RunRemoteToLocalSyncerUntilIdle(); | 352 RunRemoteToLocalSyncerUntilIdle(); |
| 353 | 353 |
| 354 const std::string kTitle = "foo"; | 354 const std::string kTitle = "foo"; |
| 355 CreateRemoteFile(app_root, kTitle, "data"); | 355 CreateRemoteFile(app_root, kTitle, "data"); |
| 356 const std::string primary = CreateRemoteFolder(app_root, kTitle); | 356 const std::string primary = CreateRemoteFolder(app_root, kTitle); |
| 357 CreateRemoteFile(app_root, kTitle, "data2"); | 357 CreateRemoteFile(app_root, kTitle, "data2"); |
| 358 CreateRemoteFolder(app_root, kTitle); | 358 CreateRemoteFolder(app_root, kTitle); |
| 359 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 359 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 360 RunRemoteToLocalSyncerUntilIdle(); | 360 RunRemoteToLocalSyncerUntilIdle(); |
| 361 | 361 |
| 362 ScopedVector<google_apis::FileResource> entries = | 362 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 363 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 363 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
| 364 ASSERT_EQ(4u, entries.size()); | 364 ASSERT_EQ(4u, entries.size()); |
| 365 | 365 |
| 366 // Only primary file should survive. | 366 // Only primary file should survive. |
| 367 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 367 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 368 VerifyConflictResolution(app_root, kTitle, primary, | 368 VerifyConflictResolution(app_root, kTitle, primary, |
| 369 test_util::RESOURCE_KIND_FOLDER); | 369 test_util::RESOURCE_KIND_FOLDER); |
| 370 } | 370 } |
| 371 | 371 |
| 372 TEST_F(ConflictResolverTest, ResolveConflict_RemoteFolderOnLocalFile) { | 372 TEST_F(ConflictResolverTest, ResolveConflict_RemoteFolderOnLocalFile) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 384 CreateLocalFile(kURL); | 384 CreateLocalFile(kURL); |
| 385 RunLocalToRemoteSyncer( | 385 RunLocalToRemoteSyncer( |
| 386 kURL, | 386 kURL, |
| 387 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE)); | 387 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE)); |
| 388 | 388 |
| 389 // Create a folder on remote and sync it. | 389 // Create a folder on remote and sync it. |
| 390 const std::string primary = CreateRemoteFolder(app_root, kTitle); | 390 const std::string primary = CreateRemoteFolder(app_root, kTitle); |
| 391 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 391 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 392 RunRemoteToLocalSyncerUntilIdle(); | 392 RunRemoteToLocalSyncerUntilIdle(); |
| 393 | 393 |
| 394 ScopedVector<google_apis::FileResource> entries = | 394 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 395 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 395 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
| 396 ASSERT_EQ(2u, entries.size()); | 396 ASSERT_EQ(2u, entries.size()); |
| 397 | 397 |
| 398 // Run conflict resolver. Only primary file should survive. | 398 // Run conflict resolver. Only primary file should survive. |
| 399 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 399 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 400 VerifyConflictResolution(app_root, kTitle, primary, | 400 VerifyConflictResolution(app_root, kTitle, primary, |
| 401 test_util::RESOURCE_KIND_FOLDER); | 401 test_util::RESOURCE_KIND_FOLDER); |
| 402 | 402 |
| 403 // Continue to run remote-to-local sync. | 403 // Continue to run remote-to-local sync. |
| 404 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 404 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 432 RunLocalToRemoteSyncer( | 432 RunLocalToRemoteSyncer( |
| 433 kURL, | 433 kURL, |
| 434 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE)); | 434 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, SYNC_FILE_TYPE_FILE)); |
| 435 | 435 |
| 436 // Create a folder and subfolder in it on remote, and sync it. | 436 // Create a folder and subfolder in it on remote, and sync it. |
| 437 const std::string primary = CreateRemoteFolder(app_root, kTitle); | 437 const std::string primary = CreateRemoteFolder(app_root, kTitle); |
| 438 CreateRemoteFolder(primary, "nested"); | 438 CreateRemoteFolder(primary, "nested"); |
| 439 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 439 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 440 RunRemoteToLocalSyncerUntilIdle(); | 440 RunRemoteToLocalSyncerUntilIdle(); |
| 441 | 441 |
| 442 ScopedVector<google_apis::FileResource> entries = | 442 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 443 GetResourceEntriesForParentAndTitle(app_root, kTitle); | 443 GetResourceEntriesForParentAndTitle(app_root, kTitle); |
| 444 ASSERT_EQ(2u, entries.size()); | 444 ASSERT_EQ(2u, entries.size()); |
| 445 | 445 |
| 446 // Run conflict resolver. Only primary file should survive. | 446 // Run conflict resolver. Only primary file should survive. |
| 447 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 447 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 448 VerifyConflictResolution(app_root, kTitle, primary, | 448 VerifyConflictResolution(app_root, kTitle, primary, |
| 449 test_util::RESOURCE_KIND_FOLDER); | 449 test_util::RESOURCE_KIND_FOLDER); |
| 450 | 450 |
| 451 // Continue to run remote-to-local sync. | 451 // Continue to run remote-to-local sync. |
| 452 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 452 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 | 516 |
| 517 EXPECT_EQ(4, CountParents(file)); | 517 EXPECT_EQ(4, CountParents(file)); |
| 518 | 518 |
| 519 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); | 519 EXPECT_EQ(SYNC_STATUS_OK, RunConflictResolver()); |
| 520 | 520 |
| 521 EXPECT_EQ(1, CountParents(file)); | 521 EXPECT_EQ(1, CountParents(file)); |
| 522 } | 522 } |
| 523 | 523 |
| 524 } // namespace drive_backend | 524 } // namespace drive_backend |
| 525 } // namespace sync_file_system | 525 } // namespace sync_file_system |
| OLD | NEW |