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