15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file. 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/message_loop/message_loop.h" 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "chrome/browser/sync/glue/local_device_info_provider_mock.h" 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/sync_driver/device_info_sync_service.h" 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h" 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/api/sync_change.h" 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/api/sync_change_processor.h" 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/api/sync_change_processor_wrapper_for_test.h" 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/api/sync_error_factory_mock.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "sync/util/time.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing sync_driver::DeviceInfoSyncService; 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing sync_driver::DeviceInfoTracker; 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::AttachmentIdList; 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::AttachmentServiceProxyForTest; 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::ModelType; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncChange; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncChangeList; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncChangeProcessor; 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncChangeProcessorWrapperForTest; 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncData; 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncDataList; 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncError; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncErrorFactory; 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncErrorFactoryMock; 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using syncer::SyncMergeResult; 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace browser_sync { 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace { 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class TestChangeProcessor : public SyncChangeProcessor { 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) TestChangeProcessor() {} 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~TestChangeProcessor() {} 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // SyncChangeProcessor implementation. 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Store a copy of all the changes passed in so we can examine them later. 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual SyncError ProcessSyncChanges( 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const tracked_objects::Location& from_here, 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const SyncChangeList& change_list) OVERRIDE { 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) change_list_ = change_list; 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SyncError(); 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This method isn't used in these tests. 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual SyncDataList GetAllSyncData(ModelType type) const OVERRIDE { 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SyncDataList(); 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) size_t change_list_size() const { return change_list_.size(); } 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChange::SyncChangeType change_type_at(size_t index) const { 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK_LT(index, change_list_size()); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return change_list_[index].change_type(); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const sync_pb::DeviceInfoSpecifics& device_info_at(size_t index) const { 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CHECK_LT(index, change_list_size()); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return change_list_[index].sync_data().GetSpecifics().device_info(); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& cache_guid_at(size_t index) const { 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return device_info_at(index).cache_guid(); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& client_name_at(size_t index) const { 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return device_info_at(index).client_name(); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list_; 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class DeviceInfoSyncServiceTest : public testing::Test, 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public DeviceInfoTracker::Observer { 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) DeviceInfoSyncServiceTest() : num_device_info_changed_callbacks_(0) {} 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~DeviceInfoSyncServiceTest() {} 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void SetUp() OVERRIDE { 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) local_device_.reset(new LocalDeviceInfoProviderMock( 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "guid_1", 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "client_1", 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "Chromium 10k", 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "Chrome 10k", 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::SyncEnums_DeviceType_TYPE_LINUX, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) "device_id")); 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_.reset(new DeviceInfoSyncService(local_device_.get())); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_processor_.reset(new TestChangeProcessor()); 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Register observer 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->AddObserver(this); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDown() OVERRIDE { 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->RemoveObserver(this); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnDeviceInfoChange() OVERRIDE { 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_++; 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<SyncChangeProcessor> PassProcessor() { 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scoped_ptr<SyncChangeProcessor>( 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new SyncChangeProcessorWrapperForTest(sync_processor_.get())); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<SyncErrorFactory> CreateAndPassSyncErrorFactory() { 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return scoped_ptr<SyncErrorFactory>(new SyncErrorFactoryMock()); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncData CreateRemoteData(const std::string& client_id, 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& client_name, 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int64 backup_timestamp = 0) { 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::EntitySpecifics entity; 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_pb::DeviceInfoSpecifics& specifics = *entity.mutable_device_info(); 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_cache_guid(client_id); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_client_name(client_name); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_chrome_version("Chromium 10k"); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_sync_user_agent("Chrome 10k"); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_device_type(sync_pb::SyncEnums_DeviceType_TYPE_LINUX); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) specifics.set_signin_scoped_device_id("device_id"); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (backup_timestamp != 0) { 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci specifics.set_backup_timestamp(backup_timestamp); 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return SyncData::CreateRemoteData(1, 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) entity, 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::Time(), 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AttachmentIdList(), 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AttachmentServiceProxyForTest::Create()); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddInitialData(SyncDataList& sync_data_list, 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& client_id, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& client_name) { 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncData sync_data = CreateRemoteData(client_id, client_name); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data_list.push_back(sync_data); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddChange(SyncChangeList& change_list, 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChange::SyncChangeType change_type, 1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& client_id, 1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const std::string& client_name) { 1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncData sync_data = CreateRemoteData(client_id, client_name); 1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChange sync_change(FROM_HERE, change_type, sync_data); 1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) change_list.push_back(sync_change); 1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int num_device_info_changed_callbacks_; 1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<LocalDeviceInfoProviderMock> local_device_; 1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<DeviceInfoSyncService> sync_service_; 1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<TestChangeProcessor> sync_processor_; 1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) content::TestBrowserThreadBundle thread_bundle_; 1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Sync with empty initial data. 1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, StartSyncEmptyInitialData) { 1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList(), 1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_added()); 1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_modified()); 1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_deleted()); 1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_before_association()); 1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(SyncChange::ACTION_ADD, sync_processor_->change_type_at(0)); 1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_processor_->change_list_size()); 1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Should have one device info corresponding to local device info. 1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllSyncData(syncer::DEVICE_INFO).size()); 1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllDeviceInfo().size()); 1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_1")); 1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_0")); 1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Sync with initial data matching the local device data. 1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, StartSyncMatchingInitialData) { 1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList sync_data; 1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_1", "client_1"); 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data, 1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_added()); 2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_modified()); 2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_deleted()); 2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_before_association()); 2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // No changes expected because the device info matches. 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0U, sync_processor_->change_list_size()); 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllSyncData(syncer::DEVICE_INFO).size()); 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllDeviceInfo().size()); 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_1")); 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_0")); 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Sync with misc initial data. 2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, StartSync) { 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList sync_data; 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_2", "foo"); 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_3", "bar"); 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This guid matches the local device but the client name is different. 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_1", "baz"); 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data, 2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2, merge_result.num_items_added()); 2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_modified()); 2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, merge_result.num_items_deleted()); 2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_before_association()); 2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3, merge_result.num_items_after_association()); 2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_processor_->change_list_size()); 2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); 2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("client_1", sync_processor_->client_name_at(0)); 2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3U, sync_service_->GetAllSyncData(syncer::DEVICE_INFO).size()); 2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3U, sync_service_->GetAllDeviceInfo().size()); 2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_1")); 2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_2")); 2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_3")); 2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_0")); 2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process sync change with ACTION_ADD. 2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Verify callback. 2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessAddChange) { 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, num_device_info_changed_callbacks_); 2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Start with an empty initial data. 2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList(), 2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // There should be only one item corresponding to the local device 2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, num_device_info_changed_callbacks_); 2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Add a new device info with a non-matching guid. 2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_ADD, "guid_2", "foo"); 2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2, num_device_info_changed_callbacks_); 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2U, sync_service_->GetAllDeviceInfo().size()); 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_1")); 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(sync_service_->GetDeviceInfo("guid_2")); 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_0")); 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process multiple sync change with ACTION_UPDATE and ACTION_ADD. 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Verify that callback is called multiple times. 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessMultipleChanges) { 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList sync_data; 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_2", "foo"); 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_3", "bar"); 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data, 2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3, merge_result.num_items_after_association()); 2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reset callbacks counter 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_ = 0; 2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_UPDATE, "guid_2", "foo_2"); 2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, num_device_info_changed_callbacks_); 3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3U, sync_service_->GetAllDeviceInfo().size()); 3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("foo_2", sync_service_->GetDeviceInfo("guid_2")->client_name()); 3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) change_list.clear(); 3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_UPDATE, "guid_3", "bar_3"); 3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_ADD, "guid_4", "baz_4"); 3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2, num_device_info_changed_callbacks_); 3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(4U, sync_service_->GetAllDeviceInfo().size()); 3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("bar_3", sync_service_->GetDeviceInfo("guid_3")->client_name()); 3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("baz_4", sync_service_->GetDeviceInfo("guid_4")->client_name()); 3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process update to the local device info and verify that it is ignored. 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessUpdateChangeMatchingLocalDevice) { 3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList(), 3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reset callbacks counter 3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_ = 0; 3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_UPDATE, "guid_1", "foo_1"); 3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Callback shouldn't be sent in this case. 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, num_device_info_changed_callbacks_); 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Should still have the old local device Info. 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllDeviceInfo().size()); 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ("client_1", sync_service_->GetDeviceInfo("guid_1")->client_name()); 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process sync change with ACTION_DELETE. 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessDeleteChange) { 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList sync_data; 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_2", "foo"); 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddInitialData(sync_data, "guid_3", "bar"); 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_data, 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(3, merge_result.num_items_after_association()); 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reset callbacks counter 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_ = 0; 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_DELETE, "guid_2", "foo_2"); 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, num_device_info_changed_callbacks_); 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(2U, sync_service_->GetAllDeviceInfo().size()); 3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(sync_service_->GetDeviceInfo("guid_2")); 3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process sync change with unexpected action. 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessInvalidChange) { 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList(), 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reset callbacks counter 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_ = 0; 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, (SyncChange::SyncChangeType)100, "guid_2", "foo_2"); 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(error.IsSet()); 3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The number of callback should still be zero. 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, num_device_info_changed_callbacks_); 3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1U, sync_service_->GetAllDeviceInfo().size()); 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Process sync change after unsubscribing from notifications. 3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(DeviceInfoSyncServiceTest, ProcessChangesAfterUnsubscribing) { 3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncMergeResult merge_result = 3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncDataList(), 3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) PassProcessor(), 3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) CreateAndPassSyncErrorFactory()); 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(1, merge_result.num_items_after_association()); 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // reset callbacks counter 3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) num_device_info_changed_callbacks_ = 0; 3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncChangeList change_list; 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AddChange(change_list, SyncChange::ACTION_ADD, "guid_2", "foo_2"); 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Unsubscribe observer before processing changes. 4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) sync_service_->RemoveObserver(this); 4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SyncError error = sync_service_->ProcessSyncChanges(FROM_HERE, change_list); 4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(error.IsSet()); 4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The number of callback should still be zero. 4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(0, num_device_info_changed_callbacks_); 4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies setting backup timestamp after the initial sync. 4121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceInfoSyncServiceTest, UpdateLocalDeviceBackupTime) { 4131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Shouldn't have backuptime initially. 4141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time backup_time = sync_service_->GetLocalDeviceBackupTime(); 4151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(backup_time.is_null()); 4161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Perform the initial sync with empty data. 4181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncMergeResult merge_result = 4191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 4201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncDataList(), 4211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PassProcessor(), 4221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndPassSyncErrorFactory()); 4231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should have local device after the initial sync. 4251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, sync_processor_->change_list_size()); 4261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(SyncChange::ACTION_ADD, sync_processor_->change_type_at(0)); 4271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Shouldn't have backup time initially. 4291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 4301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(sync_processor_->device_info_at(0).has_backup_timestamp()); 4311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(1000)); 4331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should have local device info updated with the specified backup timestamp. 4351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, sync_processor_->change_list_size()); 4361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); 4371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 4381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(sync_processor_->device_info_at(0).has_backup_timestamp()); 4391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = syncer::ProtoTimeToTime( 4411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_processor_->device_info_at(0).backup_timestamp()); 4421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1000, backup_time.ToTimeT()); 4431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Also verify that we get the same backup time directly from the service. 4451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = sync_service_->GetLocalDeviceBackupTime(); 4461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1000, backup_time.ToTimeT()); 4471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies setting backup timestamp prior to the initial sync. 4501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceInfoSyncServiceTest, UpdateLocalDeviceBackupTimeBeforeSync) { 4511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set the backup timestamp. 4521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(2000)); 4531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify that we get it back. 4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time backup_time = sync_service_->GetLocalDeviceBackupTime(); 4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2000, backup_time.ToTimeT()); 4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Now perform the initial sync with empty data. 4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncMergeResult merge_result = 4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncDataList(), 4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PassProcessor(), 4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndPassSyncErrorFactory()); 4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should have local device after the initial sync. 4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should have the backup timestamp set. 4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, sync_processor_->change_list_size()); 4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(SyncChange::ACTION_ADD, sync_processor_->change_type_at(0)); 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(sync_processor_->device_info_at(0).has_backup_timestamp()); 4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = syncer::ProtoTimeToTime( 4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_processor_->device_info_at(0).backup_timestamp()); 4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(2000, backup_time.ToTimeT()); 4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that the backup timestamp that comes in the intial sync data 4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// gets preserved when there are no changes to the local device. 4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceInfoSyncServiceTest, PreserveBackupTimeWithMatchingLocalDevice) { 4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time backup_time = base::Time::FromTimeT(3000); 4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncDataList sync_data; 4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data.push_back(CreateRemoteData( 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "guid_1", "client_1", syncer::TimeToProtoTime(backup_time))); 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncMergeResult merge_result = 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data, 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PassProcessor(), 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndPassSyncErrorFactory()); 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Everything is matching so there should be no updates. 4911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(0U, sync_processor_->change_list_size()); 4921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Verify that we get back the same time. 4941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = sync_service_->GetLocalDeviceBackupTime(); 4951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(3000, backup_time.ToTimeT()); 4961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 4971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that the backup timestamp that comes in the intial sync data 4991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// gets merged with the local device data. 5001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceInfoSyncServiceTest, MergeBackupTimeWithMatchingLocalDevice) { 5011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time backup_time = base::Time::FromTimeT(4000); 5021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncDataList sync_data; 5031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data.push_back(CreateRemoteData( 5041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "guid_1", "foo_1", syncer::TimeToProtoTime(backup_time))); 5051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncMergeResult merge_result = 5071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 5081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data, 5091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PassProcessor(), 5101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndPassSyncErrorFactory()); 5111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should be one change because of the client name mismatch. 5131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // However the backup time passed in the initial data should be merged into 5141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // the change. 5151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, sync_processor_->change_list_size()); 5161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); 5181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 5191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("client_1", sync_processor_->client_name_at(0)); 5201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = syncer::ProtoTimeToTime( 5221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_processor_->device_info_at(0).backup_timestamp()); 5231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(4000, backup_time.ToTimeT()); 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Verifies that mismatching backup timestamp generates an update even 5271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// when the rest of local device data is matching. 5281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(DeviceInfoSyncServiceTest, 5291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci MergeMismatchingBackupTimeWithMatchingLocalDevice) { 5301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Time backup_time = base::Time::FromTimeT(5000); 5311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncDataList sync_data; 5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data.push_back(CreateRemoteData( 5331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci "guid_1", "client_1", syncer::TimeToProtoTime(backup_time))); 5341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set the backup timestamp different than the one in the sync data. 5361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->UpdateLocalDeviceBackupTime(base::Time::FromTimeT(6000)); 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SyncMergeResult merge_result = 5391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_service_->MergeDataAndStartSyncing(syncer::DEVICE_INFO, 5401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_data, 5411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci PassProcessor(), 5421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci CreateAndPassSyncErrorFactory()); 5431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Should generate and update due to timestamp mismatch. 5451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The locally set timestamp wins. 5461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(1U, sync_processor_->change_list_size()); 5471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(SyncChange::ACTION_UPDATE, sync_processor_->change_type_at(0)); 5491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("guid_1", sync_processor_->cache_guid_at(0)); 5501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ("client_1", sync_processor_->client_name_at(0)); 5511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci backup_time = syncer::ProtoTimeToTime( 5531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci sync_processor_->device_info_at(0).backup_timestamp()); 5541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_EQ(6000, backup_time.ToTimeT()); 5551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 5561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace 5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} // namespace browser_sync 560