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/metadata_database.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/files/scoped_temp_dir.h" | 8 #include "base/files/scoped_temp_dir.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 } | 384 } |
385 | 385 |
386 TrackedFile CreateTrackedFolder(const TrackedFile& parent, | 386 TrackedFile CreateTrackedFolder(const TrackedFile& parent, |
387 const std::string& title) { | 387 const std::string& title) { |
388 TrackedFile folder; | 388 TrackedFile folder; |
389 folder.metadata = CreateFolderMetadata(parent.metadata, title); | 389 folder.metadata = CreateFolderMetadata(parent.metadata, title); |
390 folder.tracker = CreateTracker(parent.tracker, folder.metadata); | 390 folder.tracker = CreateTracker(parent.tracker, folder.metadata); |
391 return folder; | 391 return folder; |
392 } | 392 } |
393 | 393 |
394 scoped_ptr<google_apis::ChangeResource> CreateChangeResourceFromMetadata( | 394 scoped_ptr<google_apis::FileResource> CreateFileResourceFromMetadata( |
395 const FileMetadata& file) { | 395 const FileMetadata& file) { |
396 scoped_ptr<google_apis::ChangeResource> change( | |
397 new google_apis::ChangeResource); | |
398 change->set_change_id(file.details().change_id()); | |
399 change->set_file_id(file.file_id()); | |
400 change->set_deleted(file.details().deleted()); | |
401 if (change->is_deleted()) | |
402 return change.Pass(); | |
403 | |
404 scoped_ptr<google_apis::FileResource> file_resource( | 396 scoped_ptr<google_apis::FileResource> file_resource( |
405 new google_apis::FileResource); | 397 new google_apis::FileResource); |
406 ScopedVector<google_apis::ParentReference> parents; | 398 ScopedVector<google_apis::ParentReference> parents; |
407 for (int i = 0; i < file.details().parent_folder_ids_size(); ++i) { | 399 for (int i = 0; i < file.details().parent_folder_ids_size(); ++i) { |
408 scoped_ptr<google_apis::ParentReference> parent( | 400 scoped_ptr<google_apis::ParentReference> parent( |
409 new google_apis::ParentReference); | 401 new google_apis::ParentReference); |
410 parent->set_file_id(file.details().parent_folder_ids(i)); | 402 parent->set_file_id(file.details().parent_folder_ids(i)); |
411 parents.push_back(parent.release()); | 403 parents.push_back(parent.release()); |
412 } | 404 } |
413 | 405 |
414 file_resource->set_file_id(file.file_id()); | 406 file_resource->set_file_id(file.file_id()); |
415 file_resource->set_parents(&parents); | 407 file_resource->set_parents(&parents); |
416 file_resource->set_title(file.details().title()); | 408 file_resource->set_title(file.details().title()); |
417 if (file.details().file_kind() == FILE_KIND_FOLDER) | 409 if (file.details().file_kind() == FILE_KIND_FOLDER) |
418 file_resource->set_mime_type("application/vnd.google-apps.folder"); | 410 file_resource->set_mime_type("application/vnd.google-apps.folder"); |
419 else if (file.details().file_kind() == FILE_KIND_FILE) | 411 else if (file.details().file_kind() == FILE_KIND_FILE) |
420 file_resource->set_mime_type("text/plain"); | 412 file_resource->set_mime_type("text/plain"); |
421 else | 413 else |
422 file_resource->set_mime_type("application/vnd.google-apps.document"); | 414 file_resource->set_mime_type("application/vnd.google-apps.document"); |
423 file_resource->set_md5_checksum(file.details().md5()); | 415 file_resource->set_md5_checksum(file.details().md5()); |
424 file_resource->set_etag(file.details().etag()); | 416 file_resource->set_etag(file.details().etag()); |
425 file_resource->set_created_date(base::Time::FromInternalValue( | 417 file_resource->set_created_date(base::Time::FromInternalValue( |
426 file.details().creation_time())); | 418 file.details().creation_time())); |
427 file_resource->set_modified_date(base::Time::FromInternalValue( | 419 file_resource->set_modified_date(base::Time::FromInternalValue( |
428 file.details().modification_time())); | 420 file.details().modification_time())); |
429 | 421 |
430 change->set_file(file_resource.Pass()); | 422 return file_resource.Pass(); |
| 423 } |
| 424 |
| 425 scoped_ptr<google_apis::ChangeResource> CreateChangeResourceFromMetadata( |
| 426 const FileMetadata& file) { |
| 427 scoped_ptr<google_apis::ChangeResource> change( |
| 428 new google_apis::ChangeResource); |
| 429 change->set_change_id(file.details().change_id()); |
| 430 change->set_file_id(file.file_id()); |
| 431 change->set_deleted(file.details().deleted()); |
| 432 if (change->is_deleted()) |
| 433 return change.Pass(); |
| 434 |
| 435 change->set_file(CreateFileResourceFromMetadata(file)); |
431 return change.Pass(); | 436 return change.Pass(); |
432 } | 437 } |
433 | 438 |
434 void ApplyRenameChangeToMetadata(const std::string& new_title, | 439 void ApplyRenameChangeToMetadata(const std::string& new_title, |
435 FileMetadata* file) { | 440 FileMetadata* file) { |
436 FileDetails* details = file->mutable_details(); | 441 FileDetails* details = file->mutable_details(); |
437 details->set_title(new_title); | 442 details->set_title(new_title); |
438 details->set_change_id(next_change_id_++); | 443 details->set_change_id(next_change_id_++); |
439 } | 444 } |
440 | 445 |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
598 | 603 |
599 SyncStatusCode UpdateTracker(const FileTracker& tracker) { | 604 SyncStatusCode UpdateTracker(const FileTracker& tracker) { |
600 SyncStatusCode status = SYNC_STATUS_UNKNOWN; | 605 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
601 metadata_database_->UpdateTracker( | 606 metadata_database_->UpdateTracker( |
602 tracker.tracker_id(), tracker.synced_details(), | 607 tracker.tracker_id(), tracker.synced_details(), |
603 base::Bind(&SyncStatusResultCallback, &status)); | 608 base::Bind(&SyncStatusResultCallback, &status)); |
604 message_loop_.RunUntilIdle(); | 609 message_loop_.RunUntilIdle(); |
605 return status; | 610 return status; |
606 } | 611 } |
607 | 612 |
| 613 SyncStatusCode PopulateInitialData( |
| 614 int64 largest_change_id, |
| 615 const google_apis::FileResource& sync_root_folder, |
| 616 const ScopedVector<google_apis::FileResource>& app_root_folders) { |
| 617 SyncStatusCode status = SYNC_STATUS_UNKNOWN; |
| 618 metadata_database_->PopulateInitialData( |
| 619 largest_change_id, |
| 620 sync_root_folder, |
| 621 app_root_folders, |
| 622 base::Bind(&SyncStatusResultCallback, &status)); |
| 623 message_loop_.RunUntilIdle(); |
| 624 return status; |
| 625 } |
| 626 |
| 627 void ResetTrackerID(FileTracker* tracker) { |
| 628 tracker->set_tracker_id(GetTrackerIDByFileID(tracker->file_id())); |
| 629 } |
| 630 |
608 private: | 631 private: |
609 base::ScopedTempDir database_dir_; | 632 base::ScopedTempDir database_dir_; |
610 base::MessageLoop message_loop_; | 633 base::MessageLoop message_loop_; |
611 | 634 |
612 scoped_ptr<MetadataDatabase> metadata_database_; | 635 scoped_ptr<MetadataDatabase> metadata_database_; |
613 | 636 |
614 int64 next_change_id_; | 637 int64 next_change_id_; |
615 int64 next_tracker_id_; | 638 int64 next_tracker_id_; |
616 int64 next_file_id_number_; | 639 int64 next_file_id_number_; |
617 int64 next_md5_sequence_number_; | 640 int64 next_md5_sequence_number_; |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
795 CreateChangeResourceFromMetadata(new_file.metadata), &changes); | 818 CreateChangeResourceFromMetadata(new_file.metadata), &changes); |
796 EXPECT_EQ(SYNC_STATUS_OK, UpdateByChangeList(changes.Pass())); | 819 EXPECT_EQ(SYNC_STATUS_OK, UpdateByChangeList(changes.Pass())); |
797 | 820 |
798 renamed_file.tracker.set_dirty(true); | 821 renamed_file.tracker.set_dirty(true); |
799 reorganized_file.tracker.set_dirty(true); | 822 reorganized_file.tracker.set_dirty(true); |
800 updated_file.tracker.set_dirty(true); | 823 updated_file.tracker.set_dirty(true); |
801 noop_file.tracker.set_dirty(true); | 824 noop_file.tracker.set_dirty(true); |
802 new_file.tracker.clear_synced_details(); | 825 new_file.tracker.clear_synced_details(); |
803 new_file.tracker.set_active(false); | 826 new_file.tracker.set_active(false); |
804 new_file.tracker.set_dirty(true); | 827 new_file.tracker.set_dirty(true); |
805 new_file.tracker.set_tracker_id( | 828 ResetTrackerID(&new_file.tracker); |
806 GetTrackerIDByFileID(new_file.metadata.file_id())); | |
807 EXPECT_NE(0, new_file.tracker.tracker_id()); | 829 EXPECT_NE(0, new_file.tracker.tracker_id()); |
808 | 830 |
809 new_file.should_be_absent = false; | 831 new_file.should_be_absent = false; |
810 | 832 |
811 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); | 833 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
812 VerifyReloadConsistency(); | 834 VerifyReloadConsistency(); |
813 } | 835 } |
814 | 836 |
815 TEST_F(MetadataDatabaseTest, PopulateFolderTest_RegularFolder) { | 837 TEST_F(MetadataDatabaseTest, PopulateFolderTest_RegularFolder) { |
816 TrackedFile sync_root(CreateTrackedSyncRoot()); | 838 TrackedFile sync_root(CreateTrackedSyncRoot()); |
(...skipping 20 matching lines...) Expand all Loading... |
837 FileIDList listed_children; | 859 FileIDList listed_children; |
838 listed_children.push_back(known_file.metadata.file_id()); | 860 listed_children.push_back(known_file.metadata.file_id()); |
839 listed_children.push_back(new_file.metadata.file_id()); | 861 listed_children.push_back(new_file.metadata.file_id()); |
840 | 862 |
841 EXPECT_EQ(SYNC_STATUS_OK, | 863 EXPECT_EQ(SYNC_STATUS_OK, |
842 PopulateFolder(folder_to_populate.metadata.file_id(), | 864 PopulateFolder(folder_to_populate.metadata.file_id(), |
843 listed_children)); | 865 listed_children)); |
844 | 866 |
845 folder_to_populate.tracker.set_dirty(false); | 867 folder_to_populate.tracker.set_dirty(false); |
846 folder_to_populate.tracker.set_needs_folder_listing(false); | 868 folder_to_populate.tracker.set_needs_folder_listing(false); |
847 new_file.tracker.set_tracker_id( | 869 ResetTrackerID(&new_file.tracker); |
848 GetTrackerIDByFileID(new_file.metadata.file_id())); | |
849 new_file.tracker.set_dirty(true); | 870 new_file.tracker.set_dirty(true); |
850 new_file.tracker.set_active(false); | 871 new_file.tracker.set_active(false); |
851 new_file.tracker.clear_synced_details(); | 872 new_file.tracker.clear_synced_details(); |
852 new_file.should_be_absent = false; | 873 new_file.should_be_absent = false; |
853 new_file.tracker_only = true; | 874 new_file.tracker_only = true; |
854 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); | 875 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
855 VerifyReloadConsistency(); | 876 VerifyReloadConsistency(); |
856 } | 877 } |
857 | 878 |
858 TEST_F(MetadataDatabaseTest, PopulateFolderTest_InactiveFolder) { | 879 TEST_F(MetadataDatabaseTest, PopulateFolderTest_InactiveFolder) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
901 }; | 922 }; |
902 | 923 |
903 SetUpDatabaseByTrackedFiles(tracked_files, arraysize(tracked_files)); | 924 SetUpDatabaseByTrackedFiles(tracked_files, arraysize(tracked_files)); |
904 EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase()); | 925 EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase()); |
905 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); | 926 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
906 | 927 |
907 FileIDList disabled_app_children; | 928 FileIDList disabled_app_children; |
908 disabled_app_children.push_back(file.metadata.file_id()); | 929 disabled_app_children.push_back(file.metadata.file_id()); |
909 EXPECT_EQ(SYNC_STATUS_OK, PopulateFolder( | 930 EXPECT_EQ(SYNC_STATUS_OK, PopulateFolder( |
910 disabled_app_root.metadata.file_id(), disabled_app_children)); | 931 disabled_app_root.metadata.file_id(), disabled_app_children)); |
911 file.tracker.set_tracker_id(GetTrackerIDByFileID(file.metadata.file_id())); | 932 ResetTrackerID(&file.tracker); |
912 file.tracker.clear_synced_details(); | 933 file.tracker.clear_synced_details(); |
913 file.tracker.set_dirty(true); | 934 file.tracker.set_dirty(true); |
914 file.tracker.set_active(false); | 935 file.tracker.set_active(false); |
915 file.should_be_absent = false; | 936 file.should_be_absent = false; |
916 file.tracker_only = true; | 937 file.tracker_only = true; |
917 | 938 |
918 disabled_app_root.tracker.set_dirty(false); | 939 disabled_app_root.tracker.set_dirty(false); |
919 disabled_app_root.tracker.set_needs_folder_listing(false); | 940 disabled_app_root.tracker.set_needs_folder_listing(false); |
920 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); | 941 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
921 VerifyReloadConsistency(); | 942 VerifyReloadConsistency(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
965 new_conflict.metadata.details(); | 986 new_conflict.metadata.details(); |
966 new_conflict.tracker.set_dirty(false); | 987 new_conflict.tracker.set_dirty(false); |
967 new_conflict.tracker.set_active(true); | 988 new_conflict.tracker.set_active(true); |
968 file.tracker.set_dirty(true); | 989 file.tracker.set_dirty(true); |
969 file.tracker.set_active(false); | 990 file.tracker.set_active(false); |
970 EXPECT_EQ(SYNC_STATUS_OK, UpdateTracker(new_conflict.tracker)); | 991 EXPECT_EQ(SYNC_STATUS_OK, UpdateTracker(new_conflict.tracker)); |
971 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); | 992 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
972 VerifyReloadConsistency(); | 993 VerifyReloadConsistency(); |
973 } | 994 } |
974 | 995 |
| 996 TEST_F(MetadataDatabaseTest, PopulateInitialDataTest) { |
| 997 TrackedFile sync_root(CreateTrackedSyncRoot()); |
| 998 TrackedFile app_root(CreateTrackedFolder(sync_root, "app_root")); |
| 999 app_root.tracker.set_active(false); |
| 1000 |
| 1001 const TrackedFile* tracked_files[] = { |
| 1002 &sync_root, &app_root |
| 1003 }; |
| 1004 |
| 1005 int64 largest_change_id = 42; |
| 1006 scoped_ptr<google_apis::FileResource> sync_root_folder( |
| 1007 CreateFileResourceFromMetadata(sync_root.metadata)); |
| 1008 scoped_ptr<google_apis::FileResource> app_root_folder( |
| 1009 CreateFileResourceFromMetadata(app_root.metadata)); |
| 1010 |
| 1011 ScopedVector<google_apis::FileResource> app_root_folders; |
| 1012 app_root_folders.push_back(app_root_folder.release()); |
| 1013 |
| 1014 EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase()); |
| 1015 EXPECT_EQ(SYNC_STATUS_OK, PopulateInitialData( |
| 1016 largest_change_id, |
| 1017 *sync_root_folder, |
| 1018 app_root_folders)); |
| 1019 |
| 1020 ResetTrackerID(&sync_root.tracker); |
| 1021 ResetTrackerID(&app_root.tracker); |
| 1022 app_root.tracker.set_parent_tracker_id(sync_root.tracker.tracker_id()); |
| 1023 |
| 1024 VerifyTrackedFiles(tracked_files, arraysize(tracked_files)); |
| 1025 VerifyReloadConsistency(); |
| 1026 } |
| 1027 |
975 } // namespace drive_backend | 1028 } // namespace drive_backend |
976 } // namespace sync_file_system | 1029 } // namespace sync_file_system |
OLD | NEW |