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/local_to_remote_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.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 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 if (retry_count++ > kRetryLimit) | 203 if (retry_count++ > kRetryLimit) |
204 break; | 204 break; |
205 status = RunRemoteToLocalSyncer(); | 205 status = RunRemoteToLocalSyncer(); |
206 } while (status == SYNC_STATUS_OK || | 206 } while (status == SYNC_STATUS_OK || |
207 status == SYNC_STATUS_RETRY || | 207 status == SYNC_STATUS_RETRY || |
208 GetMetadataDatabase()->PromoteDemotedTrackers()); | 208 GetMetadataDatabase()->PromoteDemotedTrackers()); |
209 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, status); | 209 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, status); |
210 return status; | 210 return status; |
211 } | 211 } |
212 | 212 |
213 ScopedVector<google_apis::FileResource> | 213 std::vector<std::unique_ptr<google_apis::FileResource>> |
214 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, | 214 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, |
215 const std::string& title) { | 215 const std::string& title) { |
216 ScopedVector<google_apis::FileResource> entries; | 216 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
217 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 217 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
218 fake_drive_helper_->SearchByTitle( | 218 fake_drive_helper_->SearchByTitle( |
219 parent_folder_id, title, &entries)); | 219 parent_folder_id, title, &entries)); |
220 return entries; | 220 return entries; |
221 } | 221 } |
222 | 222 |
223 std::string GetFileIDForParentAndTitle(const std::string& parent_folder_id, | 223 std::string GetFileIDForParentAndTitle(const std::string& parent_folder_id, |
224 const std::string& title) { | 224 const std::string& title) { |
225 ScopedVector<google_apis::FileResource> entries = | 225 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
226 GetResourceEntriesForParentAndTitle(parent_folder_id, title); | 226 GetResourceEntriesForParentAndTitle(parent_folder_id, title); |
227 if (entries.size() != 1) | 227 if (entries.size() != 1) |
228 return std::string(); | 228 return std::string(); |
229 return entries[0]->file_id(); | 229 return entries[0]->file_id(); |
230 } | 230 } |
231 | 231 |
232 void VerifyTitleUniqueness( | 232 void VerifyTitleUniqueness( |
233 const std::string& parent_folder_id, | 233 const std::string& parent_folder_id, |
234 const std::string& title, | 234 const std::string& title, |
235 test_util::FileResourceKind kind) { | 235 test_util::FileResourceKind kind) { |
236 ScopedVector<google_apis::FileResource> entries; | 236 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
237 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 237 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
238 fake_drive_helper_->SearchByTitle( | 238 fake_drive_helper_->SearchByTitle( |
239 parent_folder_id, title, &entries)); | 239 parent_folder_id, title, &entries)); |
240 ASSERT_EQ(1u, entries.size()); | 240 ASSERT_EQ(1u, entries.size()); |
241 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); | 241 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); |
242 } | 242 } |
243 | 243 |
244 void VerifyFileDeletion(const std::string& parent_folder_id, | 244 void VerifyFileDeletion(const std::string& parent_folder_id, |
245 const std::string& title) { | 245 const std::string& title) { |
246 ScopedVector<google_apis::FileResource> entries; | 246 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
247 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 247 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
248 fake_drive_helper_->SearchByTitle( | 248 fake_drive_helper_->SearchByTitle( |
249 parent_folder_id, title, &entries)); | 249 parent_folder_id, title, &entries)); |
250 EXPECT_TRUE(entries.empty()); | 250 EXPECT_TRUE(entries.empty()); |
251 } | 251 } |
252 | 252 |
253 private: | 253 private: |
254 content::TestBrowserThreadBundle thread_bundle_; | 254 content::TestBrowserThreadBundle thread_bundle_; |
255 base::ScopedTempDir database_dir_; | 255 base::ScopedTempDir database_dir_; |
256 std::unique_ptr<leveldb::Env> in_memory_env_; | 256 std::unique_ptr<leveldb::Env> in_memory_env_; |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
370 RegisterApp(kOrigin.host(), app_root); | 370 RegisterApp(kOrigin.host(), app_root); |
371 | 371 |
372 CreateRemoteFolder(app_root, "foo"); | 372 CreateRemoteFolder(app_root, "foo"); |
373 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 373 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
374 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 374 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
375 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 375 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
376 SYNC_FILE_TYPE_FILE), | 376 SYNC_FILE_TYPE_FILE), |
377 URL(kOrigin, "foo"))); | 377 URL(kOrigin, "foo"))); |
378 | 378 |
379 // There should exist both file and folder on remote. | 379 // There should exist both file and folder on remote. |
380 ScopedVector<google_apis::FileResource> entries = | 380 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
381 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 381 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
382 ASSERT_EQ(2u, entries.size()); | 382 ASSERT_EQ(2u, entries.size()); |
383 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 383 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
384 test_util::GetFileResourceKind(*entries[0])); | 384 test_util::GetFileResourceKind(*entries[0])); |
385 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 385 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
386 test_util::GetFileResourceKind(*entries[1])); | 386 test_util::GetFileResourceKind(*entries[1])); |
387 } | 387 } |
388 | 388 |
389 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFile) { | 389 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFile) { |
390 const GURL kOrigin("chrome-extension://example"); | 390 const GURL kOrigin("chrome-extension://example"); |
391 const std::string sync_root = CreateSyncRoot(); | 391 const std::string sync_root = CreateSyncRoot(); |
392 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 392 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
393 InitializeMetadataDatabase(); | 393 InitializeMetadataDatabase(); |
394 RegisterApp(kOrigin.host(), app_root); | 394 RegisterApp(kOrigin.host(), app_root); |
395 | 395 |
396 CreateRemoteFile(app_root, "foo", "data"); | 396 CreateRemoteFile(app_root, "foo", "data"); |
397 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 397 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
398 | 398 |
399 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 399 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
400 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 400 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
401 SYNC_FILE_TYPE_DIRECTORY), | 401 SYNC_FILE_TYPE_DIRECTORY), |
402 URL(kOrigin, "foo"))); | 402 URL(kOrigin, "foo"))); |
403 | 403 |
404 // There should exist both file and folder on remote. | 404 // There should exist both file and folder on remote. |
405 ScopedVector<google_apis::FileResource> entries = | 405 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
406 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 406 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
407 ASSERT_EQ(2u, entries.size()); | 407 ASSERT_EQ(2u, entries.size()); |
408 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 408 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
409 test_util::GetFileResourceKind(*entries[0])); | 409 test_util::GetFileResourceKind(*entries[0])); |
410 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 410 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
411 test_util::GetFileResourceKind(*entries[1])); | 411 test_util::GetFileResourceKind(*entries[1])); |
412 } | 412 } |
413 | 413 |
414 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFileOnFile) { | 414 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFileOnFile) { |
415 const GURL kOrigin("chrome-extension://example"); | 415 const GURL kOrigin("chrome-extension://example"); |
416 const std::string sync_root = CreateSyncRoot(); | 416 const std::string sync_root = CreateSyncRoot(); |
417 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 417 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
418 InitializeMetadataDatabase(); | 418 InitializeMetadataDatabase(); |
419 RegisterApp(kOrigin.host(), app_root); | 419 RegisterApp(kOrigin.host(), app_root); |
420 | 420 |
421 CreateRemoteFile(app_root, "foo", "data"); | 421 CreateRemoteFile(app_root, "foo", "data"); |
422 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 422 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
423 | 423 |
424 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 424 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
425 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 425 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
426 SYNC_FILE_TYPE_FILE), | 426 SYNC_FILE_TYPE_FILE), |
427 URL(kOrigin, "foo"))); | 427 URL(kOrigin, "foo"))); |
428 | 428 |
429 // There should exist both files on remote. | 429 // There should exist both files on remote. |
430 ScopedVector<google_apis::FileResource> entries = | 430 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
431 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 431 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
432 ASSERT_EQ(2u, entries.size()); | 432 ASSERT_EQ(2u, entries.size()); |
433 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 433 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
434 test_util::GetFileResourceKind(*entries[0])); | 434 test_util::GetFileResourceKind(*entries[0])); |
435 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 435 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
436 test_util::GetFileResourceKind(*entries[1])); | 436 test_util::GetFileResourceKind(*entries[1])); |
437 } | 437 } |
438 | 438 |
439 TEST_F(LocalToRemoteSyncerTest, Conflict_UpdateDeleteOnFile) { | 439 TEST_F(LocalToRemoteSyncerTest, Conflict_UpdateDeleteOnFile) { |
440 const GURL kOrigin("chrome-extension://example"); | 440 const GURL kOrigin("chrome-extension://example"); |
(...skipping 11 matching lines...) Expand all Loading... |
452 | 452 |
453 EXPECT_EQ(SYNC_STATUS_FILE_BUSY, RunLocalToRemoteSyncer( | 453 EXPECT_EQ(SYNC_STATUS_FILE_BUSY, RunLocalToRemoteSyncer( |
454 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 454 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
455 SYNC_FILE_TYPE_FILE), | 455 SYNC_FILE_TYPE_FILE), |
456 URL(kOrigin, "foo"))); | 456 URL(kOrigin, "foo"))); |
457 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 457 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
458 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 458 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
459 SYNC_FILE_TYPE_FILE), | 459 SYNC_FILE_TYPE_FILE), |
460 URL(kOrigin, "foo"))); | 460 URL(kOrigin, "foo"))); |
461 | 461 |
462 ScopedVector<google_apis::FileResource> entries = | 462 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
463 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 463 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
464 ASSERT_EQ(1u, entries.size()); | 464 ASSERT_EQ(1u, entries.size()); |
465 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 465 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
466 test_util::GetFileResourceKind(*entries[0])); | 466 test_util::GetFileResourceKind(*entries[0])); |
467 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 467 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
468 EXPECT_NE(file_id, entries[0]->file_id()); | 468 EXPECT_NE(file_id, entries[0]->file_id()); |
469 } | 469 } |
470 | 470 |
471 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateDeleteOnFile) { | 471 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateDeleteOnFile) { |
472 const GURL kOrigin("chrome-extension://example"); | 472 const GURL kOrigin("chrome-extension://example"); |
473 const std::string sync_root = CreateSyncRoot(); | 473 const std::string sync_root = CreateSyncRoot(); |
474 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 474 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
475 InitializeMetadataDatabase(); | 475 InitializeMetadataDatabase(); |
476 RegisterApp(kOrigin.host(), app_root); | 476 RegisterApp(kOrigin.host(), app_root); |
477 | 477 |
478 const std::string file_id = CreateRemoteFile(app_root, "foo", "data"); | 478 const std::string file_id = CreateRemoteFile(app_root, "foo", "data"); |
479 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 479 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
480 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, | 480 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, |
481 RunRemoteToLocalSyncerUntilIdle()); | 481 RunRemoteToLocalSyncerUntilIdle()); |
482 | 482 |
483 DeleteResource(file_id); | 483 DeleteResource(file_id); |
484 | 484 |
485 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 485 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
486 | 486 |
487 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 487 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
488 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 488 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
489 SYNC_FILE_TYPE_FILE), | 489 SYNC_FILE_TYPE_FILE), |
490 URL(kOrigin, "foo"))); | 490 URL(kOrigin, "foo"))); |
491 | 491 |
492 ScopedVector<google_apis::FileResource> entries = | 492 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
493 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 493 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
494 ASSERT_EQ(1u, entries.size()); | 494 ASSERT_EQ(1u, entries.size()); |
495 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 495 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
496 test_util::GetFileResourceKind(*entries[0])); | 496 test_util::GetFileResourceKind(*entries[0])); |
497 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 497 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
498 EXPECT_NE(file_id, entries[0]->file_id()); | 498 EXPECT_NE(file_id, entries[0]->file_id()); |
499 } | 499 } |
500 | 500 |
501 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFolder) { | 501 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFolder) { |
502 const GURL kOrigin("chrome-extension://example"); | 502 const GURL kOrigin("chrome-extension://example"); |
503 const std::string sync_root = CreateSyncRoot(); | 503 const std::string sync_root = CreateSyncRoot(); |
504 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 504 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
505 InitializeMetadataDatabase(); | 505 InitializeMetadataDatabase(); |
506 RegisterApp(kOrigin.host(), app_root); | 506 RegisterApp(kOrigin.host(), app_root); |
507 | 507 |
508 const std::string folder_id = CreateRemoteFolder(app_root, "foo"); | 508 const std::string folder_id = CreateRemoteFolder(app_root, "foo"); |
509 | 509 |
510 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 510 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
511 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 511 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
512 SYNC_FILE_TYPE_DIRECTORY), | 512 SYNC_FILE_TYPE_DIRECTORY), |
513 URL(kOrigin, "foo"))); | 513 URL(kOrigin, "foo"))); |
514 | 514 |
515 ScopedVector<google_apis::FileResource> entries = | 515 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
516 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 516 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
517 ASSERT_EQ(2u, entries.size()); | 517 ASSERT_EQ(2u, entries.size()); |
518 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 518 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
519 test_util::GetFileResourceKind(*entries[0])); | 519 test_util::GetFileResourceKind(*entries[0])); |
520 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 520 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
521 test_util::GetFileResourceKind(*entries[1])); | 521 test_util::GetFileResourceKind(*entries[1])); |
522 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 522 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
523 EXPECT_TRUE(!entries[1]->labels().is_trashed()); | 523 EXPECT_TRUE(!entries[1]->labels().is_trashed()); |
524 EXPECT_TRUE(folder_id == entries[0]->file_id() || | 524 EXPECT_TRUE(folder_id == entries[0]->file_id() || |
525 folder_id == entries[1]->file_id()); | 525 folder_id == entries[1]->file_id()); |
(...skipping 20 matching lines...) Expand all Loading... |
546 EXPECT_EQ(SYNC_STATUS_UNKNOWN_ORIGIN, RunLocalToRemoteSyncer( | 546 EXPECT_EQ(SYNC_STATUS_UNKNOWN_ORIGIN, RunLocalToRemoteSyncer( |
547 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 547 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
548 SYNC_FILE_TYPE_DIRECTORY), | 548 SYNC_FILE_TYPE_DIRECTORY), |
549 URL(kOrigin, "foo"))); | 549 URL(kOrigin, "foo"))); |
550 | 550 |
551 // SyncEngine will re-register the app and resurrect the app root later. | 551 // SyncEngine will re-register the app and resurrect the app root later. |
552 } | 552 } |
553 | 553 |
554 } // namespace drive_backend | 554 } // namespace drive_backend |
555 } // namespace sync_file_system | 555 } // namespace sync_file_system |
OLD | NEW |