Index: chrome/browser/sync/glue/device_info_sync_service_unittest.cc |
diff --git a/chrome/browser/sync/glue/device_info_sync_service_unittest.cc b/chrome/browser/sync/glue/device_info_sync_service_unittest.cc |
index 6fe3a8ee61947e1da28ef3ab8bd7e54c36b13854..edf4e51c8bd79c35e8be49cf8f803b9f884c6f21 100644 |
--- a/chrome/browser/sync/glue/device_info_sync_service_unittest.cc |
+++ b/chrome/browser/sync/glue/device_info_sync_service_unittest.cc |
@@ -11,6 +11,7 @@ |
#include "sync/api/sync_change_processor_wrapper_for_test.h" |
#include "sync/api/sync_error_factory_mock.h" |
#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" |
+#include "sync/util/time.h" |
#include "testing/gtest/include/gtest/gtest.h" |
using syncer::AttachmentIdList; |
@@ -112,7 +113,8 @@ class DeviceInfoSyncServiceTest : public testing::Test, |
} |
SyncData CreateRemoteData(const std::string& client_id, |
- const std::string& client_name) { |
+ const std::string& client_name, |
+ int64 backup_timestamp = 0) { |
sync_pb::EntitySpecifics entity; |
sync_pb::DeviceInfoSpecifics& specifics = *entity.mutable_device_info(); |
@@ -123,6 +125,10 @@ class DeviceInfoSyncServiceTest : public testing::Test, |
specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); |
specifics.set_signin_scoped_device_id("device_id"); |
+ if (backup_timestamp != 0) { |
+ specifics.set_backup_timestamp(backup_timestamp); |
+ } |
+ |
return SyncData::CreateRemoteData(1, |
entity, |
base::Time(), |
@@ -400,6 +406,152 @@ TEST_F(DeviceInfoSyncServiceTest, ProcessChangesAfterUnsubscribing) { |
EXPECT_EQ(0, num_device_info_changed_callbacks_); |
} |
+// Verifies setting backup timestamp after the initial sync. |
+TEST_F(DeviceInfoSyncServiceTest, UpdateLocalDeviceBackupTime) { |
+ // Shouldn't have backuptime initially. |
+ base::Time backup_time = sync_service_->GetLocalDeviceBackupTime(); |
+ EXPECT_TRUE(backup_time.is_null()); |
+ |
+ // Perform the initial sync with empty data. |
+ SyncMergeResult merge_result = |
+ sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, |
+ SyncDataList(), |
+ PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ // Should have local device after the initial sync. |
+ EXPECT_EQ(1U, sync_processor_->change_list_size()); |
+ EXPECT_EQ(SyncChange::ACTION_ADD, sync_processor_->change_type_at(0)); |
+ |
+ // Shouldn't have backup time initially. |
+ EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); |
+ EXPECT_FALSE(sync_processor_->device_info_at(0).has_backup_timestamp()); |
+ |
+ sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(1000)); |
+ |
+ // Should have local device info updated with the specified backup timestamp. |
+ EXPECT_EQ(1U, sync_processor_->change_list_size()); |
+ EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); |
+ EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); |
+ EXPECT_TRUE(sync_processor_->device_info_at(0).has_backup_timestamp()); |
+ |
+ backup_time = syncer::ProtoTimeToTime( |
+ sync_processor_->device_info_at(0).backup_timestamp()); |
+ EXPECT_EQ(1000, backup_time.ToTimeT()); |
+ |
+ // Also verify that we get the same backup time directly from the service. |
+ backup_time = sync_service_->GetLocalDeviceBackupTime(); |
+ EXPECT_EQ(1000, backup_time.ToTimeT()); |
+} |
+ |
+// Verifies setting backup timestamp prior to the initial sync. |
+TEST_F(DeviceInfoSyncServiceTest, UpdateLocalDeviceBackupTimeBeforeSync) { |
+ // Set the backup timestamp. |
+ sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(2000)); |
+ // Verify that we get it back. |
+ base::Time backup_time = sync_service_->GetLocalDeviceBackupTime(); |
+ EXPECT_EQ(2000, backup_time.ToTimeT()); |
+ |
+ // Now perform the initial sync with empty data. |
+ SyncMergeResult merge_result = |
+ sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, |
+ SyncDataList(), |
+ PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ // Should have local device after the initial sync. |
+ // Should have the backup timestamp set. |
+ EXPECT_EQ(1U, sync_processor_->change_list_size()); |
+ EXPECT_EQ(SyncChange::ACTION_ADD, sync_processor_->change_type_at(0)); |
+ EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); |
+ EXPECT_TRUE(sync_processor_->device_info_at(0).has_backup_timestamp()); |
+ |
+ backup_time = syncer::ProtoTimeToTime( |
+ sync_processor_->device_info_at(0).backup_timestamp()); |
+ EXPECT_EQ(2000, backup_time.ToTimeT()); |
+} |
+ |
+// Verifies that the backup timestamp that comes in the intial sync data |
+// gets preserved when there are no changes to the local device. |
+TEST_F(DeviceInfoSyncServiceTest, PreserveBackupTimeWithMatchingLocalDevice) { |
+ base::Time backup_time = base::Time::FromTimeT(3000); |
+ SyncDataList sync_data; |
+ sync_data.push_back(CreateRemoteData( |
+ "guid_1", "client_1", syncer::TimeToProtoTime(backup_time))); |
+ |
+ SyncMergeResult merge_result = |
+ sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, |
+ sync_data, |
+ PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ // Everything is matching so there should be no updates. |
+ EXPECT_EQ(0U, sync_processor_->change_list_size()); |
+ |
+ // Verify that we get back the same time. |
+ backup_time = sync_service_->GetLocalDeviceBackupTime(); |
+ EXPECT_EQ(3000, backup_time.ToTimeT()); |
+} |
+ |
+// Verifies that the backup timestamp that comes in the intial sync data |
+// gets merged with the local device data. |
+TEST_F(DeviceInfoSyncServiceTest, MergeBackupTimeWithMatchingLocalDevice) { |
+ base::Time backup_time = base::Time::FromTimeT(4000); |
+ SyncDataList sync_data; |
+ sync_data.push_back(CreateRemoteData( |
+ "guid_1", "foo_1", syncer::TimeToProtoTime(backup_time))); |
+ |
+ SyncMergeResult merge_result = |
+ sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, |
+ sync_data, |
+ PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ // Should be one change because of the client name mismatch. |
+ // However the backup time passed in the initial data should be merged into |
+ // the change. |
+ EXPECT_EQ(1U, sync_processor_->change_list_size()); |
+ |
+ EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); |
+ EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); |
+ EXPECT_EQ("client_1", sync_processor_->client_name_at(0)); |
+ |
+ backup_time = syncer::ProtoTimeToTime( |
+ sync_processor_->device_info_at(0).backup_timestamp()); |
+ EXPECT_EQ(4000, backup_time.ToTimeT()); |
+} |
+ |
+// Verifies that mismatching backup timestamp generates an update even |
+// when the rest of local device data is matching. |
+TEST_F(DeviceInfoSyncServiceTest, |
+ MergeMismatchingBackupTimeWithMatchingLocalDevice) { |
+ base::Time backup_time = base::Time::FromTimeT(5000); |
+ SyncDataList sync_data; |
+ sync_data.push_back(CreateRemoteData( |
+ "guid_1", "client_1", syncer::TimeToProtoTime(backup_time))); |
+ |
+ // Set the backup timestamp different than the one in the sync data. |
+ sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(6000)); |
+ |
+ SyncMergeResult merge_result = |
+ sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, |
+ sync_data, |
+ PassProcessor(), |
+ CreateAndPassSyncErrorFactory()); |
+ |
+ // Should generate and update due to timestamp mismatch. |
+ // The locally set timestamp wins. |
+ EXPECT_EQ(1U, sync_processor_->change_list_size()); |
+ |
+ EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); |
+ EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); |
+ EXPECT_EQ("client_1", sync_processor_->client_name_at(0)); |
+ |
+ backup_time = syncer::ProtoTimeToTime( |
+ sync_processor_->device_info_at(0).backup_timestamp()); |
+ EXPECT_EQ(6000, backup_time.ToTimeT()); |
+} |
+ |
} // namespace |
} // namespace browser_sync |